@delon/abc 15.2.1 → 16.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/auto-focus/auto-focus.directive.d.ts +1 -1
- package/avatar-list/avatar-list-item.component.d.ts +1 -1
- package/avatar-list/avatar-list.component.d.ts +1 -1
- package/count-down/count-down.component.d.ts +1 -1
- package/date-picker/range.directive.d.ts +1 -1
- package/down-file/down-file.directive.d.ts +1 -1
- package/ellipsis/ellipsis.component.d.ts +1 -1
- package/error-collect/error-collect.component.d.ts +1 -1
- package/esm2022/auto-focus/auto-focus.directive.mjs +51 -0
- package/esm2022/auto-focus/auto-focus.module.mjs +18 -0
- package/esm2022/avatar-list/avatar-list-item.component.mjs +27 -0
- package/esm2022/avatar-list/avatar-list.component.mjs +89 -0
- package/esm2022/avatar-list/avatar-list.module.mjs +23 -0
- package/esm2022/count-down/count-down.component.mjs +46 -0
- package/esm2022/count-down/count-down.module.mjs +21 -0
- package/esm2022/date-picker/date-picker.module.mjs +23 -0
- package/esm2022/date-picker/range-shortcut.component.mjs +41 -0
- package/esm2022/date-picker/range.directive.mjs +174 -0
- package/esm2022/down-file/down-file.directive.mjs +115 -0
- package/esm2022/down-file/down-file.module.mjs +21 -0
- package/esm2022/ellipsis/ellipsis.component.mjs +233 -0
- package/esm2022/ellipsis/ellipsis.module.mjs +22 -0
- package/esm2022/error-collect/error-collect.component.mjs +122 -0
- package/esm2022/error-collect/error-collect.module.mjs +21 -0
- package/esm2022/exception/exception.component.mjs +109 -0
- package/esm2022/exception/exception.module.mjs +24 -0
- package/esm2022/footer-toolbar/footer-toolbar.component.mjs +45 -0
- package/esm2022/footer-toolbar/footer-toolbar.module.mjs +22 -0
- package/esm2022/full-content/full-content-toggle.directive.mjs +25 -0
- package/esm2022/full-content/full-content.component.mjs +140 -0
- package/esm2022/full-content/full-content.module.mjs +21 -0
- package/esm2022/full-content/full-content.service.mjs +23 -0
- package/esm2022/global-footer/global-footer-item.component.mjs +31 -0
- package/esm2022/global-footer/global-footer.component.mjs +73 -0
- package/esm2022/global-footer/global-footer.module.mjs +22 -0
- package/esm2022/hotkey/hotkey.directive.mjs +37 -0
- package/esm2022/hotkey/hotkey.module.mjs +18 -0
- package/esm2022/let/let.directive.mjs +38 -0
- package/esm2022/let/let.module.mjs +18 -0
- package/esm2022/loading/loading.component.mjs +27 -0
- package/esm2022/loading/loading.module.mjs +24 -0
- package/esm2022/loading/loading.service.mjs +91 -0
- package/esm2022/lodop/lodop.module.mjs +13 -0
- package/esm2022/lodop/lodop.service.mjs +223 -0
- package/esm2022/media/media.component.mjs +118 -0
- package/esm2022/media/media.module.mjs +20 -0
- package/esm2022/media/media.service.mjs +47 -0
- package/esm2022/notice-icon/notice-icon-tab.component.mjs +35 -0
- package/esm2022/notice-icon/notice-icon.component.mjs +90 -0
- package/esm2022/notice-icon/notice-icon.module.mjs +59 -0
- package/esm2022/observers/observer-size.mjs +119 -0
- package/esm2022/onboarding/onboarding.component.mjs +135 -0
- package/esm2022/onboarding/onboarding.module.mjs +27 -0
- package/esm2022/onboarding/onboarding.service.mjs +186 -0
- package/esm2022/page-header/page-header.component.mjs +247 -0
- package/esm2022/page-header/page-header.module.mjs +25 -0
- package/esm2022/pdf/pdf.component.mjs +474 -0
- package/{esm2020 → esm2022}/pdf/pdf.config.mjs +2 -2
- package/esm2022/pdf/pdf.module.mjs +21 -0
- package/esm2022/qr/qr.component.mjs +137 -0
- package/esm2022/qr/qr.module.mjs +20 -0
- package/esm2022/quick-menu/quick-menu.component.mjs +90 -0
- package/esm2022/quick-menu/quick-menu.module.mjs +22 -0
- package/esm2022/result/result.component.mjs +61 -0
- package/esm2022/result/result.module.mjs +22 -0
- package/esm2022/reuse-tab/reuse-tab-context-menu.component.mjs +77 -0
- package/esm2022/reuse-tab/reuse-tab-context.component.mjs +34 -0
- package/esm2022/reuse-tab/reuse-tab-context.directive.mjs +36 -0
- package/esm2022/reuse-tab/reuse-tab-context.service.mjs +56 -0
- package/esm2022/reuse-tab/reuse-tab.component.mjs +368 -0
- package/esm2022/reuse-tab/reuse-tab.module.mjs +50 -0
- package/esm2022/reuse-tab/reuse-tab.service.mjs +559 -0
- package/esm2022/se/se-container.component.mjs +174 -0
- package/esm2022/se/se.component.mjs +235 -0
- package/esm2022/se/se.module.mjs +24 -0
- package/esm2022/sg/sg-container.component.mjs +53 -0
- package/esm2022/sg/sg.component.mjs +68 -0
- package/esm2022/sg/sg.module.mjs +21 -0
- package/esm2022/st/st-column-source.mjs +493 -0
- package/esm2022/st/st-data-source.mjs +480 -0
- package/esm2022/st/st-export.mjs +90 -0
- package/{esm2020 → esm2022}/st/st-filter.component.mjs +8 -7
- package/esm2022/st/st-row.directive.mjs +47 -0
- package/esm2022/st/st-widget-host.directive.mjs +32 -0
- package/esm2022/st/st-widget.mjs +27 -0
- package/esm2022/st/st.component.mjs +1004 -0
- package/esm2022/st/st.module.mjs +97 -0
- package/esm2022/sv/sv-container.component.mjs +127 -0
- package/esm2022/sv/sv-value.component.mjs +45 -0
- package/esm2022/sv/sv.component.mjs +120 -0
- package/esm2022/sv/sv.module.mjs +26 -0
- package/esm2022/tag-select/tag-select.component.mjs +64 -0
- package/esm2022/tag-select/tag-select.module.mjs +22 -0
- package/esm2022/xlsx/xlsx.directive.mjs +28 -0
- package/esm2022/xlsx/xlsx.module.mjs +20 -0
- package/esm2022/xlsx/xlsx.service.mjs +129 -0
- package/esm2022/zip/zip.module.mjs +16 -0
- package/esm2022/zip/zip.service.mjs +117 -0
- package/exception/exception.component.d.ts +1 -1
- package/{fesm2015 → fesm2022}/auto-focus.mjs +7 -7
- package/{fesm2015 → fesm2022}/auto-focus.mjs.map +1 -1
- package/{fesm2020 → fesm2022}/avatar-list.mjs +10 -10
- package/fesm2022/avatar-list.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/chart-observer-size.mjs +10 -10
- package/fesm2022/chart-observer-size.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/count-down.mjs +7 -7
- package/fesm2022/count-down.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/date-picker.mjs +14 -13
- package/fesm2022/date-picker.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/down-file.mjs +8 -8
- package/fesm2022/down-file.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/ellipsis.mjs +7 -7
- package/fesm2022/ellipsis.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/error-collect.mjs +9 -9
- package/fesm2022/error-collect.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/exception.mjs +7 -7
- package/fesm2022/exception.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/footer-toolbar.mjs +7 -7
- package/fesm2022/footer-toolbar.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/full-content.mjs +13 -13
- package/fesm2022/full-content.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/global-footer.mjs +10 -10
- package/fesm2022/global-footer.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/hotkey.mjs +7 -7
- package/{fesm2015 → fesm2022}/hotkey.mjs.map +1 -1
- package/{fesm2020 → fesm2022}/let.mjs +9 -8
- package/fesm2022/let.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/loading.mjs +10 -11
- package/fesm2022/loading.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/lodop.mjs +7 -7
- package/{fesm2020 → fesm2022}/lodop.mjs.map +1 -1
- package/{fesm2020 → fesm2022}/media.mjs +10 -10
- package/fesm2022/media.mjs.map +1 -0
- package/fesm2022/notice-icon.mjs +180 -0
- package/fesm2022/notice-icon.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/onboarding.mjs +10 -11
- package/{fesm2020 → fesm2022}/onboarding.mjs.map +1 -1
- package/{fesm2020 → fesm2022}/page-header.mjs +7 -7
- package/{fesm2015 → fesm2022}/page-header.mjs.map +1 -1
- package/{fesm2020 → fesm2022}/pdf.mjs +10 -10
- package/fesm2022/pdf.mjs.map +1 -0
- package/{fesm2015 → fesm2022}/qr.mjs +7 -7
- package/{fesm2020 → fesm2022}/qr.mjs.map +1 -1
- package/{fesm2020 → fesm2022}/quick-menu.mjs +7 -7
- package/fesm2022/quick-menu.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/result.mjs +7 -7
- package/{fesm2020 → fesm2022}/result.mjs.map +1 -1
- package/{fesm2020 → fesm2022}/reuse-tab.mjs +31 -31
- package/{fesm2015 → fesm2022}/reuse-tab.mjs.map +1 -1
- package/{fesm2020 → fesm2022}/se.mjs +15 -15
- package/fesm2022/se.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/sg.mjs +10 -10
- package/fesm2022/sg.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/st.mjs +72 -72
- package/fesm2022/st.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/sv.mjs +20 -20
- package/fesm2022/sv.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/tag-select.mjs +7 -7
- package/fesm2022/tag-select.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/xlsx.mjs +10 -10
- package/fesm2022/xlsx.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/zip.mjs +7 -7
- package/{fesm2015 → fesm2022}/zip.mjs.map +1 -1
- package/footer-toolbar/footer-toolbar.component.d.ts +1 -1
- package/full-content/full-content.component.d.ts +1 -1
- package/global-footer/global-footer-item.component.d.ts +1 -1
- package/global-footer/global-footer.component.d.ts +1 -1
- package/hotkey/hotkey.directive.d.ts +1 -1
- package/let/let.directive.d.ts +1 -1
- package/loading/style/index.less +1 -4
- package/media/media.component.d.ts +1 -1
- package/notice-icon/notice-icon-tab.component.d.ts +1 -1
- package/notice-icon/notice-icon.component.d.ts +1 -1
- package/onboarding/style/index.less +1 -4
- package/package.json +106 -176
- package/page-header/page-header.component.d.ts +1 -1
- package/pdf/pdf.component.d.ts +1 -1
- package/qr/qr.component.d.ts +1 -1
- package/quick-menu/quick-menu.component.d.ts +1 -1
- package/result/result.component.d.ts +1 -1
- package/reuse-tab/reuse-tab-context-menu.component.d.ts +1 -1
- package/reuse-tab/reuse-tab-context.component.d.ts +1 -1
- package/reuse-tab/reuse-tab-context.directive.d.ts +1 -1
- package/reuse-tab/reuse-tab.component.d.ts +1 -1
- package/se/se-container.component.d.ts +1 -1
- package/se/se.component.d.ts +1 -1
- package/sg/sg-container.component.d.ts +1 -1
- package/sg/sg.component.d.ts +1 -1
- package/st/st-filter.component.d.ts +1 -1
- package/st/st-row.directive.d.ts +1 -1
- package/st/st-widget-host.directive.d.ts +1 -1
- package/st/st.component.d.ts +9 -5
- package/st/style/index.less +6 -2
- package/sv/sv-container.component.d.ts +1 -1
- package/sv/sv-value.component.d.ts +1 -1
- package/sv/sv.component.d.ts +1 -1
- package/tag-select/tag-select.component.d.ts +1 -1
- package/xlsx/xlsx.directive.d.ts +1 -1
- package/esm2020/auto-focus/auto-focus.directive.mjs +0 -50
- package/esm2020/auto-focus/auto-focus.module.mjs +0 -17
- package/esm2020/avatar-list/avatar-list-item.component.mjs +0 -26
- package/esm2020/avatar-list/avatar-list.component.mjs +0 -88
- package/esm2020/avatar-list/avatar-list.module.mjs +0 -22
- package/esm2020/count-down/count-down.component.mjs +0 -45
- package/esm2020/count-down/count-down.module.mjs +0 -20
- package/esm2020/date-picker/date-picker.module.mjs +0 -22
- package/esm2020/date-picker/range-shortcut.component.mjs +0 -40
- package/esm2020/date-picker/range.directive.mjs +0 -172
- package/esm2020/down-file/down-file.directive.mjs +0 -114
- package/esm2020/down-file/down-file.module.mjs +0 -20
- package/esm2020/ellipsis/ellipsis.component.mjs +0 -232
- package/esm2020/ellipsis/ellipsis.module.mjs +0 -21
- package/esm2020/error-collect/error-collect.component.mjs +0 -121
- package/esm2020/error-collect/error-collect.module.mjs +0 -20
- package/esm2020/exception/exception.component.mjs +0 -108
- package/esm2020/exception/exception.module.mjs +0 -23
- package/esm2020/footer-toolbar/footer-toolbar.component.mjs +0 -44
- package/esm2020/footer-toolbar/footer-toolbar.module.mjs +0 -21
- package/esm2020/full-content/full-content-toggle.directive.mjs +0 -24
- package/esm2020/full-content/full-content.component.mjs +0 -139
- package/esm2020/full-content/full-content.module.mjs +0 -20
- package/esm2020/full-content/full-content.service.mjs +0 -22
- package/esm2020/global-footer/global-footer-item.component.mjs +0 -30
- package/esm2020/global-footer/global-footer.component.mjs +0 -72
- package/esm2020/global-footer/global-footer.module.mjs +0 -21
- package/esm2020/hotkey/hotkey.directive.mjs +0 -36
- package/esm2020/hotkey/hotkey.module.mjs +0 -17
- package/esm2020/let/let.directive.mjs +0 -36
- package/esm2020/let/let.module.mjs +0 -17
- package/esm2020/loading/loading.component.mjs +0 -26
- package/esm2020/loading/loading.module.mjs +0 -24
- package/esm2020/loading/loading.service.mjs +0 -90
- package/esm2020/lodop/lodop.module.mjs +0 -12
- package/esm2020/lodop/lodop.service.mjs +0 -222
- package/esm2020/media/media.component.mjs +0 -117
- package/esm2020/media/media.module.mjs +0 -19
- package/esm2020/media/media.service.mjs +0 -46
- package/esm2020/notice-icon/notice-icon-tab.component.mjs +0 -34
- package/esm2020/notice-icon/notice-icon.component.mjs +0 -89
- package/esm2020/notice-icon/notice-icon.module.mjs +0 -58
- package/esm2020/observers/observer-size.mjs +0 -116
- package/esm2020/onboarding/onboarding.component.mjs +0 -134
- package/esm2020/onboarding/onboarding.module.mjs +0 -27
- package/esm2020/onboarding/onboarding.service.mjs +0 -185
- package/esm2020/page-header/page-header.component.mjs +0 -246
- package/esm2020/page-header/page-header.module.mjs +0 -24
- package/esm2020/pdf/pdf.component.mjs +0 -473
- package/esm2020/pdf/pdf.module.mjs +0 -20
- package/esm2020/qr/qr.component.mjs +0 -136
- package/esm2020/qr/qr.module.mjs +0 -19
- package/esm2020/quick-menu/quick-menu.component.mjs +0 -89
- package/esm2020/quick-menu/quick-menu.module.mjs +0 -21
- package/esm2020/result/result.component.mjs +0 -60
- package/esm2020/result/result.module.mjs +0 -21
- package/esm2020/reuse-tab/reuse-tab-context-menu.component.mjs +0 -76
- package/esm2020/reuse-tab/reuse-tab-context.component.mjs +0 -33
- package/esm2020/reuse-tab/reuse-tab-context.directive.mjs +0 -35
- package/esm2020/reuse-tab/reuse-tab-context.service.mjs +0 -55
- package/esm2020/reuse-tab/reuse-tab.component.mjs +0 -367
- package/esm2020/reuse-tab/reuse-tab.module.mjs +0 -49
- package/esm2020/reuse-tab/reuse-tab.service.mjs +0 -558
- package/esm2020/se/se-container.component.mjs +0 -172
- package/esm2020/se/se.component.mjs +0 -234
- package/esm2020/se/se.module.mjs +0 -23
- package/esm2020/sg/sg-container.component.mjs +0 -52
- package/esm2020/sg/sg.component.mjs +0 -67
- package/esm2020/sg/sg.module.mjs +0 -20
- package/esm2020/st/st-column-source.mjs +0 -492
- package/esm2020/st/st-data-source.mjs +0 -479
- package/esm2020/st/st-export.mjs +0 -89
- package/esm2020/st/st-row.directive.mjs +0 -45
- package/esm2020/st/st-widget-host.directive.mjs +0 -31
- package/esm2020/st/st-widget.mjs +0 -26
- package/esm2020/st/st.component.mjs +0 -1002
- package/esm2020/st/st.module.mjs +0 -96
- package/esm2020/sv/sv-container.component.mjs +0 -125
- package/esm2020/sv/sv-value.component.mjs +0 -44
- package/esm2020/sv/sv.component.mjs +0 -119
- package/esm2020/sv/sv.module.mjs +0 -25
- package/esm2020/tag-select/tag-select.component.mjs +0 -63
- package/esm2020/tag-select/tag-select.module.mjs +0 -21
- package/esm2020/xlsx/xlsx.directive.mjs +0 -27
- package/esm2020/xlsx/xlsx.module.mjs +0 -19
- package/esm2020/xlsx/xlsx.service.mjs +0 -128
- package/esm2020/zip/zip.module.mjs +0 -15
- package/esm2020/zip/zip.service.mjs +0 -116
- package/fesm2015/avatar-list.mjs +0 -139
- package/fesm2015/avatar-list.mjs.map +0 -1
- package/fesm2015/chart-observer-size.mjs +0 -124
- package/fesm2015/chart-observer-size.mjs.map +0 -1
- package/fesm2015/count-down.mjs +0 -69
- package/fesm2015/count-down.mjs.map +0 -1
- package/fesm2015/date-picker.mjs +0 -236
- package/fesm2015/date-picker.mjs.map +0 -1
- package/fesm2015/down-file.mjs +0 -141
- package/fesm2015/down-file.mjs.map +0 -1
- package/fesm2015/ellipsis.mjs +0 -258
- package/fesm2015/ellipsis.mjs.map +0 -1
- package/fesm2015/error-collect.mjs +0 -147
- package/fesm2015/error-collect.mjs.map +0 -1
- package/fesm2015/exception.mjs +0 -138
- package/fesm2015/exception.mjs.map +0 -1
- package/fesm2015/footer-toolbar.mjs +0 -70
- package/fesm2015/footer-toolbar.mjs.map +0 -1
- package/fesm2015/full-content.mjs +0 -202
- package/fesm2015/full-content.mjs.map +0 -1
- package/fesm2015/global-footer.mjs +0 -126
- package/fesm2015/global-footer.mjs.map +0 -1
- package/fesm2015/hotkey.mjs +0 -57
- package/fesm2015/let.mjs +0 -59
- package/fesm2015/let.mjs.map +0 -1
- package/fesm2015/loading.mjs +0 -142
- package/fesm2015/loading.mjs.map +0 -1
- package/fesm2015/lodop.mjs +0 -232
- package/fesm2015/lodop.mjs.map +0 -1
- package/fesm2015/media.mjs +0 -180
- package/fesm2015/media.mjs.map +0 -1
- package/fesm2015/notice-icon.mjs +0 -180
- package/fesm2015/notice-icon.mjs.map +0 -1
- package/fesm2015/onboarding.mjs +0 -336
- package/fesm2015/onboarding.mjs.map +0 -1
- package/fesm2015/page-header.mjs +0 -276
- package/fesm2015/pdf.mjs +0 -516
- package/fesm2015/pdf.mjs.map +0 -1
- package/fesm2015/qr.mjs.map +0 -1
- package/fesm2015/quick-menu.mjs +0 -114
- package/fesm2015/quick-menu.mjs.map +0 -1
- package/fesm2015/result.mjs +0 -88
- package/fesm2015/result.mjs.map +0 -1
- package/fesm2015/reuse-tab.mjs +0 -1217
- package/fesm2015/se.mjs +0 -444
- package/fesm2015/se.mjs.map +0 -1
- package/fesm2015/sg.mjs +0 -139
- package/fesm2015/sg.mjs.map +0 -1
- package/fesm2015/st.mjs +0 -2526
- package/fesm2015/st.mjs.map +0 -1
- package/fesm2015/sv.mjs +0 -308
- package/fesm2015/sv.mjs.map +0 -1
- package/fesm2015/tag-select.mjs +0 -91
- package/fesm2015/tag-select.mjs.map +0 -1
- package/fesm2015/xlsx.mjs +0 -172
- package/fesm2015/xlsx.mjs.map +0 -1
- package/fesm2015/zip.mjs +0 -136
- package/fesm2020/abc.mjs +0 -7
- package/fesm2020/abc.mjs.map +0 -1
- package/fesm2020/auto-focus.mjs +0 -71
- package/fesm2020/auto-focus.mjs.map +0 -1
- package/fesm2020/avatar-list.mjs.map +0 -1
- package/fesm2020/chart-observer-size.mjs.map +0 -1
- package/fesm2020/count-down.mjs.map +0 -1
- package/fesm2020/date-picker.mjs.map +0 -1
- package/fesm2020/down-file.mjs.map +0 -1
- package/fesm2020/ellipsis.mjs.map +0 -1
- package/fesm2020/error-collect.mjs.map +0 -1
- package/fesm2020/exception.mjs.map +0 -1
- package/fesm2020/footer-toolbar.mjs.map +0 -1
- package/fesm2020/full-content.mjs.map +0 -1
- package/fesm2020/global-footer.mjs.map +0 -1
- package/fesm2020/hotkey.mjs.map +0 -1
- package/fesm2020/let.mjs.map +0 -1
- package/fesm2020/loading.mjs.map +0 -1
- package/fesm2020/media.mjs.map +0 -1
- package/fesm2020/notice-icon.mjs +0 -180
- package/fesm2020/notice-icon.mjs.map +0 -1
- package/fesm2020/page-header.mjs.map +0 -1
- package/fesm2020/pdf.mjs.map +0 -1
- package/fesm2020/qr.mjs +0 -171
- package/fesm2020/quick-menu.mjs.map +0 -1
- package/fesm2020/reuse-tab.mjs.map +0 -1
- package/fesm2020/se.mjs.map +0 -1
- package/fesm2020/sg.mjs.map +0 -1
- package/fesm2020/st.mjs.map +0 -1
- package/fesm2020/sv.mjs.map +0 -1
- package/fesm2020/tag-select.mjs.map +0 -1
- package/fesm2020/xlsx.mjs.map +0 -1
- package/fesm2020/zip.mjs.map +0 -1
- /package/{esm2020 → esm2022}/abc.mjs +0 -0
- /package/{esm2020 → esm2022}/auto-focus/auto-focus.mjs +0 -0
- /package/{esm2020 → esm2022}/auto-focus/index.mjs +0 -0
- /package/{esm2020 → esm2022}/avatar-list/avatar-list.mjs +0 -0
- /package/{esm2020 → esm2022}/avatar-list/public_api.mjs +0 -0
- /package/{esm2020 → esm2022}/count-down/count-down.mjs +0 -0
- /package/{esm2020 → esm2022}/count-down/public_api.mjs +0 -0
- /package/{esm2020 → esm2022}/date-picker/date-picker.mjs +0 -0
- /package/{esm2020 → esm2022}/date-picker/public_api.mjs +0 -0
- /package/{esm2020 → esm2022}/down-file/down-file.mjs +0 -0
- /package/{esm2020 → esm2022}/down-file/public_api.mjs +0 -0
- /package/{esm2020 → esm2022}/ellipsis/ellipsis.mjs +0 -0
- /package/{esm2020 → esm2022}/ellipsis/public_api.mjs +0 -0
- /package/{esm2020 → esm2022}/error-collect/error-collect.mjs +0 -0
- /package/{esm2020 → esm2022}/error-collect/public_api.mjs +0 -0
- /package/{esm2020 → esm2022}/exception/exception.mjs +0 -0
- /package/{esm2020 → esm2022}/exception/public_api.mjs +0 -0
- /package/{esm2020 → esm2022}/footer-toolbar/footer-toolbar.mjs +0 -0
- /package/{esm2020 → esm2022}/footer-toolbar/public_api.mjs +0 -0
- /package/{esm2020 → esm2022}/full-content/full-content.mjs +0 -0
- /package/{esm2020 → esm2022}/full-content/public_api.mjs +0 -0
- /package/{esm2020 → esm2022}/global-footer/global-footer.mjs +0 -0
- /package/{esm2020 → esm2022}/global-footer/global-footer.types.mjs +0 -0
- /package/{esm2020 → esm2022}/global-footer/public_api.mjs +0 -0
- /package/{esm2020 → esm2022}/hotkey/hotkey.mjs +0 -0
- /package/{esm2020 → esm2022}/hotkey/public_api.mjs +0 -0
- /package/{esm2020 → esm2022}/let/index.mjs +0 -0
- /package/{esm2020 → esm2022}/let/let.mjs +0 -0
- /package/{esm2020 → esm2022}/loading/loading.mjs +0 -0
- /package/{esm2020 → esm2022}/loading/loading.types.mjs +0 -0
- /package/{esm2020 → esm2022}/loading/public_api.mjs +0 -0
- /package/{esm2020 → esm2022}/lodop/lodop.mjs +0 -0
- /package/{esm2020 → esm2022}/lodop/lodop.types.mjs +0 -0
- /package/{esm2020 → esm2022}/lodop/public_api.mjs +0 -0
- /package/{esm2020 → esm2022}/media/media.mjs +0 -0
- /package/{esm2020 → esm2022}/media/public_api.mjs +0 -0
- /package/{esm2020 → esm2022}/notice-icon/notice-icon.mjs +0 -0
- /package/{esm2020 → esm2022}/notice-icon/notice-icon.types.mjs +0 -0
- /package/{esm2020 → esm2022}/notice-icon/public_api.mjs +0 -0
- /package/{esm2020 → esm2022}/observers/chart-observer-size.mjs +0 -0
- /package/{esm2020 → esm2022}/observers/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/onboarding/onboarding.mjs +0 -0
- /package/{esm2020 → esm2022}/onboarding/onboarding.types.mjs +0 -0
- /package/{esm2020 → esm2022}/onboarding/public_api.mjs +0 -0
- /package/{esm2020 → esm2022}/page-header/page-header.mjs +0 -0
- /package/{esm2020 → esm2022}/page-header/public_api.mjs +0 -0
- /package/{esm2020 → esm2022}/pdf/pdf.mjs +0 -0
- /package/{esm2020 → esm2022}/pdf/pdf.types.mjs +0 -0
- /package/{esm2020 → esm2022}/pdf/public_api.mjs +0 -0
- /package/{esm2020 → esm2022}/public_api.mjs +0 -0
- /package/{esm2020 → esm2022}/qr/public_api.mjs +0 -0
- /package/{esm2020 → esm2022}/qr/qr.config.mjs +0 -0
- /package/{esm2020 → esm2022}/qr/qr.mjs +0 -0
- /package/{esm2020 → esm2022}/qr/qr.types.mjs +0 -0
- /package/{esm2020 → esm2022}/quick-menu/public_api.mjs +0 -0
- /package/{esm2020 → esm2022}/quick-menu/quick-menu.mjs +0 -0
- /package/{esm2020 → esm2022}/result/public_api.mjs +0 -0
- /package/{esm2020 → esm2022}/result/result.mjs +0 -0
- /package/{esm2020 → esm2022}/reuse-tab/lifecycle_hooks.mjs +0 -0
- /package/{esm2020 → esm2022}/reuse-tab/public_api.mjs +0 -0
- /package/{esm2020 → esm2022}/reuse-tab/reuse-tab.interfaces.mjs +0 -0
- /package/{esm2020 → esm2022}/reuse-tab/reuse-tab.mjs +0 -0
- /package/{esm2020 → esm2022}/reuse-tab/reuse-tab.state.mjs +0 -0
- /package/{esm2020 → esm2022}/reuse-tab/reuse-tab.strategy.mjs +0 -0
- /package/{esm2020 → esm2022}/se/public_api.mjs +0 -0
- /package/{esm2020 → esm2022}/se/se.mjs +0 -0
- /package/{esm2020 → esm2022}/se/se.types.mjs +0 -0
- /package/{esm2020 → esm2022}/sg/public_api.mjs +0 -0
- /package/{esm2020 → esm2022}/sg/sg.mjs +0 -0
- /package/{esm2020 → esm2022}/st/public_api.mjs +0 -0
- /package/{esm2020 → esm2022}/st/st.config.mjs +0 -0
- /package/{esm2020 → esm2022}/st/st.interfaces.mjs +0 -0
- /package/{esm2020 → esm2022}/st/st.mjs +0 -0
- /package/{esm2020 → esm2022}/st/st.types.mjs +0 -0
- /package/{esm2020 → esm2022}/sv/public_api.mjs +0 -0
- /package/{esm2020 → esm2022}/sv/sv.mjs +0 -0
- /package/{esm2020 → esm2022}/tag-select/public_api.mjs +0 -0
- /package/{esm2020 → esm2022}/tag-select/tag-select.mjs +0 -0
- /package/{esm2020 → esm2022}/xlsx/public_api.mjs +0 -0
- /package/{esm2020 → esm2022}/xlsx/xlsx.mjs +0 -0
- /package/{esm2020 → esm2022}/xlsx/xlsx.types.mjs +0 -0
- /package/{esm2020 → esm2022}/zip/public_api.mjs +0 -0
- /package/{esm2020 → esm2022}/zip/zip.mjs +0 -0
- /package/{esm2020 → esm2022}/zip/zip.types.mjs +0 -0
- /package/{fesm2015 → fesm2022}/abc.mjs +0 -0
- /package/{fesm2015 → fesm2022}/abc.mjs.map +0 -0
|
@@ -1,558 +0,0 @@
|
|
|
1
|
-
import { Inject, Injectable, Optional } from '@angular/core';
|
|
2
|
-
import { ActivatedRoute, NavigationEnd, NavigationStart, Router, ROUTER_CONFIGURATION } from '@angular/router';
|
|
3
|
-
import { BehaviorSubject, timer } from 'rxjs';
|
|
4
|
-
import { ScrollService } from '@delon/util/browser';
|
|
5
|
-
import { ReuseTabMatchMode } from './reuse-tab.interfaces';
|
|
6
|
-
import { REUSE_TAB_STORAGE_KEY, REUSE_TAB_STORAGE_STATE } from './reuse-tab.state';
|
|
7
|
-
import * as i0 from "@angular/core";
|
|
8
|
-
import * as i1 from "@delon/theme";
|
|
9
|
-
export class ReuseTabService {
|
|
10
|
-
get snapshot() {
|
|
11
|
-
return this.injector.get(ActivatedRoute).snapshot;
|
|
12
|
-
}
|
|
13
|
-
// #region public
|
|
14
|
-
/**
|
|
15
|
-
* Get init status
|
|
16
|
-
*
|
|
17
|
-
* 是否已经初始化完成
|
|
18
|
-
*/
|
|
19
|
-
get inited() {
|
|
20
|
-
return this._inited;
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* Current routing address
|
|
24
|
-
*
|
|
25
|
-
* 当前路由地址
|
|
26
|
-
*/
|
|
27
|
-
get curUrl() {
|
|
28
|
-
return this.getUrl(this.snapshot);
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* 允许最多复用多少个页面,取值范围 `2-100`,值发生变更时会强制关闭且忽略可关闭条件
|
|
32
|
-
*/
|
|
33
|
-
set max(value) {
|
|
34
|
-
this._max = Math.min(Math.max(value, 2), 100);
|
|
35
|
-
for (let i = this._cached.length; i > this._max; i--) {
|
|
36
|
-
this._cached.pop();
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
set keepingScroll(value) {
|
|
40
|
-
this._keepingScroll = value;
|
|
41
|
-
this.initScroll();
|
|
42
|
-
}
|
|
43
|
-
get keepingScroll() {
|
|
44
|
-
return this._keepingScroll;
|
|
45
|
-
}
|
|
46
|
-
/** 获取已缓存的路由 */
|
|
47
|
-
get items() {
|
|
48
|
-
return this._cached;
|
|
49
|
-
}
|
|
50
|
-
/** 获取当前缓存的路由总数 */
|
|
51
|
-
get count() {
|
|
52
|
-
return this._cached.length;
|
|
53
|
-
}
|
|
54
|
-
/** 订阅缓存变更通知 */
|
|
55
|
-
get change() {
|
|
56
|
-
return this._cachedChange.asObservable(); // .pipe(filter(w => w !== null));
|
|
57
|
-
}
|
|
58
|
-
/** 自定义当前标题 */
|
|
59
|
-
set title(value) {
|
|
60
|
-
const url = this.curUrl;
|
|
61
|
-
if (typeof value === 'string')
|
|
62
|
-
value = { text: value };
|
|
63
|
-
this._titleCached[url] = value;
|
|
64
|
-
this.di('update current tag title: ', value);
|
|
65
|
-
this._cachedChange.next({
|
|
66
|
-
active: 'title',
|
|
67
|
-
url,
|
|
68
|
-
title: value,
|
|
69
|
-
list: this._cached
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
|
-
/** 获取指定路径缓存所在位置,`-1` 表示无缓存 */
|
|
73
|
-
index(url) {
|
|
74
|
-
return this._cached.findIndex(w => w.url === url);
|
|
75
|
-
}
|
|
76
|
-
/** 获取指定路径缓存是否存在 */
|
|
77
|
-
exists(url) {
|
|
78
|
-
return this.index(url) !== -1;
|
|
79
|
-
}
|
|
80
|
-
/** 获取指定路径缓存 */
|
|
81
|
-
get(url) {
|
|
82
|
-
return url ? this._cached.find(w => w.url === url) || null : null;
|
|
83
|
-
}
|
|
84
|
-
remove(url, includeNonCloseable) {
|
|
85
|
-
const idx = typeof url === 'string' ? this.index(url) : url;
|
|
86
|
-
const item = idx !== -1 ? this._cached[idx] : null;
|
|
87
|
-
if (!item || (!includeNonCloseable && !item.closable))
|
|
88
|
-
return false;
|
|
89
|
-
this.destroy(item._handle);
|
|
90
|
-
this._cached.splice(idx, 1);
|
|
91
|
-
delete this._titleCached[url];
|
|
92
|
-
return true;
|
|
93
|
-
}
|
|
94
|
-
/**
|
|
95
|
-
* 根据URL移除标签
|
|
96
|
-
*
|
|
97
|
-
* @param [includeNonCloseable=false] 是否强制包含不可关闭
|
|
98
|
-
*/
|
|
99
|
-
close(url, includeNonCloseable = false) {
|
|
100
|
-
this.removeUrlBuffer = url;
|
|
101
|
-
this.remove(url, includeNonCloseable);
|
|
102
|
-
this._cachedChange.next({ active: 'close', url, list: this._cached });
|
|
103
|
-
this.di('close tag', url);
|
|
104
|
-
return true;
|
|
105
|
-
}
|
|
106
|
-
/**
|
|
107
|
-
* 清除右边
|
|
108
|
-
*
|
|
109
|
-
* @param [includeNonCloseable=false] 是否强制包含不可关闭
|
|
110
|
-
*/
|
|
111
|
-
closeRight(url, includeNonCloseable = false) {
|
|
112
|
-
const start = this.index(url);
|
|
113
|
-
for (let i = this.count - 1; i > start; i--) {
|
|
114
|
-
this.remove(i, includeNonCloseable);
|
|
115
|
-
}
|
|
116
|
-
this.removeUrlBuffer = null;
|
|
117
|
-
this._cachedChange.next({ active: 'closeRight', url, list: this._cached });
|
|
118
|
-
this.di('close right tages', url);
|
|
119
|
-
return true;
|
|
120
|
-
}
|
|
121
|
-
/**
|
|
122
|
-
* 清除所有缓存
|
|
123
|
-
*
|
|
124
|
-
* @param [includeNonCloseable=false] 是否强制包含不可关闭
|
|
125
|
-
*/
|
|
126
|
-
clear(includeNonCloseable = false) {
|
|
127
|
-
this._cached.forEach(w => {
|
|
128
|
-
if (!includeNonCloseable && w.closable)
|
|
129
|
-
this.destroy(w._handle);
|
|
130
|
-
});
|
|
131
|
-
this._cached = this._cached.filter(w => !includeNonCloseable && !w.closable);
|
|
132
|
-
this.removeUrlBuffer = null;
|
|
133
|
-
this._cachedChange.next({ active: 'clear', list: this._cached });
|
|
134
|
-
this.di('clear all catch');
|
|
135
|
-
}
|
|
136
|
-
/**
|
|
137
|
-
* 移动缓存数据
|
|
138
|
-
*
|
|
139
|
-
* @param url 要移动的URL地址
|
|
140
|
-
* @param position 新位置,下标从 `0` 开始
|
|
141
|
-
*
|
|
142
|
-
* @example
|
|
143
|
-
* ```
|
|
144
|
-
* // source
|
|
145
|
-
* [ '/a/1', '/a/2', '/a/3', '/a/4', '/a/5' ]
|
|
146
|
-
* move('/a/1', 2);
|
|
147
|
-
* // output
|
|
148
|
-
* [ '/a/2', '/a/3', '/a/1', '/a/4', '/a/5' ]
|
|
149
|
-
* move('/a/1', -1);
|
|
150
|
-
* // output
|
|
151
|
-
* [ '/a/2', '/a/3', '/a/4', '/a/5', '/a/1' ]
|
|
152
|
-
* ```
|
|
153
|
-
*/
|
|
154
|
-
move(url, position) {
|
|
155
|
-
const start = this._cached.findIndex(w => w.url === url);
|
|
156
|
-
if (start === -1)
|
|
157
|
-
return;
|
|
158
|
-
const data = this._cached.slice();
|
|
159
|
-
data.splice(position < 0 ? data.length + position : position, 0, data.splice(start, 1)[0]);
|
|
160
|
-
this._cached = data;
|
|
161
|
-
this._cachedChange.next({
|
|
162
|
-
active: 'move',
|
|
163
|
-
url,
|
|
164
|
-
position,
|
|
165
|
-
list: this._cached
|
|
166
|
-
});
|
|
167
|
-
}
|
|
168
|
-
/**
|
|
169
|
-
* 强制关闭当前路由(包含不可关闭状态),并重新导航至 `newUrl` 路由
|
|
170
|
-
*/
|
|
171
|
-
replace(newUrl) {
|
|
172
|
-
const url = this.curUrl;
|
|
173
|
-
if (this.exists(url)) {
|
|
174
|
-
this.close(url, true);
|
|
175
|
-
}
|
|
176
|
-
else {
|
|
177
|
-
this.removeUrlBuffer = url;
|
|
178
|
-
}
|
|
179
|
-
this.injector.get(Router).navigateByUrl(newUrl);
|
|
180
|
-
}
|
|
181
|
-
/**
|
|
182
|
-
* 获取标题,顺序如下:
|
|
183
|
-
*
|
|
184
|
-
* 1. 组件内使用 `ReuseTabService.title = 'new title'` 重新指定文本
|
|
185
|
-
* 2. 路由配置中 data 属性中包含 titleI18n > title
|
|
186
|
-
* 3. 菜单数据中 text 属性
|
|
187
|
-
*
|
|
188
|
-
* @param url 指定URL
|
|
189
|
-
* @param route 指定路由快照
|
|
190
|
-
*/
|
|
191
|
-
getTitle(url, route) {
|
|
192
|
-
if (this._titleCached[url]) {
|
|
193
|
-
return this._titleCached[url];
|
|
194
|
-
}
|
|
195
|
-
if (route && route.data && (route.data.titleI18n || route.data.title)) {
|
|
196
|
-
return {
|
|
197
|
-
text: route.data.title,
|
|
198
|
-
i18n: route.data.titleI18n
|
|
199
|
-
};
|
|
200
|
-
}
|
|
201
|
-
const menu = this.getMenu(url);
|
|
202
|
-
return menu ? { text: menu.text, i18n: menu.i18n } : { text: url };
|
|
203
|
-
}
|
|
204
|
-
/**
|
|
205
|
-
* 清除标题缓存
|
|
206
|
-
*/
|
|
207
|
-
clearTitleCached() {
|
|
208
|
-
this._titleCached = {};
|
|
209
|
-
}
|
|
210
|
-
/** 自定义当前 `closable` 状态 */
|
|
211
|
-
set closable(value) {
|
|
212
|
-
const url = this.curUrl;
|
|
213
|
-
this._closableCached[url] = value;
|
|
214
|
-
this.di('update current tag closable: ', value);
|
|
215
|
-
this._cachedChange.next({
|
|
216
|
-
active: 'closable',
|
|
217
|
-
closable: value,
|
|
218
|
-
list: this._cached
|
|
219
|
-
});
|
|
220
|
-
}
|
|
221
|
-
/**
|
|
222
|
-
* 获取 `closable` 状态,顺序如下:
|
|
223
|
-
*
|
|
224
|
-
* 1. 组件内使用 `ReuseTabService.closable = true` 重新指定 `closable` 状态
|
|
225
|
-
* 2. 路由配置中 data 属性中包含 `reuseClosable`
|
|
226
|
-
* 3. 菜单数据中 `reuseClosable` 属性
|
|
227
|
-
*
|
|
228
|
-
* @param url 指定URL
|
|
229
|
-
* @param route 指定路由快照
|
|
230
|
-
*/
|
|
231
|
-
getClosable(url, route) {
|
|
232
|
-
if (typeof this._closableCached[url] !== 'undefined')
|
|
233
|
-
return this._closableCached[url];
|
|
234
|
-
if (route && route.data && typeof route.data.reuseClosable === 'boolean')
|
|
235
|
-
return route.data.reuseClosable;
|
|
236
|
-
const menu = this.mode !== ReuseTabMatchMode.URL ? this.getMenu(url) : null;
|
|
237
|
-
if (menu && typeof menu.reuseClosable === 'boolean')
|
|
238
|
-
return menu.reuseClosable;
|
|
239
|
-
return true;
|
|
240
|
-
}
|
|
241
|
-
/**
|
|
242
|
-
* 清空 `closable` 缓存
|
|
243
|
-
*/
|
|
244
|
-
clearClosableCached() {
|
|
245
|
-
this._closableCached = {};
|
|
246
|
-
}
|
|
247
|
-
getTruthRoute(route) {
|
|
248
|
-
let next = route;
|
|
249
|
-
while (next.firstChild)
|
|
250
|
-
next = next.firstChild;
|
|
251
|
-
return next;
|
|
252
|
-
}
|
|
253
|
-
/**
|
|
254
|
-
* 根据快照获取URL地址
|
|
255
|
-
*/
|
|
256
|
-
getUrl(route) {
|
|
257
|
-
let next = this.getTruthRoute(route);
|
|
258
|
-
const segments = [];
|
|
259
|
-
while (next) {
|
|
260
|
-
segments.push(next.url.join('/'));
|
|
261
|
-
next = next.parent;
|
|
262
|
-
}
|
|
263
|
-
const url = `/${segments
|
|
264
|
-
.filter(i => i)
|
|
265
|
-
.reverse()
|
|
266
|
-
.join('/')}`;
|
|
267
|
-
return url;
|
|
268
|
-
}
|
|
269
|
-
/**
|
|
270
|
-
* 检查快照是否允许被复用
|
|
271
|
-
*/
|
|
272
|
-
can(route) {
|
|
273
|
-
const url = this.getUrl(route);
|
|
274
|
-
if (url === this.removeUrlBuffer)
|
|
275
|
-
return false;
|
|
276
|
-
if (route.data && typeof route.data.reuse === 'boolean')
|
|
277
|
-
return route.data.reuse;
|
|
278
|
-
if (this.mode !== ReuseTabMatchMode.URL) {
|
|
279
|
-
const menu = this.getMenu(url);
|
|
280
|
-
if (!menu)
|
|
281
|
-
return false;
|
|
282
|
-
if (this.mode === ReuseTabMatchMode.Menu) {
|
|
283
|
-
if (menu.reuse === false)
|
|
284
|
-
return false;
|
|
285
|
-
}
|
|
286
|
-
else {
|
|
287
|
-
if (!menu.reuse || menu.reuse !== true)
|
|
288
|
-
return false;
|
|
289
|
-
}
|
|
290
|
-
return true;
|
|
291
|
-
}
|
|
292
|
-
return !this.isExclude(url);
|
|
293
|
-
}
|
|
294
|
-
isExclude(url) {
|
|
295
|
-
return this.excludes.findIndex(r => r.test(url)) !== -1;
|
|
296
|
-
}
|
|
297
|
-
/**
|
|
298
|
-
* 刷新,触发一个 refresh 类型事件
|
|
299
|
-
*/
|
|
300
|
-
refresh(data) {
|
|
301
|
-
this._cachedChange.next({ active: 'refresh', data });
|
|
302
|
-
}
|
|
303
|
-
// #endregion
|
|
304
|
-
// #region privates
|
|
305
|
-
destroy(_handle) {
|
|
306
|
-
if (_handle && _handle.componentRef && _handle.componentRef.destroy)
|
|
307
|
-
_handle.componentRef.destroy();
|
|
308
|
-
}
|
|
309
|
-
di(...args) {
|
|
310
|
-
if (typeof ngDevMode === 'undefined' || ngDevMode) {
|
|
311
|
-
if (!this.debug)
|
|
312
|
-
return;
|
|
313
|
-
console.warn(...args);
|
|
314
|
-
}
|
|
315
|
-
}
|
|
316
|
-
// #endregion
|
|
317
|
-
constructor(injector, menuService, stateKey, stateSrv) {
|
|
318
|
-
this.injector = injector;
|
|
319
|
-
this.menuService = menuService;
|
|
320
|
-
this.stateKey = stateKey;
|
|
321
|
-
this.stateSrv = stateSrv;
|
|
322
|
-
this._inited = false;
|
|
323
|
-
this._max = 10;
|
|
324
|
-
this._keepingScroll = false;
|
|
325
|
-
this._cachedChange = new BehaviorSubject(null);
|
|
326
|
-
this._cached = [];
|
|
327
|
-
this._titleCached = {};
|
|
328
|
-
this._closableCached = {};
|
|
329
|
-
this.removeUrlBuffer = null;
|
|
330
|
-
this.positionBuffer = {};
|
|
331
|
-
this.debug = false;
|
|
332
|
-
this.routeParamMatchMode = 'strict';
|
|
333
|
-
this.mode = ReuseTabMatchMode.Menu;
|
|
334
|
-
/** 排除规则,限 `mode=URL` */
|
|
335
|
-
this.excludes = [];
|
|
336
|
-
this.storageState = false;
|
|
337
|
-
}
|
|
338
|
-
init() {
|
|
339
|
-
this.initScroll();
|
|
340
|
-
this._inited = true;
|
|
341
|
-
this.loadState();
|
|
342
|
-
}
|
|
343
|
-
loadState() {
|
|
344
|
-
if (!this.storageState)
|
|
345
|
-
return;
|
|
346
|
-
this._cached = this.stateSrv.get(this.stateKey).map(v => ({
|
|
347
|
-
title: { text: v.title },
|
|
348
|
-
url: v.url,
|
|
349
|
-
position: v.position
|
|
350
|
-
}));
|
|
351
|
-
this._cachedChange.next({ active: 'loadState' });
|
|
352
|
-
}
|
|
353
|
-
getMenu(url) {
|
|
354
|
-
const menus = this.menuService.getPathByUrl(url);
|
|
355
|
-
if (!menus || menus.length === 0)
|
|
356
|
-
return null;
|
|
357
|
-
return menus.pop();
|
|
358
|
-
}
|
|
359
|
-
runHook(method, comp, type = 'init') {
|
|
360
|
-
if (typeof comp === 'number') {
|
|
361
|
-
const item = this._cached[comp];
|
|
362
|
-
comp = item._handle?.componentRef;
|
|
363
|
-
}
|
|
364
|
-
if (comp == null || !comp.instance) {
|
|
365
|
-
return;
|
|
366
|
-
}
|
|
367
|
-
const compThis = comp.instance;
|
|
368
|
-
const fn = compThis[method];
|
|
369
|
-
if (typeof fn !== 'function') {
|
|
370
|
-
return;
|
|
371
|
-
}
|
|
372
|
-
if (method === '_onReuseInit') {
|
|
373
|
-
fn.call(compThis, type);
|
|
374
|
-
}
|
|
375
|
-
else {
|
|
376
|
-
fn.call(compThis);
|
|
377
|
-
}
|
|
378
|
-
}
|
|
379
|
-
hasInValidRoute(route) {
|
|
380
|
-
return !route.routeConfig || !!route.routeConfig.loadChildren || !!route.routeConfig.children;
|
|
381
|
-
}
|
|
382
|
-
/**
|
|
383
|
-
* 决定是否允许路由复用,若 `true` 会触发 `store`
|
|
384
|
-
*/
|
|
385
|
-
shouldDetach(route) {
|
|
386
|
-
if (this.hasInValidRoute(route))
|
|
387
|
-
return false;
|
|
388
|
-
this.di('#shouldDetach', this.can(route), this.getUrl(route));
|
|
389
|
-
return this.can(route);
|
|
390
|
-
}
|
|
391
|
-
/**
|
|
392
|
-
* 存储
|
|
393
|
-
*/
|
|
394
|
-
store(_snapshot, _handle) {
|
|
395
|
-
const url = this.getUrl(_snapshot);
|
|
396
|
-
const idx = this.index(url);
|
|
397
|
-
const isAdd = idx === -1;
|
|
398
|
-
const item = {
|
|
399
|
-
title: this.getTitle(url, _snapshot),
|
|
400
|
-
closable: this.getClosable(url, _snapshot),
|
|
401
|
-
position: this.getKeepingScroll(url, _snapshot) ? this.positionBuffer[url] : null,
|
|
402
|
-
url,
|
|
403
|
-
_snapshot,
|
|
404
|
-
_handle
|
|
405
|
-
};
|
|
406
|
-
if (isAdd) {
|
|
407
|
-
if (this.count >= this._max) {
|
|
408
|
-
// Get the oldest closable location
|
|
409
|
-
const closeIdx = this._cached.findIndex(w => w.closable);
|
|
410
|
-
if (closeIdx !== -1)
|
|
411
|
-
this.remove(closeIdx, false);
|
|
412
|
-
}
|
|
413
|
-
this._cached.push(item);
|
|
414
|
-
}
|
|
415
|
-
else {
|
|
416
|
-
// Current handler is null when activate routes
|
|
417
|
-
// For better reliability, we need to wait for the component to be attached before call _onReuseInit
|
|
418
|
-
const cahcedComponentRef = this._cached[idx]._handle?.componentRef;
|
|
419
|
-
if (_handle == null && cahcedComponentRef != null) {
|
|
420
|
-
timer(100).subscribe(() => this.runHook('_onReuseInit', cahcedComponentRef));
|
|
421
|
-
}
|
|
422
|
-
this._cached[idx] = item;
|
|
423
|
-
}
|
|
424
|
-
this.removeUrlBuffer = null;
|
|
425
|
-
this.di('#store', isAdd ? '[new]' : '[override]', url);
|
|
426
|
-
if (_handle && _handle.componentRef) {
|
|
427
|
-
this.runHook('_onReuseDestroy', _handle.componentRef);
|
|
428
|
-
}
|
|
429
|
-
if (!isAdd) {
|
|
430
|
-
this._cachedChange.next({ active: 'override', item, list: this._cached });
|
|
431
|
-
}
|
|
432
|
-
}
|
|
433
|
-
/**
|
|
434
|
-
* 决定是否允许应用缓存数据
|
|
435
|
-
*/
|
|
436
|
-
shouldAttach(route) {
|
|
437
|
-
if (this.hasInValidRoute(route))
|
|
438
|
-
return false;
|
|
439
|
-
const url = this.getUrl(route);
|
|
440
|
-
const data = this.get(url);
|
|
441
|
-
const ret = !!(data && data._handle);
|
|
442
|
-
this.di('#shouldAttach', ret, url);
|
|
443
|
-
if (!ret) {
|
|
444
|
-
this._cachedChange.next({ active: 'add', url, list: this._cached });
|
|
445
|
-
}
|
|
446
|
-
return ret;
|
|
447
|
-
}
|
|
448
|
-
/**
|
|
449
|
-
* 提取复用数据
|
|
450
|
-
*/
|
|
451
|
-
retrieve(route) {
|
|
452
|
-
if (this.hasInValidRoute(route))
|
|
453
|
-
return null;
|
|
454
|
-
const url = this.getUrl(route);
|
|
455
|
-
const data = this.get(url);
|
|
456
|
-
const ret = (data && data._handle) || null;
|
|
457
|
-
this.di('#retrieve', url, ret);
|
|
458
|
-
return ret;
|
|
459
|
-
}
|
|
460
|
-
/**
|
|
461
|
-
* 决定是否应该进行复用路由处理
|
|
462
|
-
*/
|
|
463
|
-
shouldReuseRoute(future, curr) {
|
|
464
|
-
let ret = future.routeConfig === curr.routeConfig;
|
|
465
|
-
if (!ret)
|
|
466
|
-
return false;
|
|
467
|
-
const path = ((future.routeConfig && future.routeConfig.path) || '');
|
|
468
|
-
if (path.length > 0 && ~path.indexOf(':')) {
|
|
469
|
-
if (this.routeParamMatchMode === 'strict') {
|
|
470
|
-
ret = this.getUrl(future) === this.getUrl(curr);
|
|
471
|
-
}
|
|
472
|
-
else {
|
|
473
|
-
ret = path === ((curr.routeConfig && curr.routeConfig.path) || '');
|
|
474
|
-
}
|
|
475
|
-
}
|
|
476
|
-
this.di('=====================');
|
|
477
|
-
this.di('#shouldReuseRoute', ret, `${this.getUrl(curr)}=>${this.getUrl(future)}`, future, curr);
|
|
478
|
-
return ret;
|
|
479
|
-
}
|
|
480
|
-
// #region scroll
|
|
481
|
-
/**
|
|
482
|
-
* 获取 `keepingScroll` 状态,顺序如下:
|
|
483
|
-
*
|
|
484
|
-
* 1. 路由配置中 data 属性中包含 `keepingScroll`
|
|
485
|
-
* 2. 菜单数据中 `keepingScroll` 属性
|
|
486
|
-
* 3. 组件 `keepingScroll` 值
|
|
487
|
-
*/
|
|
488
|
-
getKeepingScroll(url, route) {
|
|
489
|
-
if (route && route.data && typeof route.data.keepingScroll === 'boolean')
|
|
490
|
-
return route.data.keepingScroll;
|
|
491
|
-
const menu = this.mode !== ReuseTabMatchMode.URL ? this.getMenu(url) : null;
|
|
492
|
-
if (menu && typeof menu.keepingScroll === 'boolean')
|
|
493
|
-
return menu.keepingScroll;
|
|
494
|
-
return this.keepingScroll;
|
|
495
|
-
}
|
|
496
|
-
get isDisabledInRouter() {
|
|
497
|
-
const routerConfig = this.injector.get(ROUTER_CONFIGURATION, {});
|
|
498
|
-
return routerConfig.scrollPositionRestoration === 'disabled';
|
|
499
|
-
}
|
|
500
|
-
get ss() {
|
|
501
|
-
return this.injector.get(ScrollService);
|
|
502
|
-
}
|
|
503
|
-
initScroll() {
|
|
504
|
-
if (this._router$) {
|
|
505
|
-
this._router$.unsubscribe();
|
|
506
|
-
}
|
|
507
|
-
this._router$ = this.injector.get(Router).events.subscribe(e => {
|
|
508
|
-
if (e instanceof NavigationStart) {
|
|
509
|
-
const url = this.curUrl;
|
|
510
|
-
if (this.getKeepingScroll(url, this.getTruthRoute(this.snapshot))) {
|
|
511
|
-
this.positionBuffer[url] = this.ss.getScrollPosition(this.keepingScrollContainer);
|
|
512
|
-
}
|
|
513
|
-
else {
|
|
514
|
-
delete this.positionBuffer[url];
|
|
515
|
-
}
|
|
516
|
-
}
|
|
517
|
-
else if (e instanceof NavigationEnd) {
|
|
518
|
-
const url = this.curUrl;
|
|
519
|
-
const item = this.get(url);
|
|
520
|
-
if (item && item.position && this.getKeepingScroll(url, this.getTruthRoute(this.snapshot))) {
|
|
521
|
-
if (this.isDisabledInRouter) {
|
|
522
|
-
this.ss.scrollToPosition(this.keepingScrollContainer, item.position);
|
|
523
|
-
}
|
|
524
|
-
else {
|
|
525
|
-
setTimeout(() => this.ss.scrollToPosition(this.keepingScrollContainer, item.position), 1);
|
|
526
|
-
}
|
|
527
|
-
}
|
|
528
|
-
}
|
|
529
|
-
});
|
|
530
|
-
}
|
|
531
|
-
// #endregion
|
|
532
|
-
ngOnDestroy() {
|
|
533
|
-
const { _cachedChange, _router$ } = this;
|
|
534
|
-
this.clear();
|
|
535
|
-
this._cached = [];
|
|
536
|
-
_cachedChange.complete();
|
|
537
|
-
if (_router$) {
|
|
538
|
-
_router$.unsubscribe();
|
|
539
|
-
}
|
|
540
|
-
}
|
|
541
|
-
}
|
|
542
|
-
ReuseTabService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ReuseTabService, deps: [{ token: i0.Injector }, { token: i1.MenuService }, { token: REUSE_TAB_STORAGE_KEY, optional: true }, { token: REUSE_TAB_STORAGE_STATE, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
543
|
-
ReuseTabService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ReuseTabService, providedIn: 'root' });
|
|
544
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ReuseTabService, decorators: [{
|
|
545
|
-
type: Injectable,
|
|
546
|
-
args: [{ providedIn: 'root' }]
|
|
547
|
-
}], ctorParameters: function () { return [{ type: i0.Injector }, { type: i1.MenuService }, { type: undefined, decorators: [{
|
|
548
|
-
type: Optional
|
|
549
|
-
}, {
|
|
550
|
-
type: Inject,
|
|
551
|
-
args: [REUSE_TAB_STORAGE_KEY]
|
|
552
|
-
}] }, { type: undefined, decorators: [{
|
|
553
|
-
type: Optional
|
|
554
|
-
}, {
|
|
555
|
-
type: Inject,
|
|
556
|
-
args: [REUSE_TAB_STORAGE_STATE]
|
|
557
|
-
}] }]; } });
|
|
558
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV1c2UtdGFiLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hYmMvcmV1c2UtdGFiL3JldXNlLXRhYi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUF1QixRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbEYsT0FBTyxFQUNMLGNBQWMsRUFHZCxhQUFhLEVBQ2IsZUFBZSxFQUNmLE1BQU0sRUFDTixvQkFBb0IsRUFDckIsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsZUFBZSxFQUFjLEtBQUssRUFBa0IsTUFBTSxNQUFNLENBQUM7QUFHMUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBR3BELE9BQU8sRUFLTCxpQkFBaUIsRUFJbEIsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQXdCLHFCQUFxQixFQUFFLHVCQUF1QixFQUFFLE1BQU0sbUJBQW1CLENBQUM7OztBQUd6RyxNQUFNLE9BQU8sZUFBZTtJQW1CMUIsSUFBWSxRQUFRO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUMsUUFBUSxDQUFDO0lBQ3BELENBQUM7SUFFRCxpQkFBaUI7SUFFakI7Ozs7T0FJRztJQUNILElBQUksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILElBQUksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBSSxHQUFHLENBQUMsS0FBYTtRQUNuQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFL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QUFNOzJCQUFDLHVCQUF1QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgSW5qZWN0b3IsIE9uRGVzdHJveSwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEFjdGl2YXRlZFJvdXRlLFxuICBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LFxuICBFeHRyYU9wdGlvbnMsXG4gIE5hdmlnYXRpb25FbmQsXG4gIE5hdmlnYXRpb25TdGFydCxcbiAgUm91dGVyLFxuICBST1VURVJfQ09ORklHVVJBVElPTlxufSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCB0aW1lciwgVW5zdWJzY3JpYmFibGUgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgTWVudSwgTWVudVNlcnZpY2UgfSBmcm9tICdAZGVsb24vdGhlbWUnO1xuaW1wb3J0IHsgU2Nyb2xsU2VydmljZSB9IGZyb20gJ0BkZWxvbi91dGlsL2Jyb3dzZXInO1xuaW1wb3J0IHR5cGUgeyBOelNhZmVBbnkgfSBmcm9tICduZy16b3Jyby1hbnRkL2NvcmUvdHlwZXMnO1xuXG5pbXBvcnQge1xuICBSZXVzZUNvbXBvbmVudFJlZixcbiAgUmV1c2VIb29rT25SZXVzZUluaXRUeXBlLFxuICBSZXVzZUhvb2tUeXBlcyxcbiAgUmV1c2VUYWJDYWNoZWQsXG4gIFJldXNlVGFiTWF0Y2hNb2RlLFxuICBSZXVzZVRhYk5vdGlmeSxcbiAgUmV1c2VUYWJSb3V0ZVBhcmFtTWF0Y2hNb2RlLFxuICBSZXVzZVRpdGxlXG59IGZyb20gJy4vcmV1c2UtdGFiLmludGVyZmFjZXMnO1xuaW1wb3J0IHsgUmV1c2VUYWJTdG9yYWdlU3RhdGUsIFJFVVNFX1RBQl9TVE9SQUdFX0tFWSwgUkVVU0VfVEFCX1NUT1JBR0VfU1RBVEUgfSBmcm9tICcuL3JldXNlLXRhYi5zdGF0ZSc7XG5cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgUmV1c2VUYWJTZXJ2aWNlIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBfaW5pdGVkID0gZmFsc2U7XG4gIHByaXZhdGUgX21heCA9IDEwO1xuICBwcml2YXRlIF9rZWVwaW5nU2Nyb2xsID0gZmFsc2U7XG4gIHByaXZhdGUgX2NhY2hlZENoYW5nZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8UmV1c2VUYWJOb3RpZnkgfCBudWxsPihudWxsKTtcbiAgcHJpdmF0ZSBfY2FjaGVkOiBSZXVzZVRhYkNhY2hlZFtdID0gW107XG4gIHByaXZhdGUgX3RpdGxlQ2FjaGVkOiB7IFt1cmw6IHN0cmluZ106IFJldXNlVGl0bGUgfSA9IHt9O1xuICBwcml2YXRlIF9jbG9zYWJsZUNhY2hlZDogeyBbdXJsOiBzdHJpbmddOiBib29sZWFuIH0gPSB7fTtcbiAgcHJpdmF0ZSBfcm91dGVyJD86IFVuc3Vic2NyaWJhYmxlO1xuICBwcml2YXRlIHJlbW92ZVVybEJ1ZmZlcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcG9zaXRpb25CdWZmZXI6IHsgW3VybDogc3RyaW5nXTogW251bWJlciwgbnVtYmVyXSB9ID0ge307XG4gIGNvbXBvbmVudFJlZj86IFJldXNlQ29tcG9uZW50UmVmO1xuICBkZWJ1ZyA9IGZhbHNlO1xuICByb3V0ZVBhcmFtTWF0Y2hNb2RlOiBSZXVzZVRhYlJvdXRlUGFyYW1NYXRjaE1vZGUgPSAnc3RyaWN0JztcbiAgbW9kZSA9IFJldXNlVGFiTWF0Y2hNb2RlLk1lbnU7XG4gIC8qKiDmjpLpmaTop4TliJnvvIzpmZAgYG1vZGU9VVJMYCAqL1xuICBleGNsdWRlczogUmVnRXhwW10gPSBbXTtcbiAgc3RvcmFnZVN0YXRlID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBnZXQgc25hcHNob3QoKTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCB7XG4gICAgcmV0dXJuIHRoaXMuaW5qZWN0b3IuZ2V0KEFjdGl2YXRlZFJvdXRlKS5zbmFwc2hvdDtcbiAgfVxuXG4gIC8vICNyZWdpb24gcHVibGljXG5cbiAgLyoqXG4gICAqIEdldCBpbml0IHN0YXR1c1xuICAgKlxuICAgKiDmmK/lkKblt7Lnu4/liJ3lp4vljJblrozmiJBcbiAgICovXG4gIGdldCBpbml0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2luaXRlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDdXJyZW50IHJvdXRpbmcgYWRkcmVzc1xuICAgKlxuICAgKiDlvZPliY3ot6/nlLHlnLDlnYBcbiAgICovXG4gIGdldCBjdXJVcmwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5nZXRVcmwodGhpcy5zbmFwc2hvdCk7XG4gIH1cblxuICAvKipcbiAgICog5YWB6K645pyA5aSa5aSN55So5aSa5bCR5Liq6aG16Z2i77yM5Y+W5YC86IyD5Zu0IGAyLTEwMGDvvIzlgLzlj5HnlJ/lj5jmm7Tml7bkvJrlvLrliLblhbPpl63kuJTlv73nlaXlj6/lhbPpl63mnaHku7ZcbiAgICovXG4gIHNldCBtYXgodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX21heCA9IE1hdGgubWluKE1hdGgubWF4KHZhbHVlLCAyKSwgMTAwKTtcbiAgICBmb3IgKGxldCBpID0gdGhpcy5fY2FjaGVkLmxlbmd0aDsgaSA+IHRoaXMuX21heDsgaS0tKSB7XG4gICAgICB0aGlzLl9jYWNoZWQucG9wKCk7XG4gICAgfVxuICB9XG4gIHNldCBrZWVwaW5nU2Nyb2xsKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fa2VlcGluZ1Njcm9sbCA9IHZhbHVlO1xuICAgIHRoaXMuaW5pdFNjcm9sbCgpO1xuICB9XG4gIGdldCBrZWVwaW5nU2Nyb2xsKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9rZWVwaW5nU2Nyb2xsO1xuICB9XG4gIGtlZXBpbmdTY3JvbGxDb250YWluZXI/OiBFbGVtZW50O1xuICAvKiog6I635Y+W5bey57yT5a2Y55qE6Lev55SxICovXG4gIGdldCBpdGVtcygpOiBSZXVzZVRhYkNhY2hlZFtdIHtcbiAgICByZXR1cm4gdGhpcy5fY2FjaGVkO1xuICB9XG4gIC8qKiDojrflj5blvZPliY3nvJPlrZjnmoTot6/nlLHmgLvmlbAgKi9cbiAgZ2V0IGNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2NhY2hlZC5sZW5ndGg7XG4gIH1cbiAgLyoqIOiuoumYhee8k+WtmOWPmOabtOmAmuefpSAqL1xuICBnZXQgY2hhbmdlKCk6IE9ic2VydmFibGU8UmV1c2VUYWJOb3RpZnkgfCBudWxsPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NhY2hlZENoYW5nZS5hc09ic2VydmFibGUoKTsgLy8gLnBpcGUoZmlsdGVyKHcgPT4gdyAhPT0gbnVsbCkpO1xuICB9XG4gIC8qKiDoh6rlrprkuYnlvZPliY3moIfpopggKi9cbiAgc2V0IHRpdGxlKHZhbHVlOiBzdHJpbmcgfCBSZXVzZVRpdGxlKSB7XG4gICAgY29uc3QgdXJsID0gdGhpcy5jdXJVcmw7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHZhbHVlID0geyB0ZXh0OiB2YWx1ZSB9O1xuICAgIHRoaXMuX3RpdGxlQ2FjaGVkW3VybF0gPSB2YWx1ZTtcbiAgICB0aGlzLmRpKCd1cGRhdGUgY3VycmVudCB0YWcgdGl0bGU6ICcsIHZhbHVlKTtcbiAgICB0aGlzLl9jYWNoZWRDaGFuZ2UubmV4dCh7XG4gICAgICBhY3RpdmU6ICd0aXRsZScsXG4gICAgICB1cmwsXG4gICAgICB0aXRsZTogdmFsdWUsXG4gICAgICBsaXN0OiB0aGlzLl9jYWNoZWRcbiAgICB9KTtcbiAgfVxuICAvKiog6I635Y+W5oyH5a6a6Lev5b6E57yT5a2Y5omA5Zyo5L2N572u77yMYC0xYCDooajnpLrml6DnvJPlrZggKi9cbiAgaW5kZXgodXJsOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9jYWNoZWQuZmluZEluZGV4KHcgPT4gdy51cmwgPT09IHVybCk7XG4gIH1cbiAgLyoqIOiOt+WPluaMh+Wumui3r+W+hOe8k+WtmOaYr+WQpuWtmOWcqCAqL1xuICBleGlzdHModXJsOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pbmRleCh1cmwpICE9PSAtMTtcbiAgfVxuICAvKiog6I635Y+W5oyH5a6a6Lev5b6E57yT5a2YICovXG4gIGdldCh1cmw/OiBzdHJpbmcpOiBSZXVzZVRhYkNhY2hlZCB8IG51bGwge1xuICAgIHJldHVybiB1cmwgPyB0aGlzLl9jYWNoZWQuZmluZCh3ID0+IHcudXJsID09PSB1cmwpIHx8IG51bGwgOiBudWxsO1xuICB9XG4gIHByaXZhdGUgcmVtb3ZlKHVybDogc3RyaW5nIHwgbnVtYmVyLCBpbmNsdWRlTm9uQ2xvc2VhYmxlOiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgY29uc3QgaWR4ID0gdHlwZW9mIHVybCA9PT0gJ3N0cmluZycgPyB0aGlzLmluZGV4KHVybCkgOiB1cmw7XG4gICAgY29uc3QgaXRlbSA9IGlkeCAhPT0gLTEgPyB0aGlzLl9jYWNoZWRbaWR4XSA6IG51bGw7XG4gICAgaWYgKCFpdGVtIHx8ICghaW5jbHVkZU5vbkNsb3NlYWJsZSAmJiAhaXRlbS5jbG9zYWJsZSkpIHJldHVybiBmYWxzZTtcblxuICAgIHRoaXMuZGVzdHJveShpdGVtLl9oYW5kbGUpO1xuXG4gICAgdGhpcy5fY2FjaGVkLnNwbGljZShpZHgsIDEpO1xuICAgIGRlbGV0ZSB0aGlzLl90aXRsZUNhY2hlZFt1cmxdO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8qKlxuICAgKiDmoLnmja5VUkznp7vpmaTmoIfnrb5cbiAgICpcbiAgICogQHBhcmFtIFtpbmNsdWRlTm9uQ2xvc2VhYmxlPWZhbHNlXSDmmK/lkKblvLrliLbljIXlkKvkuI3lj6/lhbPpl61cbiAgICovXG4gIGNsb3NlKHVybDogc3RyaW5nLCBpbmNsdWRlTm9uQ2xvc2VhYmxlOiBib29sZWFuID0gZmFsc2UpOiBib29sZWFuIHtcbiAgICB0aGlzLnJlbW92ZVVybEJ1ZmZlciA9IHVybDtcblxuICAgIHRoaXMucmVtb3ZlKHVybCwgaW5jbHVkZU5vbkNsb3NlYWJsZSk7XG5cbiAgICB0aGlzLl9jYWNoZWRDaGFuZ2UubmV4dCh7IGFjdGl2ZTogJ2Nsb3NlJywgdXJsLCBsaXN0OiB0aGlzLl9jYWNoZWQgfSk7XG5cbiAgICB0aGlzLmRpKCdjbG9zZSB0YWcnLCB1cmwpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8qKlxuICAgKiDmuIXpmaTlj7PovrlcbiAgICpcbiAgICogQHBhcmFtIFtpbmNsdWRlTm9uQ2xvc2VhYmxlPWZhbHNlXSDmmK/lkKblvLrliLbljIXlkKvkuI3lj6/lhbPpl61cbiAgICovXG4gIGNsb3NlUmlnaHQodXJsOiBzdHJpbmcsIGluY2x1ZGVOb25DbG9zZWFibGU6IGJvb2xlYW4gPSBmYWxzZSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHN0YXJ0ID0gdGhpcy5pbmRleCh1cmwpO1xuICAgIGZvciAobGV0IGkgPSB0aGlzLmNvdW50IC0gMTsgaSA+IHN0YXJ0OyBpLS0pIHtcbiAgICAgIHRoaXMucmVtb3ZlKGksIGluY2x1ZGVOb25DbG9zZWFibGUpO1xuICAgIH1cblxuICAgIHRoaXMucmVtb3ZlVXJsQnVmZmVyID0gbnVsbDtcblxuICAgIHRoaXMuX2NhY2hlZENoYW5nZS5uZXh0KHsgYWN0aXZlOiAnY2xvc2VSaWdodCcsIHVybCwgbGlzdDogdGhpcy5fY2FjaGVkIH0pO1xuXG4gICAgdGhpcy5kaSgnY2xvc2UgcmlnaHQgdGFnZXMnLCB1cmwpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8qKlxuICAgKiDmuIXpmaTmiYDmnInnvJPlrZhcbiAgICpcbiAgICogQHBhcmFtIFtpbmNsdWRlTm9uQ2xvc2VhYmxlPWZhbHNlXSDmmK/lkKblvLrliLbljIXlkKvkuI3lj6/lhbPpl61cbiAgICovXG4gIGNsZWFyKGluY2x1ZGVOb25DbG9zZWFibGU6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xuICAgIHRoaXMuX2NhY2hlZC5mb3JFYWNoKHcgPT4ge1xuICAgICAgaWYgKCFpbmNsdWRlTm9uQ2xvc2VhYmxlICYmIHcuY2xvc2FibGUpIHRoaXMuZGVzdHJveSh3Ll9oYW5kbGUpO1xuICAgIH0pO1xuICAgIHRoaXMuX2NhY2hlZCA9IHRoaXMuX2NhY2hlZC5maWx0ZXIodyA9PiAhaW5jbHVkZU5vbkNsb3NlYWJsZSAmJiAhdy5jbG9zYWJsZSk7XG5cbiAgICB0aGlzLnJlbW92ZVVybEJ1ZmZlciA9IG51bGw7XG5cbiAgICB0aGlzLl9jYWNoZWRDaGFuZ2UubmV4dCh7IGFjdGl2ZTogJ2NsZWFyJywgbGlzdDogdGhpcy5fY2FjaGVkIH0pO1xuXG4gICAgdGhpcy5kaSgnY2xlYXIgYWxsIGNhdGNoJyk7XG4gIH1cbiAgLyoqXG4gICAqIOenu+WKqOe8k+WtmOaVsOaNrlxuICAgKlxuICAgKiBAcGFyYW0gdXJsIOimgeenu+WKqOeahFVSTOWcsOWdgFxuICAgKiBAcGFyYW0gcG9zaXRpb24g5paw5L2N572u77yM5LiL5qCH5LuOIGAwYCDlvIDlp4tcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgXG4gICAqIC8vIHNvdXJjZVxuICAgKiBbICcvYS8xJywgJy9hLzInLCAnL2EvMycsICcvYS80JywgJy9hLzUnIF1cbiAgICogbW92ZSgnL2EvMScsIDIpO1xuICAgKiAvLyBvdXRwdXRcbiAgICogWyAnL2EvMicsICcvYS8zJywgJy9hLzEnLCAnL2EvNCcsICcvYS81JyBdXG4gICAqIG1vdmUoJy9hLzEnLCAtMSk7XG4gICAqIC8vIG91dHB1dFxuICAgKiBbICcvYS8yJywgJy9hLzMnLCAnL2EvNCcsICcvYS81JywgJy9hLzEnIF1cbiAgICogYGBgXG4gICAqL1xuICBtb3ZlKHVybDogc3RyaW5nLCBwb3NpdGlvbjogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3Qgc3RhcnQgPSB0aGlzLl9jYWNoZWQuZmluZEluZGV4KHcgPT4gdy51cmwgPT09IHVybCk7XG4gICAgaWYgKHN0YXJ0ID09PSAtMSkgcmV0dXJuO1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLl9jYWNoZWQuc2xpY2UoKTtcbiAgICBkYXRhLnNwbGljZShwb3NpdGlvbiA8IDAgPyBkYXRhLmxlbmd0aCArIHBvc2l0aW9uIDogcG9zaXRpb24sIDAsIGRhdGEuc3BsaWNlKHN0YXJ0LCAxKVswXSk7XG4gICAgdGhpcy5fY2FjaGVkID0gZGF0YTtcbiAgICB0aGlzLl9jYWNoZWRDaGFuZ2UubmV4dCh7XG4gICAgICBhY3RpdmU6ICdtb3ZlJyxcbiAgICAgIHVybCxcbiAgICAgIHBvc2l0aW9uLFxuICAgICAgbGlzdDogdGhpcy5fY2FjaGVkXG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIOW8uuWItuWFs+mXreW9k+WJjei3r+eUse+8iOWMheWQq+S4jeWPr+WFs+mXreeKtuaAge+8ie+8jOW5tumHjeaWsOWvvOiIquiHsyBgbmV3VXJsYCDot6/nlLFcbiAgICovXG4gIHJlcGxhY2UobmV3VXJsOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCB1cmwgPSB0aGlzLmN1clVybDtcbiAgICBpZiAodGhpcy5leGlzdHModXJsKSkge1xuICAgICAgdGhpcy5jbG9zZSh1cmwsIHRydWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlbW92ZVVybEJ1ZmZlciA9IHVybDtcbiAgICB9XG4gICAgdGhpcy5pbmplY3Rvci5nZXQ8Um91dGVyPihSb3V0ZXIpLm5hdmlnYXRlQnlVcmwobmV3VXJsKTtcbiAgfVxuICAvKipcbiAgICog6I635Y+W5qCH6aKY77yM6aG65bqP5aaC5LiL77yaXG4gICAqXG4gICAqIDEuIOe7hOS7tuWGheS9v+eUqCBgUmV1c2VUYWJTZXJ2aWNlLnRpdGxlID0gJ25ldyB0aXRsZSdgIOmHjeaWsOaMh+WumuaWh+acrFxuICAgKiAyLiDot6/nlLHphY3nva7kuK0gZGF0YSDlsZ7mgKfkuK3ljIXlkKsgdGl0bGVJMThuID4gdGl0bGVcbiAgICogMy4g6I+c5Y2V5pWw5o2u5LitIHRleHQg5bGe5oCnXG4gICAqXG4gICAqIEBwYXJhbSB1cmwg5oyH5a6aVVJMXG4gICAqIEBwYXJhbSByb3V0ZSDmjIflrprot6/nlLHlv6vnhadcbiAgICovXG4gIGdldFRpdGxlKHVybDogc3RyaW5nLCByb3V0ZT86IEFjdGl2YXRlZFJvdXRlU25hcHNob3QpOiBSZXVzZVRpdGxlIHtcbiAgICBpZiAodGhpcy5fdGl0bGVDYWNoZWRbdXJsXSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3RpdGxlQ2FjaGVkW3VybF07XG4gICAgfVxuXG4gICAgaWYgKHJvdXRlICYmIHJvdXRlLmRhdGEgJiYgKHJvdXRlLmRhdGEudGl0bGVJMThuIHx8IHJvdXRlLmRhdGEudGl0bGUpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0ZXh0OiByb3V0ZS5kYXRhLnRpdGxlLFxuICAgICAgICBpMThuOiByb3V0ZS5kYXRhLnRpdGxlSTE4blxuICAgICAgfSBhcyBSZXVzZVRpdGxlO1xuICAgIH1cblxuICAgIGNvbnN0IG1lbnUgPSB0aGlzLmdldE1lbnUodXJsKTtcbiAgICByZXR1cm4gbWVudSA/IHsgdGV4dDogbWVudS50ZXh0LCBpMThuOiBtZW51LmkxOG4gfSA6IHsgdGV4dDogdXJsIH07XG4gIH1cblxuICAvKipcbiAgICog5riF6Zmk5qCH6aKY57yT5a2YXG4gICAqL1xuICBjbGVhclRpdGxlQ2FjaGVkKCk6IHZvaWQge1xuICAgIHRoaXMuX3RpdGxlQ2FjaGVkID0ge307XG4gIH1cbiAgLyoqIOiHquWumuS5ieW9k+WJjSBgY2xvc2FibGVgIOeKtuaAgSAqL1xuICBzZXQgY2xvc2FibGUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICBjb25zdCB1cmwgPSB0aGlzLmN1clVybDtcbiAgICB0aGlzLl9jbG9zYWJsZUNhY2hlZFt1cmxdID0gdmFsdWU7XG4gICAgdGhpcy5kaSgndXBkYXRlIGN1cnJlbnQgdGFnIGNsb3NhYmxlOiAnLCB2YWx1ZSk7XG4gICAgdGhpcy5fY2FjaGVkQ2hhbmdlLm5leHQoe1xuICAgICAgYWN0aXZlOiAnY2xvc2FibGUnLFxuICAgICAgY2xvc2FibGU6IHZhbHVlLFxuICAgICAgbGlzdDogdGhpcy5fY2FjaGVkXG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIOiOt+WPliBgY2xvc2FibGVgIOeKtuaAge+8jOmhuuW6j+WmguS4i++8mlxuICAgKlxuICAgKiAxLiDnu4Tku7blhoXkvb/nlKggYFJldXNlVGFiU2VydmljZS5jbG9zYWJsZSA9IHRydWVgIOmHjeaWsOaMh+WumiBgY2xvc2FibGVgIOeKtuaAgVxuICAgKiAyLiDot6/nlLHphY3nva7kuK0gZGF0YSDlsZ7mgKfkuK3ljIXlkKsgYHJldXNlQ2xvc2FibGVgXG4gICAqIDMuIOiPnOWNleaVsOaNruS4rSBgcmV1c2VDbG9zYWJsZWAg5bGe5oCnXG4gICAqXG4gICAqIEBwYXJhbSB1cmwg5oyH5a6aVVJMXG4gICAqIEBwYXJhbSByb3V0ZSDmjIflrprot6/nlLHlv6vnhadcbiAgICovXG4gIGdldENsb3NhYmxlKHVybDogc3RyaW5nLCByb3V0ZT86IEFjdGl2YXRlZFJvdXRlU25hcHNob3QpOiBib29sZWFuIHtcbiAgICBpZiAodHlwZW9mIHRoaXMuX2Nsb3NhYmxlQ2FjaGVkW3VybF0gIT09ICd1bmRlZmluZWQnKSByZXR1cm4gdGhpcy5fY2xvc2FibGVDYWNoZWRbdXJsXTtcblxuICAgIGlmIChyb3V0ZSAmJiByb3V0ZS5kYXRhICYmIHR5cGVvZiByb3V0ZS5kYXRhLnJldXNlQ2xvc2FibGUgPT09ICdib29sZWFuJykgcmV0dXJuIHJvdXRlLmRhdGEucmV1c2VDbG9zYWJsZTtcblxuICAgIGNvbnN0IG1lbnUgPSB0aGlzLm1vZGUgIT09IFJldXNlVGFiTWF0Y2hNb2RlLlVSTCA/IHRoaXMuZ2V0TWVudSh1cmwpIDogbnVsbDtcbiAgICBpZiAobWVudSAmJiB0eXBlb2YgbWVudS5yZXVzZUNsb3NhYmxlID09PSAnYm9vbGVhbicpIHJldHVybiBtZW51LnJldXNlQ2xvc2FibGU7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvKipcbiAgICog5riF56m6IGBjbG9zYWJsZWAg57yT5a2YXG4gICAqL1xuICBjbGVhckNsb3NhYmxlQ2FjaGVkKCk6IHZvaWQge1xuICAgIHRoaXMuX2Nsb3NhYmxlQ2FjaGVkID0ge307XG4gIH1cbiAgZ2V0VHJ1dGhSb3V0ZShyb3V0ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCk6IEFjdGl2YXRlZFJvdXRlU25hcHNob3Qge1xuICAgIGxldCBuZXh0ID0gcm91dGU7XG4gICAgd2hpbGUgKG5leHQuZmlyc3RDaGlsZCkgbmV4dCA9IG5leHQuZmlyc3RDaGlsZDtcbiAgICByZXR1cm4gbmV4dDtcbiAgfVxuICAvKipcbiAgICog5qC55o2u5b+r54Wn6I635Y+WVVJM5Zyw5Z2AXG4gICAqL1xuICBnZXRVcmwocm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QpOiBzdHJpbmcge1xuICAgIGxldCBuZXh0ID0gdGhpcy5nZXRUcnV0aFJvdXRlKHJvdXRlKTtcbiAgICBjb25zdCBzZWdtZW50czogc3RyaW5nW10gPSBbXTtcbiAgICB3aGlsZSAobmV4dCkge1xuICAgICAgc2VnbWVudHMucHVzaChuZXh0LnVybC5qb2luKCcvJykpO1xuICAgICAgbmV4dCA9IG5leHQucGFyZW50ITtcbiAgICB9XG4gICAgY29uc3QgdXJsID0gYC8ke3NlZ21lbnRzXG4gICAgICAuZmlsdGVyKGkgPT4gaSlcbiAgICAgIC5yZXZlcnNlKClcbiAgICAgIC5qb2luKCcvJyl9YDtcbiAgICByZXR1cm4gdXJsO1xuICB9XG4gIC8qKlxuICAgKiDmo4Dmn6Xlv6vnhafmmK/lkKblhYHorrjooqvlpI3nlKhcbiAgICovXG4gIGNhbihyb3V0ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHVybCA9IHRoaXMuZ2V0VXJsKHJvdXRlKTtcbiAgICBpZiAodXJsID09PSB0aGlzLnJlbW92ZVVybEJ1ZmZlcikgcmV0dXJuIGZhbHNlO1xuXG4gICAgaWYgKHJvdXRlLmRhdGEgJiYgdHlwZW9mIHJvdXRlLmRhdGEucmV1c2UgPT09ICdib29sZWFuJykgcmV0dXJuIHJvdXRlLmRhdGEucmV1c2U7XG5cbiAgICBpZiAodGhpcy5tb2RlICE9PSBSZXVzZVRhYk1hdGNoTW9kZS5VUkwpIHtcbiAgICAgIGNvbnN0IG1lbnUgPSB0aGlzLmdldE1lbnUodXJsKTtcbiAgICAgIGlmICghbWVudSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaWYgKHRoaXMubW9kZSA9PT0gUmV1c2VUYWJNYXRjaE1vZGUuTWVudSkge1xuICAgICAgICBpZiAobWVudS5yZXVzZSA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICghbWVudS5yZXVzZSB8fCBtZW51LnJldXNlICE9PSB0cnVlKSByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuICF0aGlzLmlzRXhjbHVkZSh1cmwpO1xuICB9XG5cbiAgaXNFeGNsdWRlKHVybDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZXhjbHVkZXMuZmluZEluZGV4KHIgPT4gci50ZXN0KHVybCkpICE9PSAtMTtcbiAgfVxuXG4gIC8qKlxuICAgKiDliLfmlrDvvIzop6blj5HkuIDkuKogcmVmcmVzaCDnsbvlnovkuovku7ZcbiAgICovXG4gIHJlZnJlc2goZGF0YT86IE56U2FmZUFueSk6IHZvaWQge1xuICAgIHRoaXMuX2NhY2hlZENoYW5nZS5uZXh0KHsgYWN0aXZlOiAncmVmcmVzaCcsIGRhdGEgfSk7XG4gIH1cbiAgLy8gI2VuZHJlZ2lvblxuXG4gIC8vICNyZWdpb24gcHJpdmF0ZXNcblxuICBwcml2YXRlIGRlc3Ryb3koX2hhbmRsZTogTnpTYWZlQW55KTogdm9pZCB7XG4gICAgaWYgKF9oYW5kbGUgJiYgX2hhbmRsZS5jb21wb25lbnRSZWYgJiYgX2hhbmRsZS5jb21wb25lbnRSZWYuZGVzdHJveSkgX2hhbmRsZS5jb21wb25lbnRSZWYuZGVzdHJveSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBkaSguLi5hcmdzOiBOelNhZmVBbnlbXSk6IHZvaWQge1xuICAgIGlmICh0eXBlb2YgbmdEZXZNb2RlID09PSAndW5kZWZpbmVkJyB8fCBuZ0Rldk1vZGUpIHtcbiAgICAgIGlmICghdGhpcy5kZWJ1ZykgcmV0dXJuO1xuICAgICAgY29uc29sZS53YXJuKC4uLmFyZ3MpO1xuICAgIH1cbiAgfVxuXG4gIC8vICNlbmRyZWdpb25cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGluamVjdG9yOiBJbmplY3RvcixcbiAgICBwcml2YXRlIG1lbnVTZXJ2aWNlOiBNZW51U2VydmljZSxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFJFVVNFX1RBQl9TVE9SQUdFX0tFWSkgcHJpdmF0ZSBzdGF0ZUtleTogc3RyaW5nLFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoUkVVU0VfVEFCX1NUT1JBR0VfU1RBVEUpIHByaXZhdGUgc3RhdGVTcnY6IFJldXNlVGFiU3RvcmFnZVN0YXRlXG4gICkge31cblxuICBpbml0KCk6IHZvaWQge1xuICAgIHRoaXMuaW5pdFNjcm9sbCgpO1xuICAgIHRoaXMuX2luaXRlZCA9IHRydWU7XG4gICAgdGhpcy5sb2FkU3RhdGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9hZFN0YXRlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zdG9yYWdlU3RhdGUpIHJldHVybjtcblxuICAgIHRoaXMuX2NhY2hlZCA9IHRoaXMuc3RhdGVTcnYuZ2V0KHRoaXMuc3RhdGVLZXkpLm1hcCh2ID0+ICh7XG4gICAgICB0aXRsZTogeyB0ZXh0OiB2LnRpdGxlIH0sXG4gICAgICB1cmw6IHYudXJsLFxuICAgICAgcG9zaXRpb246IHYucG9zaXRpb25cbiAgICB9KSk7XG4gICAgdGhpcy5fY2FjaGVkQ2hhbmdlLm5leHQoeyBhY3RpdmU6ICdsb2FkU3RhdGUnIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRNZW51KHVybDogc3RyaW5nKTogTWVudSB8IG51bGwgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IG1lbnVzID0gdGhpcy5tZW51U2VydmljZS5nZXRQYXRoQnlVcmwodXJsKTtcbiAgICBpZiAoIW1lbnVzIHx8IG1lbnVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIG1lbnVzLnBvcCgpO1xuICB9XG5cbiAgcnVuSG9vayhcbiAgICBtZXRob2Q6IFJldXNlSG9va1R5cGVzLFxuICAgIGNvbXA6IFJldXNlQ29tcG9uZW50UmVmIHwgbnVtYmVyIHwgdW5kZWZpbmVkLFxuICAgIHR5cGU6IFJldXNlSG9va09uUmV1c2VJbml0VHlwZSA9ICdpbml0J1xuICApOiB2b2lkIHtcbiAgICBpZiAodHlwZW9mIGNvbXAgPT09ICdudW1iZXInKSB7XG4gICAgICBjb25zdCBpdGVtID0gdGhpcy5fY2FjaGVkW2NvbXBdO1xuICAgICAgY29tcCA9IGl0ZW0uX2hhbmRsZT8uY29tcG9uZW50UmVmO1xuICAgIH1cbiAgICBpZiAoY29tcCA9PSBudWxsIHx8ICFjb21wLmluc3RhbmNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNvbXBUaGlzID0gY29tcC5pbnN0YW5jZTtcbiAgICBjb25zdCBmbiA9IGNvbXBUaGlzW21ldGhvZF07XG4gICAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAobWV0aG9kID09PSAnX29uUmV1c2VJbml0Jykge1xuICAgICAgZm4uY2FsbChjb21wVGhpcywgdHlwZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIChmbiBhcyAoKSA9PiB2b2lkKS5jYWxsKGNvbXBUaGlzKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhc0luVmFsaWRSb3V0ZShyb3V0ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhcm91dGUucm91dGVDb25maWcgfHwgISFyb3V0ZS5yb3V0ZUNvbmZpZy5sb2FkQ2hpbGRyZW4gfHwgISFyb3V0ZS5yb3V0ZUNvbmZpZy5jaGlsZHJlbjtcbiAgfVxuXG4gIC8qKlxuICAgKiDlhrPlrprmmK/lkKblhYHorrjot6/nlLHlpI3nlKjvvIzoi6UgYHRydWVgIOS8muinpuWPkSBgc3RvcmVgXG4gICAqL1xuICBzaG91bGREZXRhY2gocm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5oYXNJblZhbGlkUm91dGUocm91dGUpKSByZXR1cm4gZmFsc2U7XG4gICAgdGhpcy5kaSgnI3Nob3VsZERldGFjaCcsIHRoaXMuY2FuKHJvdXRlKSwgdGhpcy5nZXRVcmwocm91dGUpKTtcbiAgICByZXR1cm4gdGhpcy5jYW4ocm91dGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIOWtmOWCqFxuICAgKi9cbiAgc3RvcmUoX3NuYXBzaG90OiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LCBfaGFuZGxlOiBOelNhZmVBbnkpOiB2b2lkIHtcbiAgICBjb25zdCB1cmwgPSB0aGlzLmdldFVybChfc25hcHNob3QpO1xuICAgIGNvbnN0IGlkeCA9IHRoaXMuaW5kZXgodXJsKTtcbiAgICBjb25zdCBpc0FkZCA9IGlkeCA9PT0gLTE7XG5cbiAgICBjb25zdCBpdGVtOiBSZXVzZVRhYkNhY2hlZCA9IHtcbiAgICAgIHRpdGxlOiB0aGlzLmdldFRpdGxlKHVybCwgX3NuYXBzaG90KSxcbiAgICAgIGNsb3NhYmxlOiB0aGlzLmdldENsb3NhYmxlKHVybCwgX3NuYXBzaG90KSxcbiAgICAgIHBvc2l0aW9uOiB0aGlzLmdldEtlZXBpbmdTY3JvbGwodXJsLCBfc25hcHNob3QpID8gdGhpcy5wb3NpdGlvbkJ1ZmZlclt1cmxdIDogbnVsbCxcbiAgICAgIHVybCxcbiAgICAgIF9zbmFwc2hvdCxcbiAgICAgIF9oYW5kbGVcbiAgICB9O1xuICAgIGlmIChpc0FkZCkge1xuICAgICAgaWYgKHRoaXMuY291bnQgPj0gdGhpcy5fbWF4KSB7XG4gICAgICAgIC8vIEdldCB0aGUgb2xkZXN0IGNsb3NhYmxlIGxvY2F0aW9uXG4gICAgICAgIGNvbnN0IGNsb3NlSWR4ID0gdGhpcy5fY2FjaGVkLmZpbmRJbmRleCh3ID0+IHcuY2xvc2FibGUhKTtcbiAgICAgICAgaWYgKGNsb3NlSWR4ICE9PSAtMSkgdGhpcy5yZW1vdmUoY2xvc2VJZHgsIGZhbHNlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2NhY2hlZC5wdXNoKGl0ZW0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDdXJyZW50IGhhbmRsZXIgaXMgbnVsbCB3aGVuIGFjdGl2YXRlIHJvdXRlc1xuICAgICAgLy8gRm9yIGJldHRlciByZWxpYWJpbGl0eSwgd2UgbmVlZCB0byB3YWl0IGZvciB0aGUgY29tcG9uZW50IHRvIGJlIGF0dGFjaGVkIGJlZm9yZSBjYWxsIF9vblJldXNlSW5pdFxuICAgICAgY29uc3QgY2FoY2VkQ29tcG9uZW50UmVmID0gdGhpcy5fY2FjaGVkW2lkeF0uX2hhbmRsZT8uY29tcG9uZW50UmVmO1xuICAgICAgaWYgKF9oYW5kbGUgPT0gbnVsbCAmJiBjYWhjZWRDb21wb25lbnRSZWYgIT0gbnVsbCkge1xuICAgICAgICB0aW1lcigxMDApLnN1YnNjcmliZSgoKSA9PiB0aGlzLnJ1bkhvb2soJ19vblJldXNlSW5pdCcsIGNhaGNlZENvbXBvbmVudFJlZikpO1xuICAgICAgfVxuICAgICAgdGhpcy5fY2FjaGVkW2lkeF0gPSBpdGVtO1xuICAgIH1cbiAgICB0aGlzLnJlbW92ZVVybEJ1ZmZlciA9IG51bGw7XG5cbiAgICB0aGlzLmRpKCcjc3RvcmUnLCBpc0FkZCA/ICdbbmV3XScgOiAnW292ZXJyaWRlXScsIHVybCk7XG5cbiAgICBpZiAoX2hhbmRsZSAmJiBfaGFuZGxlLmNvbXBvbmVudFJlZikge1xuICAgICAgdGhpcy5ydW5Ib29rKCdfb25SZXVzZURlc3Ryb3knLCBfaGFuZGxlLmNvbXBvbmVudFJlZik7XG4gICAgfVxuXG4gICAgaWYgKCFpc0FkZCkge1xuICAgICAgdGhpcy5fY2FjaGVkQ2hhbmdlLm5leHQoeyBhY3RpdmU6ICdvdmVycmlkZScsIGl0ZW0sIGxpc3Q6IHRoaXMuX2NhY2hlZCB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5Yaz5a6a5piv5ZCm5YWB6K645bqU55So57yT5a2Y5pWw5o2uXG4gICAqL1xuICBzaG91bGRBdHRhY2gocm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5oYXNJblZhbGlkUm91dGUocm91dGUpKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgdXJsID0gdGhpcy5nZXRVcmwocm91dGUpO1xuICAgIGNvbnN0IGRhdGEgPSB0aGlzLmdldCh1cmwpO1xuICAgIGNvbnN0IHJldCA9ICEhKGRhdGEgJiYgZGF0YS5faGFuZGxlKTtcbiAgICB0aGlzLmRpKCcjc2hvdWxkQXR0YWNoJywgcmV0LCB1cmwpO1xuICAgIGlmICghcmV0KSB7XG4gICAgICB0aGlzLl9jYWNoZWRDaGFuZ2UubmV4dCh7IGFjdGl2ZTogJ2FkZCcsIHVybCwgbGlzdDogdGhpcy5fY2FjaGVkIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgLyoqXG4gICAqIOaPkOWPluWkjeeUqOaVsOaNrlxuICAgKi9cbiAgcmV0cmlldmUocm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QpOiBOelNhZmVBbnkgfCBudWxsIHtcbiAgICBpZiAodGhpcy5oYXNJblZhbGlkUm91dGUocm91dGUpKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCB1cmwgPSB0aGlzLmdldFVybChyb3V0ZSk7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMuZ2V0KHVybCk7XG4gICAgY29uc3QgcmV0ID0gKGRhdGEgJiYgZGF0YS5faGFuZGxlKSB8fCBudWxsO1xuICAgIHRoaXMuZGkoJyNyZXRyaWV2ZScsIHVybCwgcmV0KTtcbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgLyoqXG4gICAqIOWGs+WumuaYr+WQpuW6lOivpei/m+ihjOWkjeeUqOi3r+eUseWkhOeQhlxuICAgKi9cbiAgc2hvdWxkUmV1c2VSb3V0ZShmdXR1cmU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QsIGN1cnI6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QpOiBib29sZWFuIHtcbiAgICBsZXQgcmV0ID0gZnV0dXJlLnJvdXRlQ29uZmlnID09PSBjdXJyLnJvdXRlQ29uZmlnO1xuICAgIGlmICghcmV0KSByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCBwYXRoID0gKChmdXR1cmUucm91dGVDb25maWcgJiYgZnV0dXJlLnJvdXRlQ29uZmlnLnBhdGgpIHx8ICcnKSBhcyBzdHJpbmc7XG4gICAgaWYgKHBhdGgubGVuZ3RoID4gMCAmJiB+cGF0aC5pbmRleE9mKCc6JykpIHtcbiAgICAgIGlmICh0aGlzLnJvdXRlUGFyYW1NYXRjaE1vZGUgPT09ICdzdHJpY3QnKSB7XG4gICAgICAgIHJldCA9IHRoaXMuZ2V0VXJsKGZ1dHVyZSkgPT09IHRoaXMuZ2V0VXJsKGN1cnIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0ID0gcGF0aCA9PT0gKChjdXJyLnJvdXRlQ29uZmlnICYmIGN1cnIucm91dGVDb25maWcucGF0aCkgfHwgJycpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmRpKCc9PT09PT09PT09PT09PT09PT09PT0nKTtcbiAgICB0aGlzLmRpKCcjc2hvdWxkUmV1c2VSb3V0ZScsIHJldCwgYCR7dGhpcy5nZXRVcmwoY3Vycil9PT4ke3RoaXMuZ2V0VXJsKGZ1dHVyZSl9YCwgZnV0dXJlLCBjdXJyKTtcbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgLy8gI3JlZ2lvbiBzY3JvbGxcblxuICAvKipcbiAgICog6I635Y+WIGBrZWVwaW5nU2Nyb2xsYCDnirbmgIHvvIzpobrluo/lpoLkuIvvvJpcbiAgICpcbiAgICogMS4g6Lev55Sx6YWN572u5LitIGRhdGEg5bGe5oCn5Lit5YyF5ZCrIGBrZWVwaW5nU2Nyb2xsYFxuICAgKiAyLiDoj5zljZXmlbDmja7kuK0gYGtlZXBpbmdTY3JvbGxgIOWxnuaAp1xuICAgKiAzLiDnu4Tku7YgYGtlZXBpbmdTY3JvbGxgIOWAvFxuICAgKi9cbiAgZ2V0S2VlcGluZ1Njcm9sbCh1cmw6IHN0cmluZywgcm91dGU/OiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90KTogYm9vbGVhbiB7XG4gICAgaWYgKHJvdXRlICYmIHJvdXRlLmRhdGEgJiYgdHlwZW9mIHJvdXRlLmRhdGEua2VlcGluZ1Njcm9sbCA9PT0gJ2Jvb2xlYW4nKSByZXR1cm4gcm91dGUuZGF0YS5rZWVwaW5nU2Nyb2xsO1xuXG4gICAgY29uc3QgbWVudSA9IHRoaXMubW9kZSAhPT0gUmV1c2VUYWJNYXRjaE1vZGUuVVJMID8gdGhpcy5nZXRNZW51KHVybCkgOiBudWxsO1xuICAgIGlmIChtZW51ICYmIHR5cGVvZiBtZW51LmtlZXBpbmdTY3JvbGwgPT09ICdib29sZWFuJykgcmV0dXJuIG1lbnUua2VlcGluZ1Njcm9sbDtcblxuICAgIHJldHVybiB0aGlzLmtlZXBpbmdTY3JvbGw7XG4gIH1cblxuICBwcml2YXRlIGdldCBpc0Rpc2FibGVkSW5Sb3V0ZXIoKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgcm91dGVyQ29uZmlnID0gdGhpcy5pbmplY3Rvci5nZXQ8RXh0cmFPcHRpb25zPihST1VURVJfQ09ORklHVVJBVElPTiwge30gYXMgTnpTYWZlQW55KTtcbiAgICByZXR1cm4gcm91dGVyQ29uZmlnLnNjcm9sbFBvc2l0aW9uUmVzdG9yYXRpb24gPT09ICdkaXNhYmxlZCc7XG4gIH1cblxuICBwcml2YXRlIGdldCBzcygpOiBTY3JvbGxTZXJ2aWNlIHtcbiAgICByZXR1cm4gdGhpcy5pbmplY3Rvci5nZXQoU2Nyb2xsU2VydmljZSk7XG4gIH1cblxuICBwcml2YXRlIGluaXRTY3JvbGwoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3JvdXRlciQpIHtcbiAgICAgIHRoaXMuX3JvdXRlciQudW5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICB0aGlzLl9yb3V0ZXIkID0gdGhpcy5pbmplY3Rvci5nZXQ8Um91dGVyPihSb3V0ZXIpLmV2ZW50cy5zdWJzY3JpYmUoZSA9PiB7XG4gICAgICBpZiAoZSBpbnN0YW5jZW9mIE5hdmlnYXRpb25TdGFydCkge1xuICAgICAgICBjb25zdCB1cmwgPSB0aGlzLmN1clVybDtcbiAgICAgICAgaWYgKHRoaXMuZ2V0S2VlcGluZ1Njcm9sbCh1cmwsIHRoaXMuZ2V0VHJ1dGhSb3V0ZSh0aGlzLnNuYXBzaG90KSkpIHtcbiAgICAgICAgICB0aGlzLnBvc2l0aW9uQnVmZmVyW3VybF0gPSB0aGlzLnNzLmdldFNjcm9sbFBvc2l0aW9uKHRoaXMua2VlcGluZ1Njcm9sbENvbnRhaW5lcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGVsZXRlIHRoaXMucG9zaXRpb25CdWZmZXJbdXJsXTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgTmF2aWdhdGlvbkVuZCkge1xuICAgICAgICBjb25zdCB1cmwgPSB0aGlzLmN1clVybDtcbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuZ2V0KHVybCk7XG4gICAgICAgIGlmIChpdGVtICYmIGl0ZW0ucG9zaXRpb24gJiYgdGhpcy5nZXRLZWVwaW5nU2Nyb2xsKHVybCwgdGhpcy5nZXRUcnV0aFJvdXRlKHRoaXMuc25hcHNob3QpKSkge1xuICAgICAgICAgIGlmICh0aGlzLmlzRGlzYWJsZWRJblJvdXRlcikge1xuICAgICAgICAgICAgdGhpcy5zcy5zY3JvbGxUb1Bvc2l0aW9uKHRoaXMua2VlcGluZ1Njcm9sbENvbnRhaW5lciwgaXRlbS5wb3NpdGlvbik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zcy5zY3JvbGxUb1Bvc2l0aW9uKHRoaXMua2VlcGluZ1Njcm9sbENvbnRhaW5lciwgaXRlbS5wb3NpdGlvbiEpLCAxKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vICNlbmRyZWdpb25cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBjb25zdCB7IF9jYWNoZWRDaGFuZ2UsIF9yb3V0ZXIkIH0gPSB0aGlzO1xuICAgIHRoaXMuY2xlYXIoKTtcbiAgICB0aGlzLl9jYWNoZWQgPSBbXTtcbiAgICBfY2FjaGVkQ2hhbmdlLmNvbXBsZXRlKCk7XG5cbiAgICBpZiAoX3JvdXRlciQpIHtcbiAgICAgIF9yb3V0ZXIkLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG59XG4iXX0=
|