@angular/cdk 16.0.0-next.4 → 16.0.0-rc.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/a11y/index.d.ts +2 -2
- package/accordion/index.d.ts +2 -2
- package/bidi/index.d.ts +1 -1
- package/clipboard/index.d.ts +1 -1
- package/drag-drop/index.d.ts +6 -6
- package/{esm2020 → esm2022}/a11y/a11y-module.mjs +5 -5
- package/{esm2020 → esm2022}/a11y/aria-describer/aria-describer.mjs +4 -4
- package/{esm2020 → esm2022}/a11y/focus-monitor/focus-monitor.mjs +7 -7
- package/{esm2020 → esm2022}/a11y/focus-trap/configurable-focus-trap-factory.mjs +4 -4
- package/{esm2020 → esm2022}/a11y/focus-trap/focus-trap-manager.mjs +4 -4
- package/{esm2020 → esm2022}/a11y/focus-trap/focus-trap.mjs +7 -7
- package/{esm2020 → esm2022}/a11y/high-contrast-mode/high-contrast-mode-detector.mjs +4 -4
- package/{esm2020 → esm2022}/a11y/input-modality/input-modality-detector.mjs +4 -4
- package/{esm2020 → esm2022}/a11y/interactivity-checker/interactivity-checker.mjs +4 -4
- package/{esm2020 → esm2022}/a11y/live-announcer/live-announcer.mjs +7 -7
- package/{esm2020 → esm2022}/accordion/accordion-item.mjs +8 -8
- package/{esm2020 → esm2022}/accordion/accordion-module.mjs +5 -5
- package/{esm2020 → esm2022}/accordion/accordion.mjs +4 -4
- package/{esm2020 → esm2022}/bidi/bidi-module.mjs +5 -5
- package/{esm2020 → esm2022}/bidi/dir.mjs +4 -4
- package/{esm2020 → esm2022}/bidi/directionality.mjs +4 -4
- package/{esm2020 → esm2022}/clipboard/clipboard-module.mjs +5 -5
- package/{esm2020 → esm2022}/clipboard/clipboard.mjs +4 -4
- package/{esm2020 → esm2022}/clipboard/copy-to-clipboard.mjs +4 -4
- package/{esm2020 → esm2022}/collections/unique-selection-dispatcher.mjs +4 -4
- package/{esm2020 → esm2022}/dialog/dialog-container.mjs +4 -4
- package/{esm2020 → esm2022}/dialog/dialog-module.mjs +12 -12
- package/{esm2020 → esm2022}/dialog/dialog.mjs +4 -4
- package/{esm2020 → esm2022}/drag-drop/directives/drag-handle.mjs +4 -4
- package/{esm2020 → esm2022}/drag-drop/directives/drag-placeholder.mjs +4 -4
- package/{esm2020 → esm2022}/drag-drop/directives/drag-preview.mjs +4 -4
- package/esm2022/drag-drop/directives/drag.mjs +489 -0
- package/{esm2020 → esm2022}/drag-drop/directives/drop-list-group.mjs +4 -4
- package/esm2022/drag-drop/directives/drop-list.mjs +348 -0
- package/{esm2020 → esm2022}/drag-drop/drag-drop-module.mjs +15 -15
- package/{esm2020 → esm2022}/drag-drop/drag-drop-registry.mjs +4 -4
- package/{esm2020 → esm2022}/drag-drop/drag-drop.mjs +4 -4
- package/{esm2020 → esm2022}/layout/breakpoints-observer.mjs +4 -4
- package/{esm2020 → esm2022}/layout/layout-module.mjs +5 -5
- package/{esm2020 → esm2022}/layout/media-matcher.mjs +4 -4
- package/{esm2020 → esm2022}/listbox/listbox-module.mjs +5 -5
- package/{esm2020 → esm2022}/listbox/listbox.mjs +13 -13
- package/{esm2020 → esm2022}/menu/context-menu-trigger.mjs +10 -10
- package/{esm2020 → esm2022}/menu/menu-aim.mjs +7 -7
- package/{esm2020 → esm2022}/menu/menu-bar.mjs +8 -8
- package/{esm2020 → esm2022}/menu/menu-base.mjs +4 -4
- package/{esm2020 → esm2022}/menu/menu-group.mjs +4 -4
- package/{esm2020 → esm2022}/menu/menu-item-checkbox.mjs +7 -7
- package/{esm2020 → esm2022}/menu/menu-item-radio.mjs +7 -7
- package/{esm2020 → esm2022}/menu/menu-item-selectable.mjs +4 -4
- package/{esm2020 → esm2022}/menu/menu-item.mjs +4 -4
- package/{esm2020 → esm2022}/menu/menu-module.mjs +21 -21
- package/{esm2020 → esm2022}/menu/menu-stack.mjs +4 -4
- package/{esm2020 → esm2022}/menu/menu-trigger-base.mjs +4 -4
- package/esm2022/menu/menu-trigger.mjs +307 -0
- package/{esm2020 → esm2022}/menu/menu.mjs +8 -8
- package/{esm2020 → esm2022}/observers/observe-content.mjs +14 -14
- package/{esm2020 → esm2022}/overlay/dispatchers/base-overlay-dispatcher.mjs +4 -4
- package/{esm2020 → esm2022}/overlay/dispatchers/overlay-keyboard-dispatcher.mjs +4 -4
- package/{esm2020 → esm2022}/overlay/dispatchers/overlay-outside-click-dispatcher.mjs +4 -4
- package/{esm2020 → esm2022}/overlay/fullscreen-overlay-container.mjs +4 -4
- package/{esm2020 → esm2022}/overlay/overlay-container.mjs +4 -4
- package/{esm2020 → esm2022}/overlay/overlay-directives.mjs +7 -7
- package/{esm2020 → esm2022}/overlay/overlay-module.mjs +5 -5
- package/{esm2020 → esm2022}/overlay/overlay.mjs +4 -4
- package/{esm2020 → esm2022}/overlay/position/overlay-position-builder.mjs +4 -4
- package/{esm2020 → esm2022}/overlay/scroll/scroll-strategy-options.mjs +4 -4
- package/{esm2020 → esm2022}/platform/platform-module.mjs +5 -5
- package/{esm2020 → esm2022}/platform/platform.mjs +4 -4
- package/esm2022/portal/portal-directives.mjs +250 -0
- package/{esm2020 → esm2022}/scrolling/fixed-size-virtual-scroll.mjs +10 -10
- package/{esm2020 → esm2022}/scrolling/scroll-dispatcher.mjs +4 -4
- package/{esm2020 → esm2022}/scrolling/scrollable.mjs +4 -4
- package/{esm2020 → esm2022}/scrolling/scrolling-module.mjs +19 -19
- package/{esm2020 → esm2022}/scrolling/viewport-ruler.mjs +4 -4
- package/{esm2020 → esm2022}/scrolling/virtual-for-of.mjs +4 -4
- package/{esm2020 → esm2022}/scrolling/virtual-scroll-viewport.mjs +10 -10
- package/{esm2020 → esm2022}/scrolling/virtual-scrollable-element.mjs +4 -4
- package/{esm2020 → esm2022}/scrolling/virtual-scrollable-window.mjs +4 -4
- package/{esm2020 → esm2022}/scrolling/virtual-scrollable.mjs +4 -4
- package/{esm2020 → esm2022}/stepper/step-header.mjs +4 -4
- package/{esm2020 → esm2022}/stepper/step-label.mjs +4 -4
- package/{esm2020 → esm2022}/stepper/stepper-button.mjs +7 -7
- package/{esm2020 → esm2022}/stepper/stepper-module.mjs +10 -10
- package/{esm2020 → esm2022}/stepper/stepper.mjs +7 -7
- package/{esm2020 → esm2022}/table/cell.mjs +22 -22
- package/{esm2020 → esm2022}/table/coalesced-style-scheduler.mjs +4 -4
- package/esm2022/table/row.mjs +271 -0
- package/{esm2020 → esm2022}/table/table-module.mjs +47 -47
- package/{esm2020 → esm2022}/table/table.mjs +25 -25
- package/{esm2020 → esm2022}/table/text-column.mjs +6 -6
- package/{esm2020 → esm2022}/text-field/autofill.mjs +7 -7
- package/{esm2020 → esm2022}/text-field/autosize.mjs +4 -4
- package/{esm2020 → esm2022}/text-field/text-field-module.mjs +5 -5
- package/{esm2020 → esm2022}/tree/nested-node.mjs +7 -7
- package/{esm2020 → esm2022}/tree/node.mjs +4 -4
- package/{esm2020 → esm2022}/tree/outlet.mjs +4 -4
- package/{esm2020 → esm2022}/tree/padding.mjs +4 -4
- package/{esm2020 → esm2022}/tree/toggle.mjs +4 -4
- package/{esm2020 → esm2022}/tree/tree-module.mjs +17 -17
- package/esm2022/tree/tree.mjs +349 -0
- package/{esm2020 → esm2022}/version.mjs +1 -1
- package/{fesm2020 → fesm2022}/a11y.mjs +40 -197
- package/fesm2022/a11y.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/accordion.mjs +14 -51
- package/fesm2022/accordion.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/bidi.mjs +10 -54
- package/fesm2022/bidi.mjs.map +1 -0
- package/fesm2022/cdk.mjs +7 -0
- package/fesm2022/cdk.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/clipboard.mjs +10 -54
- package/fesm2022/clipboard.mjs.map +1 -0
- package/{fesm2015 → fesm2022}/coercion.mjs +0 -58
- package/fesm2022/coercion.mjs.map +1 -0
- package/{fesm2015 → fesm2022}/collections.mjs +5 -70
- package/fesm2022/collections.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/dialog.mjs +17 -75
- package/fesm2022/dialog.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/drag-drop.mjs +45 -216
- package/fesm2022/drag-drop.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/keycodes.mjs +0 -30
- package/fesm2022/keycodes.mjs.map +1 -0
- package/{fesm2015 → fesm2022}/layout.mjs +10 -54
- package/fesm2022/layout.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/listbox.mjs +16 -46
- package/fesm2022/listbox.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/menu.mjs +86 -220
- package/fesm2022/menu.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/observers.mjs +13 -36
- package/fesm2022/observers.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/overlay.mjs +34 -206
- package/fesm2022/overlay.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/platform.mjs +7 -72
- package/fesm2022/platform.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/portal.mjs +26 -77
- package/fesm2022/portal.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/scrolling.mjs +57 -158
- package/fesm2022/scrolling.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/stepper.mjs +27 -78
- package/fesm2022/stepper.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/table.mjs +134 -227
- package/fesm2022/table.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/testing/selenium-webdriver.mjs +0 -37
- package/fesm2022/testing/selenium-webdriver.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/testing/testbed.mjs +1 -72
- package/fesm2022/testing/testbed.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/testing.mjs +0 -66
- package/fesm2022/testing.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/text-field.mjs +13 -50
- package/fesm2022/text-field.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/tree.mjs +45 -131
- package/fesm2022/tree.mjs.map +1 -0
- package/listbox/index.d.ts +2 -2
- package/menu/index.d.ts +5 -5
- package/observers/index.d.ts +1 -1
- package/overlay/index.d.ts +1 -1
- package/package.json +77 -131
- package/portal/index.d.ts +2 -2
- package/schematics/ng-add/index.js +1 -1
- package/schematics/ng-add/index.mjs +1 -1
- package/schematics/ng-update/devkit-file-system.js +3 -2
- package/schematics/ng-update/devkit-file-system.mjs +3 -2
- package/schematics/ng-update/migrations/attribute-selectors.js +5 -8
- package/schematics/ng-update/migrations/attribute-selectors.mjs +5 -8
- package/schematics/ng-update/migrations/class-inheritance.js +8 -11
- package/schematics/ng-update/migrations/class-inheritance.mjs +8 -11
- package/schematics/ng-update/migrations/class-names.js +12 -15
- package/schematics/ng-update/migrations/class-names.mjs +12 -15
- package/schematics/ng-update/migrations/constructor-signature.js +7 -10
- package/schematics/ng-update/migrations/constructor-signature.mjs +7 -10
- package/schematics/ng-update/migrations/css-selectors.js +5 -8
- package/schematics/ng-update/migrations/css-selectors.mjs +5 -8
- package/schematics/ng-update/migrations/element-selectors.js +5 -8
- package/schematics/ng-update/migrations/element-selectors.mjs +5 -8
- package/schematics/ng-update/migrations/input-names.js +5 -8
- package/schematics/ng-update/migrations/input-names.mjs +5 -8
- package/schematics/ng-update/migrations/method-call-arguments.js +5 -8
- package/schematics/ng-update/migrations/method-call-arguments.mjs +5 -8
- package/schematics/ng-update/migrations/misc-template.js +3 -6
- package/schematics/ng-update/migrations/misc-template.mjs +3 -6
- package/schematics/ng-update/migrations/output-names.js +5 -8
- package/schematics/ng-update/migrations/output-names.mjs +5 -8
- package/schematics/ng-update/migrations/property-names.js +5 -8
- package/schematics/ng-update/migrations/property-names.mjs +5 -8
- package/schematics/ng-update/migrations/symbol-removal.js +5 -8
- package/schematics/ng-update/migrations/symbol-removal.mjs +5 -8
- package/schematics/update-tool/component-resource-collector.js +5 -3
- package/schematics/update-tool/component-resource-collector.mjs +5 -3
- package/schematics/update-tool/index.js +8 -2
- package/schematics/update-tool/index.mjs +8 -2
- package/schematics/update-tool/migration.js +10 -3
- package/schematics/update-tool/migration.mjs +10 -3
- package/schematics/update-tool/utils/virtual-host.js +3 -2
- package/schematics/update-tool/utils/virtual-host.mjs +3 -2
- package/scrolling/index.d.ts +3 -3
- package/stepper/index.d.ts +4 -4
- package/table/index.d.ts +6 -6
- package/text-field/index.d.ts +1 -1
- package/tree/index.d.ts +6 -6
- package/esm2020/drag-drop/directives/drag.mjs +0 -489
- package/esm2020/drag-drop/directives/drop-list.mjs +0 -348
- package/esm2020/menu/menu-trigger.mjs +0 -306
- package/esm2020/portal/portal-directives.mjs +0 -250
- package/esm2020/table/row.mjs +0 -271
- package/esm2020/tree/tree.mjs +0 -349
- package/fesm2015/a11y.mjs +0 -2544
- package/fesm2015/a11y.mjs.map +0 -1
- package/fesm2015/accordion.mjs +0 -275
- package/fesm2015/accordion.mjs.map +0 -1
- package/fesm2015/bidi.mjs +0 -194
- package/fesm2015/bidi.mjs.map +0 -1
- package/fesm2015/cdk.mjs +0 -30
- package/fesm2015/cdk.mjs.map +0 -1
- package/fesm2015/clipboard.mjs +0 -263
- package/fesm2015/clipboard.mjs.map +0 -1
- package/fesm2015/coercion.mjs.map +0 -1
- package/fesm2015/collections.mjs.map +0 -1
- package/fesm2015/dialog.mjs +0 -800
- package/fesm2015/dialog.mjs.map +0 -1
- package/fesm2015/drag-drop.mjs +0 -3823
- package/fesm2015/drag-drop.mjs.map +0 -1
- package/fesm2015/keycodes.mjs +0 -167
- package/fesm2015/keycodes.mjs.map +0 -1
- package/fesm2015/layout.mjs.map +0 -1
- package/fesm2015/listbox.mjs +0 -918
- package/fesm2015/listbox.mjs.map +0 -1
- package/fesm2015/menu.mjs +0 -2009
- package/fesm2015/menu.mjs.map +0 -1
- package/fesm2015/observers.mjs +0 -211
- package/fesm2015/observers.mjs.map +0 -1
- package/fesm2015/overlay.mjs +0 -3142
- package/fesm2015/overlay.mjs.map +0 -1
- package/fesm2015/platform.mjs +0 -385
- package/fesm2015/platform.mjs.map +0 -1
- package/fesm2015/portal.mjs +0 -691
- package/fesm2015/portal.mjs.map +0 -1
- package/fesm2015/scrolling.mjs +0 -1566
- package/fesm2015/scrolling.mjs.map +0 -1
- package/fesm2015/stepper.mjs +0 -621
- package/fesm2015/stepper.mjs.map +0 -1
- package/fesm2015/table.mjs +0 -2357
- package/fesm2015/table.mjs.map +0 -1
- package/fesm2015/testing/selenium-webdriver.mjs +0 -419
- package/fesm2015/testing/selenium-webdriver.mjs.map +0 -1
- package/fesm2015/testing/testbed.mjs +0 -868
- package/fesm2015/testing/testbed.mjs.map +0 -1
- package/fesm2015/testing.mjs +0 -785
- package/fesm2015/testing.mjs.map +0 -1
- package/fesm2015/text-field.mjs +0 -461
- package/fesm2015/text-field.mjs.map +0 -1
- package/fesm2015/tree.mjs +0 -950
- package/fesm2015/tree.mjs.map +0 -1
- package/fesm2020/a11y.mjs.map +0 -1
- package/fesm2020/accordion.mjs.map +0 -1
- package/fesm2020/bidi.mjs.map +0 -1
- package/fesm2020/cdk.mjs +0 -30
- package/fesm2020/cdk.mjs.map +0 -1
- package/fesm2020/clipboard.mjs.map +0 -1
- package/fesm2020/coercion.mjs +0 -132
- package/fesm2020/coercion.mjs.map +0 -1
- package/fesm2020/collections.mjs +0 -543
- package/fesm2020/collections.mjs.map +0 -1
- package/fesm2020/dialog.mjs.map +0 -1
- package/fesm2020/drag-drop.mjs.map +0 -1
- package/fesm2020/keycodes.mjs.map +0 -1
- package/fesm2020/layout.mjs +0 -254
- package/fesm2020/layout.mjs.map +0 -1
- package/fesm2020/listbox.mjs.map +0 -1
- package/fesm2020/menu.mjs.map +0 -1
- package/fesm2020/observers.mjs.map +0 -1
- package/fesm2020/overlay.mjs.map +0 -1
- package/fesm2020/platform.mjs.map +0 -1
- package/fesm2020/portal.mjs.map +0 -1
- package/fesm2020/scrolling.mjs.map +0 -1
- package/fesm2020/stepper.mjs.map +0 -1
- package/fesm2020/table.mjs.map +0 -1
- package/fesm2020/testing/selenium-webdriver.mjs.map +0 -1
- package/fesm2020/testing/testbed.mjs.map +0 -1
- package/fesm2020/testing.mjs.map +0 -1
- package/fesm2020/text-field.mjs.map +0 -1
- package/fesm2020/tree.mjs.map +0 -1
- /package/{esm2020 → esm2022}/a11y/a11y_public_index.mjs +0 -0
- /package/{esm2020 → esm2022}/a11y/aria-describer/aria-reference.mjs +0 -0
- /package/{esm2020 → esm2022}/a11y/fake-event-detection.mjs +0 -0
- /package/{esm2020 → esm2022}/a11y/focus-trap/configurable-focus-trap-config.mjs +0 -0
- /package/{esm2020 → esm2022}/a11y/focus-trap/configurable-focus-trap.mjs +0 -0
- /package/{esm2020 → esm2022}/a11y/focus-trap/event-listener-inert-strategy.mjs +0 -0
- /package/{esm2020 → esm2022}/a11y/focus-trap/focus-trap-inert-strategy.mjs +0 -0
- /package/{esm2020 → esm2022}/a11y/index.mjs +0 -0
- /package/{esm2020 → esm2022}/a11y/key-manager/activedescendant-key-manager.mjs +0 -0
- /package/{esm2020 → esm2022}/a11y/key-manager/focus-key-manager.mjs +0 -0
- /package/{esm2020 → esm2022}/a11y/key-manager/list-key-manager.mjs +0 -0
- /package/{esm2020 → esm2022}/a11y/live-announcer/live-announcer-tokens.mjs +0 -0
- /package/{esm2020 → esm2022}/a11y/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/accordion/accordion_public_index.mjs +0 -0
- /package/{esm2020 → esm2022}/accordion/index.mjs +0 -0
- /package/{esm2020 → esm2022}/accordion/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/bidi/bidi_public_index.mjs +0 -0
- /package/{esm2020 → esm2022}/bidi/dir-document-token.mjs +0 -0
- /package/{esm2020 → esm2022}/bidi/index.mjs +0 -0
- /package/{esm2020 → esm2022}/bidi/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/clipboard/clipboard_public_index.mjs +0 -0
- /package/{esm2020 → esm2022}/clipboard/index.mjs +0 -0
- /package/{esm2020 → esm2022}/clipboard/pending-copy.mjs +0 -0
- /package/{esm2020 → esm2022}/clipboard/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/coercion/array.mjs +0 -0
- /package/{esm2020 → esm2022}/coercion/boolean-property.mjs +0 -0
- /package/{esm2020 → esm2022}/coercion/css-pixel-value.mjs +0 -0
- /package/{esm2020 → esm2022}/coercion/element.mjs +0 -0
- /package/{esm2020 → esm2022}/coercion/index.mjs +0 -0
- /package/{esm2020 → esm2022}/coercion/number-property.mjs +0 -0
- /package/{esm2020 → esm2022}/coercion/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/coercion/string-array.mjs +0 -0
- /package/{esm2020 → esm2022}/collections/array-data-source.mjs +0 -0
- /package/{esm2020 → esm2022}/collections/collection-viewer.mjs +0 -0
- /package/{esm2020 → esm2022}/collections/collections_public_index.mjs +0 -0
- /package/{esm2020 → esm2022}/collections/data-source.mjs +0 -0
- /package/{esm2020 → esm2022}/collections/dispose-view-repeater-strategy.mjs +0 -0
- /package/{esm2020 → esm2022}/collections/index.mjs +0 -0
- /package/{esm2020 → esm2022}/collections/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/collections/recycle-view-repeater-strategy.mjs +0 -0
- /package/{esm2020 → esm2022}/collections/selection-model.mjs +0 -0
- /package/{esm2020 → esm2022}/collections/tree-adapter.mjs +0 -0
- /package/{esm2020 → esm2022}/collections/view-repeater.mjs +0 -0
- /package/{esm2020 → esm2022}/dialog/dialog-config.mjs +0 -0
- /package/{esm2020 → esm2022}/dialog/dialog-injectors.mjs +0 -0
- /package/{esm2020 → esm2022}/dialog/dialog-ref.mjs +0 -0
- /package/{esm2020 → esm2022}/dialog/dialog_public_index.mjs +0 -0
- /package/{esm2020 → esm2022}/dialog/index.mjs +0 -0
- /package/{esm2020 → esm2022}/dialog/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/drag-drop/directives/assertions.mjs +0 -0
- /package/{esm2020 → esm2022}/drag-drop/directives/config.mjs +0 -0
- /package/{esm2020 → esm2022}/drag-drop/dom/client-rect.mjs +0 -0
- /package/{esm2020 → esm2022}/drag-drop/dom/clone-node.mjs +0 -0
- /package/{esm2020 → esm2022}/drag-drop/dom/parent-position-tracker.mjs +0 -0
- /package/{esm2020 → esm2022}/drag-drop/dom/styling.mjs +0 -0
- /package/{esm2020 → esm2022}/drag-drop/dom/transition-duration.mjs +0 -0
- /package/{esm2020 → esm2022}/drag-drop/drag-drop_public_index.mjs +0 -0
- /package/{esm2020 → esm2022}/drag-drop/drag-events.mjs +0 -0
- /package/{esm2020 → esm2022}/drag-drop/drag-parent.mjs +0 -0
- /package/{esm2020 → esm2022}/drag-drop/drag-ref.mjs +0 -0
- /package/{esm2020 → esm2022}/drag-drop/drag-utils.mjs +0 -0
- /package/{esm2020 → esm2022}/drag-drop/drop-list-ref.mjs +0 -0
- /package/{esm2020 → esm2022}/drag-drop/index.mjs +0 -0
- /package/{esm2020 → esm2022}/drag-drop/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/drag-drop/sorting/drop-list-sort-strategy.mjs +0 -0
- /package/{esm2020 → esm2022}/drag-drop/sorting/single-axis-sort-strategy.mjs +0 -0
- /package/{esm2020 → esm2022}/index.mjs +0 -0
- /package/{esm2020 → esm2022}/keycodes/index.mjs +0 -0
- /package/{esm2020 → esm2022}/keycodes/keycodes.mjs +0 -0
- /package/{esm2020 → esm2022}/keycodes/keycodes_public_index.mjs +0 -0
- /package/{esm2020 → esm2022}/keycodes/modifiers.mjs +0 -0
- /package/{esm2020 → esm2022}/keycodes/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/layout/breakpoints.mjs +0 -0
- /package/{esm2020 → esm2022}/layout/index.mjs +0 -0
- /package/{esm2020 → esm2022}/layout/layout_public_index.mjs +0 -0
- /package/{esm2020 → esm2022}/layout/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/listbox/index.mjs +0 -0
- /package/{esm2020 → esm2022}/listbox/listbox_public_index.mjs +0 -0
- /package/{esm2020 → esm2022}/listbox/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/menu/index.mjs +0 -0
- /package/{esm2020 → esm2022}/menu/menu-errors.mjs +0 -0
- /package/{esm2020 → esm2022}/menu/menu-interface.mjs +0 -0
- /package/{esm2020 → esm2022}/menu/menu_public_index.mjs +0 -0
- /package/{esm2020 → esm2022}/menu/pointer-focus-tracker.mjs +0 -0
- /package/{esm2020 → esm2022}/menu/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/observers/index.mjs +0 -0
- /package/{esm2020 → esm2022}/observers/observers_public_index.mjs +0 -0
- /package/{esm2020 → esm2022}/observers/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/overlay/dispatchers/index.mjs +0 -0
- /package/{esm2020 → esm2022}/overlay/index.mjs +0 -0
- /package/{esm2020 → esm2022}/overlay/overlay-config.mjs +0 -0
- /package/{esm2020 → esm2022}/overlay/overlay-ref.mjs +0 -0
- /package/{esm2020 → esm2022}/overlay/overlay-reference.mjs +0 -0
- /package/{esm2020 → esm2022}/overlay/overlay_public_index.mjs +0 -0
- /package/{esm2020 → esm2022}/overlay/position/connected-position.mjs +0 -0
- /package/{esm2020 → esm2022}/overlay/position/flexible-connected-position-strategy.mjs +0 -0
- /package/{esm2020 → esm2022}/overlay/position/global-position-strategy.mjs +0 -0
- /package/{esm2020 → esm2022}/overlay/position/position-strategy.mjs +0 -0
- /package/{esm2020 → esm2022}/overlay/position/scroll-clip.mjs +0 -0
- /package/{esm2020 → esm2022}/overlay/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/overlay/scroll/block-scroll-strategy.mjs +0 -0
- /package/{esm2020 → esm2022}/overlay/scroll/close-scroll-strategy.mjs +0 -0
- /package/{esm2020 → esm2022}/overlay/scroll/index.mjs +0 -0
- /package/{esm2020 → esm2022}/overlay/scroll/noop-scroll-strategy.mjs +0 -0
- /package/{esm2020 → esm2022}/overlay/scroll/reposition-scroll-strategy.mjs +0 -0
- /package/{esm2020 → esm2022}/overlay/scroll/scroll-strategy.mjs +0 -0
- /package/{esm2020 → esm2022}/platform/features/input-types.mjs +0 -0
- /package/{esm2020 → esm2022}/platform/features/passive-listeners.mjs +0 -0
- /package/{esm2020 → esm2022}/platform/features/scrolling.mjs +0 -0
- /package/{esm2020 → esm2022}/platform/features/shadow-dom.mjs +0 -0
- /package/{esm2020 → esm2022}/platform/features/test-environment.mjs +0 -0
- /package/{esm2020 → esm2022}/platform/index.mjs +0 -0
- /package/{esm2020 → esm2022}/platform/platform_public_index.mjs +0 -0
- /package/{esm2020 → esm2022}/platform/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/portal/dom-portal-outlet.mjs +0 -0
- /package/{esm2020 → esm2022}/portal/index.mjs +0 -0
- /package/{esm2020 → esm2022}/portal/portal-errors.mjs +0 -0
- /package/{esm2020 → esm2022}/portal/portal-injector.mjs +0 -0
- /package/{esm2020 → esm2022}/portal/portal.mjs +0 -0
- /package/{esm2020 → esm2022}/portal/portal_public_index.mjs +0 -0
- /package/{esm2020 → esm2022}/portal/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/scrolling/index.mjs +0 -0
- /package/{esm2020 → esm2022}/scrolling/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/scrolling/scrolling_public_index.mjs +0 -0
- /package/{esm2020 → esm2022}/scrolling/virtual-scroll-repeater.mjs +0 -0
- /package/{esm2020 → esm2022}/scrolling/virtual-scroll-strategy.mjs +0 -0
- /package/{esm2020 → esm2022}/stepper/index.mjs +0 -0
- /package/{esm2020 → esm2022}/stepper/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/stepper/stepper_public_index.mjs +0 -0
- /package/{esm2020 → esm2022}/table/can-stick.mjs +0 -0
- /package/{esm2020 → esm2022}/table/index.mjs +0 -0
- /package/{esm2020 → esm2022}/table/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/table/sticky-position-listener.mjs +0 -0
- /package/{esm2020 → esm2022}/table/sticky-styler.mjs +0 -0
- /package/{esm2020 → esm2022}/table/table-errors.mjs +0 -0
- /package/{esm2020 → esm2022}/table/table_public_index.mjs +0 -0
- /package/{esm2020 → esm2022}/table/tokens.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/change-detection.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/component-harness.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/element-dimensions.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/harness-environment.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/index.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/selenium-webdriver/index.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/selenium-webdriver/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/selenium-webdriver/selenium-web-driver-element.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/selenium-webdriver/selenium-web-driver-harness-environment.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/selenium-webdriver/selenium-webdriver-keys.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/test-element-errors.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/test-element.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/testbed/fake-events/dispatch-events.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/testbed/fake-events/element-focus.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/testbed/fake-events/event-objects.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/testbed/fake-events/index.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/testbed/fake-events/type-in-element.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/testbed/index.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/testbed/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/testbed/task-state-zone-interceptor.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/testbed/testbed-harness-environment.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/testbed/unit-test-element.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/text-filtering.mjs +0 -0
- /package/{esm2020 → esm2022}/text-field/index.mjs +0 -0
- /package/{esm2020 → esm2022}/text-field/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/text-field/text-field_public_index.mjs +0 -0
- /package/{esm2020 → esm2022}/tree/control/base-tree-control.mjs +0 -0
- /package/{esm2020 → esm2022}/tree/control/flat-tree-control.mjs +0 -0
- /package/{esm2020 → esm2022}/tree/control/nested-tree-control.mjs +0 -0
- /package/{esm2020 → esm2022}/tree/control/tree-control.mjs +0 -0
- /package/{esm2020 → esm2022}/tree/index.mjs +0 -0
- /package/{esm2020 → esm2022}/tree/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/tree/tree-errors.mjs +0 -0
- /package/{esm2020 → esm2022}/tree/tree_public_index.mjs +0 -0
package/esm2020/tree/tree.mjs
DELETED
|
@@ -1,349 +0,0 @@
|
|
|
1
|
-
import { isDataSource } from '@angular/cdk/collections';
|
|
2
|
-
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChildren, Directive, ElementRef, Input, IterableDiffers, QueryList, ViewChild, ViewEncapsulation, } from '@angular/core';
|
|
3
|
-
import { BehaviorSubject, isObservable, of as observableOf, Subject, } from 'rxjs';
|
|
4
|
-
import { takeUntil } from 'rxjs/operators';
|
|
5
|
-
import { CdkTreeNodeDef, CdkTreeNodeOutletContext } from './node';
|
|
6
|
-
import { CdkTreeNodeOutlet } from './outlet';
|
|
7
|
-
import { getTreeControlFunctionsMissingError, getTreeControlMissingError, getTreeMissingMatchingNodeDefError, getTreeMultipleDefaultNodeDefsError, getTreeNoValidDataSourceError, } from './tree-errors';
|
|
8
|
-
import { coerceNumberProperty } from '@angular/cdk/coercion';
|
|
9
|
-
import * as i0 from "@angular/core";
|
|
10
|
-
import * as i1 from "./outlet";
|
|
11
|
-
/**
|
|
12
|
-
* CDK tree component that connects with a data source to retrieve data of type `T` and renders
|
|
13
|
-
* dataNodes with hierarchy. Updates the dataNodes when new data is provided by the data source.
|
|
14
|
-
*/
|
|
15
|
-
class CdkTree {
|
|
16
|
-
/**
|
|
17
|
-
* Provides a stream containing the latest data array to render. Influenced by the tree's
|
|
18
|
-
* stream of view window (what dataNodes are currently on screen).
|
|
19
|
-
* Data source can be an observable of data array, or a data array to render.
|
|
20
|
-
*/
|
|
21
|
-
get dataSource() {
|
|
22
|
-
return this._dataSource;
|
|
23
|
-
}
|
|
24
|
-
set dataSource(dataSource) {
|
|
25
|
-
if (this._dataSource !== dataSource) {
|
|
26
|
-
this._switchDataSource(dataSource);
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
constructor(_differs, _changeDetectorRef) {
|
|
30
|
-
this._differs = _differs;
|
|
31
|
-
this._changeDetectorRef = _changeDetectorRef;
|
|
32
|
-
/** Subject that emits when the component has been destroyed. */
|
|
33
|
-
this._onDestroy = new Subject();
|
|
34
|
-
/** Level of nodes */
|
|
35
|
-
this._levels = new Map();
|
|
36
|
-
// TODO(tinayuangao): Setup a listener for scrolling, emit the calculated view to viewChange.
|
|
37
|
-
// Remove the MAX_VALUE in viewChange
|
|
38
|
-
/**
|
|
39
|
-
* Stream containing the latest information on what rows are being displayed on screen.
|
|
40
|
-
* Can be used by the data source to as a heuristic of what data should be provided.
|
|
41
|
-
*/
|
|
42
|
-
this.viewChange = new BehaviorSubject({
|
|
43
|
-
start: 0,
|
|
44
|
-
end: Number.MAX_VALUE,
|
|
45
|
-
});
|
|
46
|
-
}
|
|
47
|
-
ngOnInit() {
|
|
48
|
-
this._dataDiffer = this._differs.find([]).create(this.trackBy);
|
|
49
|
-
if (!this.treeControl && (typeof ngDevMode === 'undefined' || ngDevMode)) {
|
|
50
|
-
throw getTreeControlMissingError();
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
ngOnDestroy() {
|
|
54
|
-
this._nodeOutlet.viewContainer.clear();
|
|
55
|
-
this.viewChange.complete();
|
|
56
|
-
this._onDestroy.next();
|
|
57
|
-
this._onDestroy.complete();
|
|
58
|
-
if (this._dataSource && typeof this._dataSource.disconnect === 'function') {
|
|
59
|
-
this.dataSource.disconnect(this);
|
|
60
|
-
}
|
|
61
|
-
if (this._dataSubscription) {
|
|
62
|
-
this._dataSubscription.unsubscribe();
|
|
63
|
-
this._dataSubscription = null;
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
ngAfterContentChecked() {
|
|
67
|
-
const defaultNodeDefs = this._nodeDefs.filter(def => !def.when);
|
|
68
|
-
if (defaultNodeDefs.length > 1 && (typeof ngDevMode === 'undefined' || ngDevMode)) {
|
|
69
|
-
throw getTreeMultipleDefaultNodeDefsError();
|
|
70
|
-
}
|
|
71
|
-
this._defaultNodeDef = defaultNodeDefs[0];
|
|
72
|
-
if (this.dataSource && this._nodeDefs && !this._dataSubscription) {
|
|
73
|
-
this._observeRenderChanges();
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
// TODO(tinayuangao): Work on keyboard traversal and actions, make sure it's working for RTL
|
|
77
|
-
// and nested trees.
|
|
78
|
-
/**
|
|
79
|
-
* Switch to the provided data source by resetting the data and unsubscribing from the current
|
|
80
|
-
* render change subscription if one exists. If the data source is null, interpret this by
|
|
81
|
-
* clearing the node outlet. Otherwise start listening for new data.
|
|
82
|
-
*/
|
|
83
|
-
_switchDataSource(dataSource) {
|
|
84
|
-
if (this._dataSource && typeof this._dataSource.disconnect === 'function') {
|
|
85
|
-
this.dataSource.disconnect(this);
|
|
86
|
-
}
|
|
87
|
-
if (this._dataSubscription) {
|
|
88
|
-
this._dataSubscription.unsubscribe();
|
|
89
|
-
this._dataSubscription = null;
|
|
90
|
-
}
|
|
91
|
-
// Remove the all dataNodes if there is now no data source
|
|
92
|
-
if (!dataSource) {
|
|
93
|
-
this._nodeOutlet.viewContainer.clear();
|
|
94
|
-
}
|
|
95
|
-
this._dataSource = dataSource;
|
|
96
|
-
if (this._nodeDefs) {
|
|
97
|
-
this._observeRenderChanges();
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
/** Set up a subscription for the data provided by the data source. */
|
|
101
|
-
_observeRenderChanges() {
|
|
102
|
-
let dataStream;
|
|
103
|
-
if (isDataSource(this._dataSource)) {
|
|
104
|
-
dataStream = this._dataSource.connect(this);
|
|
105
|
-
}
|
|
106
|
-
else if (isObservable(this._dataSource)) {
|
|
107
|
-
dataStream = this._dataSource;
|
|
108
|
-
}
|
|
109
|
-
else if (Array.isArray(this._dataSource)) {
|
|
110
|
-
dataStream = observableOf(this._dataSource);
|
|
111
|
-
}
|
|
112
|
-
if (dataStream) {
|
|
113
|
-
this._dataSubscription = dataStream
|
|
114
|
-
.pipe(takeUntil(this._onDestroy))
|
|
115
|
-
.subscribe(data => this.renderNodeChanges(data));
|
|
116
|
-
}
|
|
117
|
-
else if (typeof ngDevMode === 'undefined' || ngDevMode) {
|
|
118
|
-
throw getTreeNoValidDataSourceError();
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
/** Check for changes made in the data and render each change (node added/removed/moved). */
|
|
122
|
-
renderNodeChanges(data, dataDiffer = this._dataDiffer, viewContainer = this._nodeOutlet.viewContainer, parentData) {
|
|
123
|
-
const changes = dataDiffer.diff(data);
|
|
124
|
-
if (!changes) {
|
|
125
|
-
return;
|
|
126
|
-
}
|
|
127
|
-
changes.forEachOperation((item, adjustedPreviousIndex, currentIndex) => {
|
|
128
|
-
if (item.previousIndex == null) {
|
|
129
|
-
this.insertNode(data[currentIndex], currentIndex, viewContainer, parentData);
|
|
130
|
-
}
|
|
131
|
-
else if (currentIndex == null) {
|
|
132
|
-
viewContainer.remove(adjustedPreviousIndex);
|
|
133
|
-
this._levels.delete(item.item);
|
|
134
|
-
}
|
|
135
|
-
else {
|
|
136
|
-
const view = viewContainer.get(adjustedPreviousIndex);
|
|
137
|
-
viewContainer.move(view, currentIndex);
|
|
138
|
-
}
|
|
139
|
-
});
|
|
140
|
-
this._changeDetectorRef.detectChanges();
|
|
141
|
-
}
|
|
142
|
-
/**
|
|
143
|
-
* Finds the matching node definition that should be used for this node data. If there is only
|
|
144
|
-
* one node definition, it is returned. Otherwise, find the node definition that has a when
|
|
145
|
-
* predicate that returns true with the data. If none return true, return the default node
|
|
146
|
-
* definition.
|
|
147
|
-
*/
|
|
148
|
-
_getNodeDef(data, i) {
|
|
149
|
-
if (this._nodeDefs.length === 1) {
|
|
150
|
-
return this._nodeDefs.first;
|
|
151
|
-
}
|
|
152
|
-
const nodeDef = this._nodeDefs.find(def => def.when && def.when(i, data)) || this._defaultNodeDef;
|
|
153
|
-
if (!nodeDef && (typeof ngDevMode === 'undefined' || ngDevMode)) {
|
|
154
|
-
throw getTreeMissingMatchingNodeDefError();
|
|
155
|
-
}
|
|
156
|
-
return nodeDef;
|
|
157
|
-
}
|
|
158
|
-
/**
|
|
159
|
-
* Create the embedded view for the data node template and place it in the correct index location
|
|
160
|
-
* within the data node view container.
|
|
161
|
-
*/
|
|
162
|
-
insertNode(nodeData, index, viewContainer, parentData) {
|
|
163
|
-
const node = this._getNodeDef(nodeData, index);
|
|
164
|
-
// Node context that will be provided to created embedded view
|
|
165
|
-
const context = new CdkTreeNodeOutletContext(nodeData);
|
|
166
|
-
// If the tree is flat tree, then use the `getLevel` function in flat tree control
|
|
167
|
-
// Otherwise, use the level of parent node.
|
|
168
|
-
if (this.treeControl.getLevel) {
|
|
169
|
-
context.level = this.treeControl.getLevel(nodeData);
|
|
170
|
-
}
|
|
171
|
-
else if (typeof parentData !== 'undefined' && this._levels.has(parentData)) {
|
|
172
|
-
context.level = this._levels.get(parentData) + 1;
|
|
173
|
-
}
|
|
174
|
-
else {
|
|
175
|
-
context.level = 0;
|
|
176
|
-
}
|
|
177
|
-
this._levels.set(nodeData, context.level);
|
|
178
|
-
// Use default tree nodeOutlet, or nested node's nodeOutlet
|
|
179
|
-
const container = viewContainer ? viewContainer : this._nodeOutlet.viewContainer;
|
|
180
|
-
container.createEmbeddedView(node.template, context, index);
|
|
181
|
-
// Set the data to just created `CdkTreeNode`.
|
|
182
|
-
// The `CdkTreeNode` created from `createEmbeddedView` will be saved in static variable
|
|
183
|
-
// `mostRecentTreeNode`. We get it from static variable and pass the node data to it.
|
|
184
|
-
if (CdkTreeNode.mostRecentTreeNode) {
|
|
185
|
-
CdkTreeNode.mostRecentTreeNode.data = nodeData;
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
CdkTree.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0-next.2", ngImport: i0, type: CdkTree, deps: [{ token: i0.IterableDiffers }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
190
|
-
CdkTree.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.0-next.2", type: CdkTree, selector: "cdk-tree", inputs: { dataSource: "dataSource", treeControl: "treeControl", trackBy: "trackBy" }, host: { attributes: { "role": "tree" }, classAttribute: "cdk-tree" }, queries: [{ propertyName: "_nodeDefs", predicate: CdkTreeNodeDef, descendants: true }], viewQueries: [{ propertyName: "_nodeOutlet", first: true, predicate: CdkTreeNodeOutlet, descendants: true, static: true }], exportAs: ["cdkTree"], ngImport: i0, template: `<ng-container cdkTreeNodeOutlet></ng-container>`, isInline: true, dependencies: [{ kind: "directive", type: i1.CdkTreeNodeOutlet, selector: "[cdkTreeNodeOutlet]" }], changeDetection: i0.ChangeDetectionStrategy.Default, encapsulation: i0.ViewEncapsulation.None });
|
|
191
|
-
export { CdkTree };
|
|
192
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0-next.2", ngImport: i0, type: CdkTree, decorators: [{
|
|
193
|
-
type: Component,
|
|
194
|
-
args: [{
|
|
195
|
-
selector: 'cdk-tree',
|
|
196
|
-
exportAs: 'cdkTree',
|
|
197
|
-
template: `<ng-container cdkTreeNodeOutlet></ng-container>`,
|
|
198
|
-
host: {
|
|
199
|
-
'class': 'cdk-tree',
|
|
200
|
-
'role': 'tree',
|
|
201
|
-
},
|
|
202
|
-
encapsulation: ViewEncapsulation.None,
|
|
203
|
-
// The "OnPush" status for the `CdkTree` component is effectively a noop, so we are removing it.
|
|
204
|
-
// The view for `CdkTree` consists entirely of templates declared in other views. As they are
|
|
205
|
-
// declared elsewhere, they are checked when their declaration points are checked.
|
|
206
|
-
// tslint:disable-next-line:validate-decorators
|
|
207
|
-
changeDetection: ChangeDetectionStrategy.Default,
|
|
208
|
-
}]
|
|
209
|
-
}], ctorParameters: function () { return [{ type: i0.IterableDiffers }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { dataSource: [{
|
|
210
|
-
type: Input
|
|
211
|
-
}], treeControl: [{
|
|
212
|
-
type: Input
|
|
213
|
-
}], trackBy: [{
|
|
214
|
-
type: Input
|
|
215
|
-
}], _nodeOutlet: [{
|
|
216
|
-
type: ViewChild,
|
|
217
|
-
args: [CdkTreeNodeOutlet, { static: true }]
|
|
218
|
-
}], _nodeDefs: [{
|
|
219
|
-
type: ContentChildren,
|
|
220
|
-
args: [CdkTreeNodeDef, {
|
|
221
|
-
// We need to use `descendants: true`, because Ivy will no longer match
|
|
222
|
-
// indirect descendants if it's left as false.
|
|
223
|
-
descendants: true,
|
|
224
|
-
}]
|
|
225
|
-
}] } });
|
|
226
|
-
/**
|
|
227
|
-
* Tree node for CdkTree. It contains the data in the tree node.
|
|
228
|
-
*/
|
|
229
|
-
class CdkTreeNode {
|
|
230
|
-
/**
|
|
231
|
-
* The role of the tree node.
|
|
232
|
-
* @deprecated The correct role is 'treeitem', 'group' should not be used. This input will be
|
|
233
|
-
* removed in a future version.
|
|
234
|
-
* @breaking-change 12.0.0 Remove this input
|
|
235
|
-
*/
|
|
236
|
-
get role() {
|
|
237
|
-
return 'treeitem';
|
|
238
|
-
}
|
|
239
|
-
set role(_role) {
|
|
240
|
-
// TODO: move to host after View Engine deprecation
|
|
241
|
-
this._elementRef.nativeElement.setAttribute('role', _role);
|
|
242
|
-
}
|
|
243
|
-
/** The tree node's data. */
|
|
244
|
-
get data() {
|
|
245
|
-
return this._data;
|
|
246
|
-
}
|
|
247
|
-
set data(value) {
|
|
248
|
-
if (value !== this._data) {
|
|
249
|
-
this._data = value;
|
|
250
|
-
this._setRoleFromData();
|
|
251
|
-
this._dataChanges.next();
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
get isExpanded() {
|
|
255
|
-
return this._tree.treeControl.isExpanded(this._data);
|
|
256
|
-
}
|
|
257
|
-
get level() {
|
|
258
|
-
// If the treeControl has a getLevel method, use it to get the level. Otherwise read the
|
|
259
|
-
// aria-level off the parent node and use it as the level for this node (note aria-level is
|
|
260
|
-
// 1-indexed, while this property is 0-indexed, so we don't need to increment).
|
|
261
|
-
return this._tree.treeControl.getLevel
|
|
262
|
-
? this._tree.treeControl.getLevel(this._data)
|
|
263
|
-
: this._parentNodeAriaLevel;
|
|
264
|
-
}
|
|
265
|
-
constructor(_elementRef, _tree) {
|
|
266
|
-
this._elementRef = _elementRef;
|
|
267
|
-
this._tree = _tree;
|
|
268
|
-
/** Subject that emits when the component has been destroyed. */
|
|
269
|
-
this._destroyed = new Subject();
|
|
270
|
-
/** Emits when the node's data has changed. */
|
|
271
|
-
this._dataChanges = new Subject();
|
|
272
|
-
CdkTreeNode.mostRecentTreeNode = this;
|
|
273
|
-
this.role = 'treeitem';
|
|
274
|
-
}
|
|
275
|
-
ngOnInit() {
|
|
276
|
-
this._parentNodeAriaLevel = getParentNodeAriaLevel(this._elementRef.nativeElement);
|
|
277
|
-
this._elementRef.nativeElement.setAttribute('aria-level', `${this.level + 1}`);
|
|
278
|
-
}
|
|
279
|
-
ngOnDestroy() {
|
|
280
|
-
// If this is the last tree node being destroyed,
|
|
281
|
-
// clear out the reference to avoid leaking memory.
|
|
282
|
-
if (CdkTreeNode.mostRecentTreeNode === this) {
|
|
283
|
-
CdkTreeNode.mostRecentTreeNode = null;
|
|
284
|
-
}
|
|
285
|
-
this._dataChanges.complete();
|
|
286
|
-
this._destroyed.next();
|
|
287
|
-
this._destroyed.complete();
|
|
288
|
-
}
|
|
289
|
-
/** Focuses the menu item. Implements for FocusableOption. */
|
|
290
|
-
focus() {
|
|
291
|
-
this._elementRef.nativeElement.focus();
|
|
292
|
-
}
|
|
293
|
-
// TODO: role should eventually just be set in the component host
|
|
294
|
-
_setRoleFromData() {
|
|
295
|
-
if (!this._tree.treeControl.isExpandable &&
|
|
296
|
-
!this._tree.treeControl.getChildren &&
|
|
297
|
-
(typeof ngDevMode === 'undefined' || ngDevMode)) {
|
|
298
|
-
throw getTreeControlFunctionsMissingError();
|
|
299
|
-
}
|
|
300
|
-
this.role = 'treeitem';
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
/**
|
|
304
|
-
* The most recently created `CdkTreeNode`. We save it in static variable so we can retrieve it
|
|
305
|
-
* in `CdkTree` and set the data to it.
|
|
306
|
-
*/
|
|
307
|
-
CdkTreeNode.mostRecentTreeNode = null;
|
|
308
|
-
CdkTreeNode.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0-next.2", ngImport: i0, type: CdkTreeNode, deps: [{ token: i0.ElementRef }, { token: CdkTree }], target: i0.ɵɵFactoryTarget.Directive });
|
|
309
|
-
CdkTreeNode.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.0.0-next.2", type: CdkTreeNode, selector: "cdk-tree-node", inputs: { role: "role" }, host: { properties: { "attr.aria-expanded": "isExpanded" }, classAttribute: "cdk-tree-node" }, exportAs: ["cdkTreeNode"], ngImport: i0 });
|
|
310
|
-
export { CdkTreeNode };
|
|
311
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0-next.2", ngImport: i0, type: CdkTreeNode, decorators: [{
|
|
312
|
-
type: Directive,
|
|
313
|
-
args: [{
|
|
314
|
-
selector: 'cdk-tree-node',
|
|
315
|
-
exportAs: 'cdkTreeNode',
|
|
316
|
-
host: {
|
|
317
|
-
'class': 'cdk-tree-node',
|
|
318
|
-
'[attr.aria-expanded]': 'isExpanded',
|
|
319
|
-
},
|
|
320
|
-
}]
|
|
321
|
-
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: CdkTree }]; }, propDecorators: { role: [{
|
|
322
|
-
type: Input
|
|
323
|
-
}] } });
|
|
324
|
-
function getParentNodeAriaLevel(nodeElement) {
|
|
325
|
-
let parent = nodeElement.parentElement;
|
|
326
|
-
while (parent && !isNodeElement(parent)) {
|
|
327
|
-
parent = parent.parentElement;
|
|
328
|
-
}
|
|
329
|
-
if (!parent) {
|
|
330
|
-
if (typeof ngDevMode === 'undefined' || ngDevMode) {
|
|
331
|
-
throw Error('Incorrect tree structure containing detached node.');
|
|
332
|
-
}
|
|
333
|
-
else {
|
|
334
|
-
return -1;
|
|
335
|
-
}
|
|
336
|
-
}
|
|
337
|
-
else if (parent.classList.contains('cdk-nested-tree-node')) {
|
|
338
|
-
return coerceNumberProperty(parent.getAttribute('aria-level'));
|
|
339
|
-
}
|
|
340
|
-
else {
|
|
341
|
-
// The ancestor element is the cdk-tree itself
|
|
342
|
-
return 0;
|
|
343
|
-
}
|
|
344
|
-
}
|
|
345
|
-
function isNodeElement(element) {
|
|
346
|
-
const classList = element.classList;
|
|
347
|
-
return !!(classList?.contains('cdk-nested-tree-node') || classList?.contains('cdk-tree'));
|
|
348
|
-
}
|
|
349
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9jZGsvdHJlZS90cmVlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVFBLE9BQU8sRUFBK0IsWUFBWSxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDcEYsT0FBTyxFQUVMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULGVBQWUsRUFDZixTQUFTLEVBQ1QsVUFBVSxFQUNWLEtBQUssRUFHTCxlQUFlLEVBR2YsU0FBUyxFQUVULFNBQVMsRUFFVCxpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNMLGVBQWUsRUFDZixZQUFZLEVBRVosRUFBRSxJQUFJLFlBQVksRUFDbEIsT0FBTyxHQUVSLE1BQU0sTUFBTSxDQUFDO0FBQ2QsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRXpDLE9BQU8sRUFBQyxjQUFjLEVBQUUsd0JBQXdCLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDaEUsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sVUFBVSxDQUFDO0FBQzNDLE9BQU8sRUFDTCxtQ0FBbUMsRUFDbkMsMEJBQTBCLEVBQzFCLGtDQUFrQyxFQUNsQyxtQ0FBbUMsRUFDbkMsNkJBQTZCLEdBQzlCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLHVCQUF1QixDQUFDOzs7QUFFM0Q7OztHQUdHO0FBQ0gsTUFnQmEsT0FBTztJQWdCbEI7Ozs7T0FJRztJQUNILElBQ0ksVUFBVTtRQUNaLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBQ0QsSUFBSSxVQUFVLENBQUMsVUFBaUQ7UUFDOUQsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLFVBQVUsRUFBRTtZQUNuQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDcEM7SUFDSCxD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QUM1RixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5pbXBvcnQge0ZvY3VzYWJsZU9wdGlvbn0gZnJvbSAnQGFuZ3VsYXIvY2RrL2ExMXknO1xuaW1wb3J0IHtDb2xsZWN0aW9uVmlld2VyLCBEYXRhU291cmNlLCBpc0RhdGFTb3VyY2V9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2xsZWN0aW9ucyc7XG5pbXBvcnQge1xuICBBZnRlckNvbnRlbnRDaGVja2VkLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkcmVuLFxuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIElucHV0LFxuICBJdGVyYWJsZUNoYW5nZVJlY29yZCxcbiAgSXRlcmFibGVEaWZmZXIsXG4gIEl0ZXJhYmxlRGlmZmVycyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIFF1ZXJ5TGlzdCxcbiAgVHJhY2tCeUZ1bmN0aW9uLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDb250YWluZXJSZWYsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEJlaGF2aW9yU3ViamVjdCxcbiAgaXNPYnNlcnZhYmxlLFxuICBPYnNlcnZhYmxlLFxuICBvZiBhcyBvYnNlcnZhYmxlT2YsXG4gIFN1YmplY3QsXG4gIFN1YnNjcmlwdGlvbixcbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge3Rha2VVbnRpbH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtUcmVlQ29udHJvbH0gZnJvbSAnLi9jb250cm9sL3RyZWUtY29udHJvbCc7XG5pbXBvcnQge0Nka1RyZWVOb2RlRGVmLCBDZGtUcmVlTm9kZU91dGxldENvbnRleHR9IGZyb20gJy4vbm9kZSc7XG5pbXBvcnQge0Nka1RyZWVOb2RlT3V0bGV0fSBmcm9tICcuL291dGxldCc7XG5pbXBvcnQge1xuICBnZXRUcmVlQ29udHJvbEZ1bmN0aW9uc01pc3NpbmdFcnJvcixcbiAgZ2V0VHJlZUNvbnRyb2xNaXNzaW5nRXJyb3IsXG4gIGdldFRyZWVNaXNzaW5nTWF0Y2hpbmdOb2RlRGVmRXJyb3IsXG4gIGdldFRyZWVNdWx0aXBsZURlZmF1bHROb2RlRGVmc0Vycm9yLFxuICBnZXRUcmVlTm9WYWxpZERhdGFTb3VyY2VFcnJvcixcbn0gZnJvbSAnLi90cmVlLWVycm9ycyc7XG5pbXBvcnQge2NvZXJjZU51bWJlclByb3BlcnR5fSBmcm9tICdAYW5ndWxhci9jZGsvY29lcmNpb24nO1xuXG4vKipcbiAqIENESyB0cmVlIGNvbXBvbmVudCB0aGF0IGNvbm5lY3RzIHdpdGggYSBkYXRhIHNvdXJjZSB0byByZXRyaWV2ZSBkYXRhIG9mIHR5cGUgYFRgIGFuZCByZW5kZXJzXG4gKiBkYXRhTm9kZXMgd2l0aCBoaWVyYXJjaHkuIFVwZGF0ZXMgdGhlIGRhdGFOb2RlcyB3aGVuIG5ldyBkYXRhIGlzIHByb3ZpZGVkIGJ5IHRoZSBkYXRhIHNvdXJjZS5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY2RrLXRyZWUnLFxuICBleHBvcnRBczogJ2Nka1RyZWUnLFxuICB0ZW1wbGF0ZTogYDxuZy1jb250YWluZXIgY2RrVHJlZU5vZGVPdXRsZXQ+PC9uZy1jb250YWluZXI+YCxcbiAgaG9zdDoge1xuICAgICdjbGFzcyc6ICdjZGstdHJlZScsXG4gICAgJ3JvbGUnOiAndHJlZScsXG4gIH0sXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG5cbiAgLy8gVGhlIFwiT25QdXNoXCIgc3RhdHVzIGZvciB0aGUgYENka1RyZWVgIGNvbXBvbmVudCBpcyBlZmZlY3RpdmVseSBhIG5vb3AsIHNvIHdlIGFyZSByZW1vdmluZyBpdC5cbiAgLy8gVGhlIHZpZXcgZm9yIGBDZGtUcmVlYCBjb25zaXN0cyBlbnRpcmVseSBvZiB0ZW1wbGF0ZXMgZGVjbGFyZWQgaW4gb3RoZXIgdmlld3MuIEFzIHRoZXkgYXJlXG4gIC8vIGRlY2xhcmVkIGVsc2V3aGVyZSwgdGhleSBhcmUgY2hlY2tlZCB3aGVuIHRoZWlyIGRlY2xhcmF0aW9uIHBvaW50cyBhcmUgY2hlY2tlZC5cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnZhbGlkYXRlLWRlY29yYXRvcnNcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5EZWZhdWx0LFxufSlcbmV4cG9ydCBjbGFzcyBDZGtUcmVlPFQsIEsgPSBUPiBpbXBsZW1lbnRzIEFmdGVyQ29udGVudENoZWNrZWQsIENvbGxlY3Rpb25WaWV3ZXIsIE9uRGVzdHJveSwgT25Jbml0IHtcbiAgLyoqIFN1YmplY3QgdGhhdCBlbWl0cyB3aGVuIHRoZSBjb21wb25lbnQgaGFzIGJlZW4gZGVzdHJveWVkLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9vbkRlc3Ryb3kgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIC8qKiBEaWZmZXIgdXNlZCB0byBmaW5kIHRoZSBjaGFuZ2VzIGluIHRoZSBkYXRhIHByb3ZpZGVkIGJ5IHRoZSBkYXRhIHNvdXJjZS4gKi9cbiAgcHJpdmF0ZSBfZGF0YURpZmZlcjogSXRlcmFibGVEaWZmZXI8VD47XG5cbiAgLyoqIFN0b3JlcyB0aGUgbm9kZSBkZWZpbml0aW9uIHRoYXQgZG9lcyBub3QgaGF2ZSBhIHdoZW4gcHJlZGljYXRlLiAqL1xuICBwcml2YXRlIF9kZWZhdWx0Tm9kZURlZjogQ2RrVHJlZU5vZGVEZWY8VD4gfCBudWxsO1xuXG4gIC8qKiBEYXRhIHN1YnNjcmlwdGlvbiAqL1xuICBwcml2YXRlIF9kYXRhU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCBudWxsO1xuXG4gIC8qKiBMZXZlbCBvZiBub2RlcyAqL1xuICBwcml2YXRlIF9sZXZlbHM6IE1hcDxULCBudW1iZXI+ID0gbmV3IE1hcDxULCBudW1iZXI+KCk7XG5cbiAgLyoqXG4gICAqIFByb3ZpZGVzIGEgc3RyZWFtIGNvbnRhaW5pbmcgdGhlIGxhdGVzdCBkYXRhIGFycmF5IHRvIHJlbmRlci4gSW5mbHVlbmNlZCBieSB0aGUgdHJlZSdzXG4gICAqIHN0cmVhbSBvZiB2aWV3IHdpbmRvdyAod2hhdCBkYXRhTm9kZXMgYXJlIGN1cnJlbnRseSBvbiBzY3JlZW4pLlxuICAgKiBEYXRhIHNvdXJjZSBjYW4gYmUgYW4gb2JzZXJ2YWJsZSBvZiBkYXRhIGFycmF5LCBvciBhIGRhdGEgYXJyYXkgdG8gcmVuZGVyLlxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IGRhdGFTb3VyY2UoKTogRGF0YVNvdXJjZTxUPiB8IE9ic2VydmFibGU8VFtdPiB8IFRbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2U7XG4gIH1cbiAgc2V0IGRhdGFTb3VyY2UoZGF0YVNvdXJjZTogRGF0YVNvdXJjZTxUPiB8IE9ic2VydmFibGU8VFtdPiB8IFRbXSkge1xuICAgIGlmICh0aGlzLl9kYXRhU291cmNlICE9PSBkYXRhU291cmNlKSB7XG4gICAgICB0aGlzLl9zd2l0Y2hEYXRhU291cmNlKGRhdGFTb3VyY2UpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIF9kYXRhU291cmNlOiBEYXRhU291cmNlPFQ+IHwgT2JzZXJ2YWJsZTxUW10+IHwgVFtdO1xuXG4gIC8qKiBUaGUgdHJlZSBjb250cm9sbGVyICovXG4gIEBJbnB1dCgpIHRyZWVDb250cm9sOiBUcmVlQ29udHJvbDxULCBLPjtcblxuICAvKipcbiAgICogVHJhY2tpbmcgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIHVzZWQgdG8gY2hlY2sgdGhlIGRpZmZlcmVuY2VzIGluIGRhdGEgY2hhbmdlcy4gVXNlZCBzaW1pbGFybHlcbiAgICogdG8gYG5nRm9yYCBgdHJhY2tCeWAgZnVuY3Rpb24uIE9wdGltaXplIG5vZGUgb3BlcmF0aW9ucyBieSBpZGVudGlmeWluZyBhIG5vZGUgYmFzZWQgb24gaXRzIGRhdGFcbiAgICogcmVsYXRpdmUgdG8gdGhlIGZ1bmN0aW9uIHRvIGtub3cgaWYgYSBub2RlIHNob3VsZCBiZSBhZGRlZC9yZW1vdmVkL21vdmVkLlxuICAgKiBBY2NlcHRzIGEgZnVuY3Rpb24gdGhhdCB0YWtlcyB0d28gcGFyYW1ldGVycywgYGluZGV4YCBhbmQgYGl0ZW1gLlxuICAgKi9cbiAgQElucHV0KCkgdHJhY2tCeTogVHJhY2tCeUZ1bmN0aW9uPFQ+O1xuXG4gIC8vIE91dGxldHMgd2l0aGluIHRoZSB0cmVlJ3MgdGVtcGxhdGUgd2hlcmUgdGhlIGRhdGFOb2RlcyB3aWxsIGJlIGluc2VydGVkLlxuICBAVmlld0NoaWxkKENka1RyZWVOb2RlT3V0bGV0LCB7c3RhdGljOiB0cnVlfSkgX25vZGVPdXRsZXQ6IENka1RyZWVOb2RlT3V0bGV0O1xuXG4gIC8qKiBUaGUgdHJlZSBub2RlIHRlbXBsYXRlIGZvciB0aGUgdHJlZSAqL1xuICBAQ29udGVudENoaWxkcmVuKENka1RyZWVOb2RlRGVmLCB7XG4gICAgLy8gV2UgbmVlZCB0byB1c2UgYGRlc2NlbmRhbnRzOiB0cnVlYCwgYmVjYXVzZSBJdnkgd2lsbCBubyBsb25nZXIgbWF0Y2hcbiAgICAvLyBpbmRpcmVjdCBkZXNjZW5kYW50cyBpZiBpdCdzIGxlZnQgYXMgZmFsc2UuXG4gICAgZGVzY2VuZGFudHM6IHRydWUsXG4gIH0pXG4gIF9ub2RlRGVmczogUXVlcnlMaXN0PENka1RyZWVOb2RlRGVmPFQ+PjtcblxuICAvLyBUT0RPKHRpbmF5dWFuZ2FvKTogU2V0dXAgYSBsaXN0ZW5lciBmb3Igc2Nyb2xsaW5nLCBlbWl0IHRoZSBjYWxjdWxhdGVkIHZpZXcgdG8gdmlld0NoYW5nZS5cbiAgLy8gICAgIFJlbW92ZSB0aGUgTUFYX1ZBTFVFIGluIHZpZXdDaGFuZ2VcbiAgLyoqXG4gICAqIFN0cmVhbSBjb250YWluaW5nIHRoZSBsYXRlc3QgaW5mb3JtYXRpb24gb24gd2hhdCByb3dzIGFyZSBiZWluZyBkaXNwbGF5ZWQgb24gc2NyZWVuLlxuICAgKiBDYW4gYmUgdXNlZCBieSB0aGUgZGF0YSBzb3VyY2UgdG8gYXMgYSBoZXVyaXN0aWMgb2Ygd2hhdCBkYXRhIHNob3VsZCBiZSBwcm92aWRlZC5cbiAgICovXG4gIHJlYWRvbmx5IHZpZXdDaGFuZ2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHtzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlcn0+KHtcbiAgICBzdGFydDogMCxcbiAgICBlbmQ6IE51bWJlci5NQVhfVkFMVUUsXG4gIH0pO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2RpZmZlcnM6IEl0ZXJhYmxlRGlmZmVycywgcHJpdmF0ZSBfY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmKSB7fVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuX2RhdGFEaWZmZXIgPSB0aGlzLl9kaWZmZXJzLmZpbmQoW10pLmNyZWF0ZSh0aGlzLnRyYWNrQnkpO1xuICAgIGlmICghdGhpcy50cmVlQ29udHJvbCAmJiAodHlwZW9mIG5nRGV2TW9kZSA9PT0gJ3VuZGVmaW5lZCcgfHwgbmdEZXZNb2RlKSkge1xuICAgICAgdGhyb3cgZ2V0VHJlZUNvbnRyb2xNaXNzaW5nRXJyb3IoKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLl9ub2RlT3V0bGV0LnZpZXdDb250YWluZXIuY2xlYXIoKTtcblxuICAgIHRoaXMudmlld0NoYW5nZS5jb21wbGV0ZSgpO1xuICAgIHRoaXMuX29uRGVzdHJveS5uZXh0KCk7XG4gICAgdGhpcy5fb25EZXN0cm95LmNvbXBsZXRlKCk7XG5cbiAgICBpZiAodGhpcy5fZGF0YVNvdXJjZSAmJiB0eXBlb2YgKHRoaXMuX2RhdGFTb3VyY2UgYXMgRGF0YVNvdXJjZTxUPikuZGlzY29ubmVjdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgKHRoaXMuZGF0YVNvdXJjZSBhcyBEYXRhU291cmNlPFQ+KS5kaXNjb25uZWN0KHRoaXMpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9kYXRhU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLl9kYXRhU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICB0aGlzLl9kYXRhU3Vic2NyaXB0aW9uID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyQ29udGVudENoZWNrZWQoKSB7XG4gICAgY29uc3QgZGVmYXVsdE5vZGVEZWZzID0gdGhpcy5fbm9kZURlZnMuZmlsdGVyKGRlZiA9PiAhZGVmLndoZW4pO1xuICAgIGlmIChkZWZhdWx0Tm9kZURlZnMubGVuZ3RoID4gMSAmJiAodHlwZW9mIG5nRGV2TW9kZSA9PT0gJ3VuZGVmaW5lZCcgfHwgbmdEZXZNb2RlKSkge1xuICAgICAgdGhyb3cgZ2V0VHJlZU11bHRpcGxlRGVmYXVsdE5vZGVEZWZzRXJyb3IoKTtcbiAgICB9XG4gICAgdGhpcy5fZGVmYXVsdE5vZGVEZWYgPSBkZWZhdWx0Tm9kZURlZnNbMF07XG5cbiAgICBpZiAodGhpcy5kYXRhU291cmNlICYmIHRoaXMuX25vZGVEZWZzICYmICF0aGlzLl9kYXRhU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLl9vYnNlcnZlUmVuZGVyQ2hhbmdlcygpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFRPRE8odGluYXl1YW5nYW8pOiBXb3JrIG9uIGtleWJvYXJkIHRyYXZlcnNhbCBhbmQgYWN0aW9ucywgbWFrZSBzdXJlIGl0J3Mgd29ya2luZyBmb3IgUlRMXG4gIC8vICAgICBhbmQgbmVzdGVkIHRyZWVzLlxuXG4gIC8qKlxuICAgKiBTd2l0Y2ggdG8gdGhlIHByb3ZpZGVkIGRhdGEgc291cmNlIGJ5IHJlc2V0dGluZyB0aGUgZGF0YSBhbmQgdW5zdWJzY3JpYmluZyBmcm9tIHRoZSBjdXJyZW50XG4gICAqIHJlbmRlciBjaGFuZ2Ugc3Vic2NyaXB0aW9uIGlmIG9uZSBleGlzdHMuIElmIHRoZSBkYXRhIHNvdXJjZSBpcyBudWxsLCBpbnRlcnByZXQgdGhpcyBieVxuICAgKiBjbGVhcmluZyB0aGUgbm9kZSBvdXRsZXQuIE90aGVyd2lzZSBzdGFydCBsaXN0ZW5pbmcgZm9yIG5ldyBkYXRhLlxuICAgKi9cbiAgcHJpdmF0ZSBfc3dpdGNoRGF0YVNvdXJjZShkYXRhU291cmNlOiBEYXRhU291cmNlPFQ+IHwgT2JzZXJ2YWJsZTxUW10+IHwgVFtdKSB7XG4gICAgaWYgKHRoaXMuX2RhdGFTb3VyY2UgJiYgdHlwZW9mICh0aGlzLl9kYXRhU291cmNlIGFzIERhdGFTb3VyY2U8VD4pLmRpc2Nvbm5lY3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICh0aGlzLmRhdGFTb3VyY2UgYXMgRGF0YVNvdXJjZTxUPikuZGlzY29ubmVjdCh0aGlzKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fZGF0YVN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5fZGF0YVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgdGhpcy5fZGF0YVN1YnNjcmlwdGlvbiA9IG51bGw7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIHRoZSBhbGwgZGF0YU5vZGVzIGlmIHRoZXJlIGlzIG5vdyBubyBkYXRhIHNvdXJjZVxuICAgIGlmICghZGF0YVNvdXJjZSkge1xuICAgICAgdGhpcy5fbm9kZU91dGxldC52aWV3Q29udGFpbmVyLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgdGhpcy5fZGF0YVNvdXJjZSA9IGRhdGFTb3VyY2U7XG4gICAgaWYgKHRoaXMuX25vZGVEZWZzKSB7XG4gICAgICB0aGlzLl9vYnNlcnZlUmVuZGVyQ2hhbmdlcygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBTZXQgdXAgYSBzdWJzY3JpcHRpb24gZm9yIHRoZSBkYXRhIHByb3ZpZGVkIGJ5IHRoZSBkYXRhIHNvdXJjZS4gKi9cbiAgcHJpdmF0ZSBfb2JzZXJ2ZVJlbmRlckNoYW5nZXMoKSB7XG4gICAgbGV0IGRhdGFTdHJlYW06IE9ic2VydmFibGU8cmVhZG9ubHkgVFtdPiB8IHVuZGVmaW5lZDtcblxuICAgIGlmIChpc0RhdGFTb3VyY2UodGhpcy5fZGF0YVNvdXJjZSkpIHtcbiAgICAgIGRhdGFTdHJlYW0gPSB0aGlzLl9kYXRhU291cmNlLmNvbm5lY3QodGhpcyk7XG4gICAgfSBlbHNlIGlmIChpc09ic2VydmFibGUodGhpcy5fZGF0YVNvdXJjZSkpIHtcbiAgICAgIGRhdGFTdHJlYW0gPSB0aGlzLl9kYXRhU291cmNlO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLl9kYXRhU291cmNlKSkge1xuICAgICAgZGF0YVN0cmVhbSA9IG9ic2VydmFibGVPZih0aGlzLl9kYXRhU291cmNlKTtcbiAgICB9XG5cbiAgICBpZiAoZGF0YVN0cmVhbSkge1xuICAgICAgdGhpcy5fZGF0YVN1YnNjcmlwdGlvbiA9IGRhdGFTdHJlYW1cbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX29uRGVzdHJveSkpXG4gICAgICAgIC5zdWJzY3JpYmUoZGF0YSA9PiB0aGlzLnJlbmRlck5vZGVDaGFuZ2VzKGRhdGEpKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBuZ0Rldk1vZGUgPT09ICd1bmRlZmluZWQnIHx8IG5nRGV2TW9kZSkge1xuICAgICAgdGhyb3cgZ2V0VHJlZU5vVmFsaWREYXRhU291cmNlRXJyb3IoKTtcbiAgICB9XG4gIH1cblxuICAvKiogQ2hlY2sgZm9yIGNoYW5nZXMgbWFkZSBpbiB0aGUgZGF0YSBhbmQgcmVuZGVyIGVhY2ggY2hhbmdlIChub2RlIGFkZGVkL3JlbW92ZWQvbW92ZWQpLiAqL1xuICByZW5kZXJOb2RlQ2hhbmdlcyhcbiAgICBkYXRhOiByZWFkb25seSBUW10sXG4gICAgZGF0YURpZmZlcjogSXRlcmFibGVEaWZmZXI8VD4gPSB0aGlzLl9kYXRhRGlmZmVyLFxuICAgIHZpZXdDb250YWluZXI6IFZpZXdDb250YWluZXJSZWYgPSB0aGlzLl9ub2RlT3V0bGV0LnZpZXdDb250YWluZXIsXG4gICAgcGFyZW50RGF0YT86IFQsXG4gICkge1xuICAgIGNvbnN0IGNoYW5nZXMgPSBkYXRhRGlmZmVyLmRpZmYoZGF0YSk7XG4gICAgaWYgKCFjaGFuZ2VzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY2hhbmdlcy5mb3JFYWNoT3BlcmF0aW9uKFxuICAgICAgKFxuICAgICAgICBpdGVtOiBJdGVyYWJsZUNoYW5nZVJlY29yZDxUPixcbiAgICAgICAgYWRqdXN0ZWRQcmV2aW91c0luZGV4OiBudW1iZXIgfCBudWxsLFxuICAgICAgICBjdXJyZW50SW5kZXg6IG51bWJlciB8IG51bGwsXG4gICAgICApID0+IHtcbiAgICAgICAgaWYgKGl0ZW0ucHJldmlvdXNJbmRleCA9PSBudWxsKSB7XG4gICAgICAgICAgdGhpcy5pbnNlcnROb2RlKGRhdGFbY3VycmVudEluZGV4IV0sIGN1cnJlbnRJbmRleCEsIHZpZXdDb250YWluZXIsIHBhcmVudERhdGEpO1xuICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRJbmRleCA9PSBudWxsKSB7XG4gICAgICAgICAgdmlld0NvbnRhaW5lci5yZW1vdmUoYWRqdXN0ZWRQcmV2aW91c0luZGV4ISk7XG4gICAgICAgICAgdGhpcy5fbGV2ZWxzLmRlbGV0ZShpdGVtLml0ZW0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHZpZXcgPSB2aWV3Q29udGFpbmVyLmdldChhZGp1c3RlZFByZXZpb3VzSW5kZXghKTtcbiAgICAgICAgICB2aWV3Q29udGFpbmVyLm1vdmUodmlldyEsIGN1cnJlbnRJbmRleCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgKTtcblxuICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyB0aGUgbWF0Y2hpbmcgbm9kZSBkZWZpbml0aW9uIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIHRoaXMgbm9kZSBkYXRhLiBJZiB0aGVyZSBpcyBvbmx5XG4gICAqIG9uZSBub2RlIGRlZmluaXRpb24sIGl0IGlzIHJldHVybmVkLiBPdGhlcndpc2UsIGZpbmQgdGhlIG5vZGUgZGVmaW5pdGlvbiB0aGF0IGhhcyBhIHdoZW5cbiAgICogcHJlZGljYXRlIHRoYXQgcmV0dXJucyB0cnVlIHdpdGggdGhlIGRhdGEuIElmIG5vbmUgcmV0dXJuIHRydWUsIHJldHVybiB0aGUgZGVmYXVsdCBub2RlXG4gICAqIGRlZmluaXRpb24uXG4gICAqL1xuICBfZ2V0Tm9kZURlZihkYXRhOiBULCBpOiBudW1iZXIpOiBDZGtUcmVlTm9kZURlZjxUPiB7XG4gICAgaWYgKHRoaXMuX25vZGVEZWZzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgcmV0dXJuIHRoaXMuX25vZGVEZWZzLmZpcnN0ITtcbiAgICB9XG5cbiAgICBjb25zdCBub2RlRGVmID1cbiAgICAgIHRoaXMuX25vZGVEZWZzLmZpbmQoZGVmID0+IGRlZi53aGVuICYmIGRlZi53aGVuKGksIGRhdGEpKSB8fCB0aGlzLl9kZWZhdWx0Tm9kZURlZjtcblxuICAgIGlmICghbm9kZURlZiAmJiAodHlwZW9mIG5nRGV2TW9kZSA9PT0gJ3VuZGVmaW5lZCcgfHwgbmdEZXZNb2RlKSkge1xuICAgICAgdGhyb3cgZ2V0VHJlZU1pc3NpbmdNYXRjaGluZ05vZGVEZWZFcnJvcigpO1xuICAgIH1cblxuICAgIHJldHVybiBub2RlRGVmITtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgdGhlIGVtYmVkZGVkIHZpZXcgZm9yIHRoZSBkYXRhIG5vZGUgdGVtcGxhdGUgYW5kIHBsYWNlIGl0IGluIHRoZSBjb3JyZWN0IGluZGV4IGxvY2F0aW9uXG4gICAqIHdpdGhpbiB0aGUgZGF0YSBub2RlIHZpZXcgY29udGFpbmVyLlxuICAgKi9cbiAgaW5zZXJ0Tm9kZShub2RlRGF0YTogVCwgaW5kZXg6IG51bWJlciwgdmlld0NvbnRhaW5lcj86IFZpZXdDb250YWluZXJSZWYsIHBhcmVudERhdGE/OiBUKSB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuX2dldE5vZGVEZWYobm9kZURhdGEsIGluZGV4KTtcblxuICAgIC8vIE5vZGUgY29udGV4dCB0aGF0IHdpbGwgYmUgcHJvdmlkZWQgdG8gY3JlYXRlZCBlbWJlZGRlZCB2aWV3XG4gICAgY29uc3QgY29udGV4dCA9IG5ldyBDZGtUcmVlTm9kZU91dGxldENvbnRleHQ8VD4obm9kZURhdGEpO1xuXG4gICAgLy8gSWYgdGhlIHRyZWUgaXMgZmxhdCB0cmVlLCB0aGVuIHVzZSB0aGUgYGdldExldmVsYCBmdW5jdGlvbiBpbiBmbGF0IHRyZWUgY29udHJvbFxuICAgIC8vIE90aGVyd2lzZSwgdXNlIHRoZSBsZXZlbCBvZiBwYXJlbnQgbm9kZS5cbiAgICBpZiAodGhpcy50cmVlQ29udHJvbC5nZXRMZXZlbCkge1xuICAgICAgY29udGV4dC5sZXZlbCA9IHRoaXMudHJlZUNvbnRyb2wuZ2V0TGV2ZWwobm9kZURhdGEpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHBhcmVudERhdGEgIT09ICd1bmRlZmluZWQnICYmIHRoaXMuX2xldmVscy5oYXMocGFyZW50RGF0YSkpIHtcbiAgICAgIGNvbnRleHQubGV2ZWwgPSB0aGlzLl9sZXZlbHMuZ2V0KHBhcmVudERhdGEpISArIDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRleHQubGV2ZWwgPSAwO1xuICAgIH1cbiAgICB0aGlzLl9sZXZlbHMuc2V0KG5vZGVEYXRhLCBjb250ZXh0LmxldmVsKTtcblxuICAgIC8vIFVzZSBkZWZhdWx0IHRyZWUgbm9kZU91dGxldCwgb3IgbmVzdGVkIG5vZGUncyBub2RlT3V0bGV0XG4gICAgY29uc3QgY29udGFpbmVyID0gdmlld0NvbnRhaW5lciA/IHZpZXdDb250YWluZXIgOiB0aGlzLl9ub2RlT3V0bGV0LnZpZXdDb250YWluZXI7XG4gICAgY29udGFpbmVyLmNyZWF0ZUVtYmVkZGVkVmlldyhub2RlLnRlbXBsYXRlLCBjb250ZXh0LCBpbmRleCk7XG5cbiAgICAvLyBTZXQgdGhlIGRhdGEgdG8ganVzdCBjcmVhdGVkIGBDZGtUcmVlTm9kZWAuXG4gICAgLy8gVGhlIGBDZGtUcmVlTm9kZWAgY3JlYXRlZCBmcm9tIGBjcmVhdGVFbWJlZGRlZFZpZXdgIHdpbGwgYmUgc2F2ZWQgaW4gc3RhdGljIHZhcmlhYmxlXG4gICAgLy8gICAgIGBtb3N0UmVjZW50VHJlZU5vZGVgLiBXZSBnZXQgaXQgZnJvbSBzdGF0aWMgdmFyaWFibGUgYW5kIHBhc3MgdGhlIG5vZGUgZGF0YSB0byBpdC5cbiAgICBpZiAoQ2RrVHJlZU5vZGUubW9zdFJlY2VudFRyZWVOb2RlKSB7XG4gICAgICBDZGtUcmVlTm9kZS5tb3N0UmVjZW50VHJlZU5vZGUuZGF0YSA9IG5vZGVEYXRhO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFRyZWUgbm9kZSBmb3IgQ2RrVHJlZS4gSXQgY29udGFpbnMgdGhlIGRhdGEgaW4gdGhlIHRyZWUgbm9kZS5cbiAqL1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnY2RrLXRyZWUtbm9kZScsXG4gIGV4cG9ydEFzOiAnY2RrVHJlZU5vZGUnLFxuICBob3N0OiB7XG4gICAgJ2NsYXNzJzogJ2Nkay10cmVlLW5vZGUnLFxuICAgICdbYXR0ci5hcmlhLWV4cGFuZGVkXSc6ICdpc0V4cGFuZGVkJyxcbiAgfSxcbn0pXG5leHBvcnQgY2xhc3MgQ2RrVHJlZU5vZGU8VCwgSyA9IFQ+IGltcGxlbWVudHMgRm9jdXNhYmxlT3B0aW9uLCBPbkRlc3Ryb3ksIE9uSW5pdCB7XG4gIC8qKlxuICAgKiBUaGUgcm9sZSBvZiB0aGUgdHJlZSBub2RlLlxuICAgKiBAZGVwcmVjYXRlZCBUaGUgY29ycmVjdCByb2xlIGlzICd0cmVlaXRlbScsICdncm91cCcgc2hvdWxkIG5vdCBiZSB1c2VkLiBUaGlzIGlucHV0IHdpbGwgYmVcbiAgICogICByZW1vdmVkIGluIGEgZnV0dXJlIHZlcnNpb24uXG4gICAqIEBicmVha2luZy1jaGFuZ2UgMTIuMC4wIFJlbW92ZSB0aGlzIGlucHV0XG4gICAqL1xuICBASW5wdXQoKSBnZXQgcm9sZSgpOiAndHJlZWl0ZW0nIHwgJ2dyb3VwJyB7XG4gICAgcmV0dXJuICd0cmVlaXRlbSc7XG4gIH1cblxuICBzZXQgcm9sZShfcm9sZTogJ3RyZWVpdGVtJyB8ICdncm91cCcpIHtcbiAgICAvLyBUT0RPOiBtb3ZlIHRvIGhvc3QgYWZ0ZXIgVmlldyBFbmdpbmUgZGVwcmVjYXRpb25cbiAgICB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdyb2xlJywgX3JvbGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBtb3N0IHJlY2VudGx5IGNyZWF0ZWQgYENka1RyZWVOb2RlYC4gV2Ugc2F2ZSBpdCBpbiBzdGF0aWMgdmFyaWFibGUgc28gd2UgY2FuIHJldHJpZXZlIGl0XG4gICAqIGluIGBDZGtUcmVlYCBhbmQgc2V0IHRoZSBkYXRhIHRvIGl0LlxuICAgKi9cbiAgc3RhdGljIG1vc3RSZWNlbnRUcmVlTm9kZTogQ2RrVHJlZU5vZGU8YW55PiB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBTdWJqZWN0IHRoYXQgZW1pdHMgd2hlbiB0aGUgY29tcG9uZW50IGhhcyBiZWVuIGRlc3Ryb3llZC4gKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9kZXN0cm95ZWQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIC8qKiBFbWl0cyB3aGVuIHRoZSBub2RlJ3MgZGF0YSBoYXMgY2hhbmdlZC4gKi9cbiAgcmVhZG9ubHkgX2RhdGFDaGFuZ2VzID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBwcml2YXRlIF9wYXJlbnROb2RlQXJpYUxldmVsOiBudW1iZXI7XG5cbiAgLyoqIFRoZSB0cmVlIG5vZGUncyBkYXRhLiAqL1xuICBnZXQgZGF0YSgpOiBUIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YTtcbiAgfVxuICBzZXQgZGF0YSh2YWx1ZTogVCkge1xuICAgIGlmICh2YWx1ZSAhPT0gdGhpcy5fZGF0YSkge1xuICAgICAgdGhpcy5fZGF0YSA9IHZhbHVlO1xuICAgICAgdGhpcy5fc2V0Um9sZUZyb21EYXRhKCk7XG4gICAgICB0aGlzLl9kYXRhQ2hhbmdlcy5uZXh0KCk7XG4gICAgfVxuICB9XG4gIHByb3RlY3RlZCBfZGF0YTogVDtcblxuICBnZXQgaXNFeHBhbmRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fdHJlZS50cmVlQ29udHJvbC5pc0V4cGFuZGVkKHRoaXMuX2RhdGEpO1xuICB9XG5cbiAgZ2V0IGxldmVsKCk6IG51bWJlciB7XG4gICAgLy8gSWYgdGhlIHRyZWVDb250cm9sIGhhcyBhIGdldExldmVsIG1ldGhvZCwgdXNlIGl0IHRvIGdldCB0aGUgbGV2ZWwuIE90aGVyd2lzZSByZWFkIHRoZVxuICAgIC8vIGFyaWEtbGV2ZWwgb2ZmIHRoZSBwYXJlbnQgbm9kZSBhbmQgdXNlIGl0IGFzIHRoZSBsZXZlbCBmb3IgdGhpcyBub2RlIChub3RlIGFyaWEtbGV2ZWwgaXNcbiAgICAvLyAxLWluZGV4ZWQsIHdoaWxlIHRoaXMgcHJvcGVydHkgaXMgMC1pbmRleGVkLCBzbyB3ZSBkb24ndCBuZWVkIHRvIGluY3JlbWVudCkuXG4gICAgcmV0dXJuIHRoaXMuX3RyZWUudHJlZUNvbnRyb2wuZ2V0TGV2ZWxcbiAgICAgID8gdGhpcy5fdHJlZS50cmVlQ29udHJvbC5nZXRMZXZlbCh0aGlzLl9kYXRhKVxuICAgICAgOiB0aGlzLl9wYXJlbnROb2RlQXJpYUxldmVsO1xuICB9XG5cbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIF9lbGVtZW50UmVmOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PiwgcHJvdGVjdGVkIF90cmVlOiBDZGtUcmVlPFQsIEs+KSB7XG4gICAgQ2RrVHJlZU5vZGUubW9zdFJlY2VudFRyZWVOb2RlID0gdGhpcyBhcyBDZGtUcmVlTm9kZTxULCBLPjtcbiAgICB0aGlzLnJvbGUgPSAndHJlZWl0ZW0nO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5fcGFyZW50Tm9kZUFyaWFMZXZlbCA9IGdldFBhcmVudE5vZGVBcmlhTGV2ZWwodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KTtcbiAgICB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLWxldmVsJywgYCR7dGhpcy5sZXZlbCArIDF9YCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICAvLyBJZiB0aGlzIGlzIHRoZSBsYXN0IHRyZWUgbm9kZSBiZWluZyBkZXN0cm95ZWQsXG4gICAgLy8gY2xlYXIgb3V0IHRoZSByZWZlcmVuY2UgdG8gYXZvaWQgbGVha2luZyBtZW1vcnkuXG4gICAgaWYgKENka1RyZWVOb2RlLm1vc3RSZWNlbnRUcmVlTm9kZSA9PT0gdGhpcykge1xuICAgICAgQ2RrVHJlZU5vZGUubW9zdFJlY2VudFRyZWVOb2RlID0gbnVsbDtcbiAgICB9XG5cbiAgICB0aGlzLl9kYXRhQ2hhbmdlcy5jb21wbGV0ZSgpO1xuICAgIHRoaXMuX2Rlc3Ryb3llZC5uZXh0KCk7XG4gICAgdGhpcy5fZGVzdHJveWVkLmNvbXBsZXRlKCk7XG4gIH1cblxuICAvKiogRm9jdXNlcyB0aGUgbWVudSBpdGVtLiBJbXBsZW1lbnRzIGZvciBGb2N1c2FibGVPcHRpb24uICovXG4gIGZvY3VzKCk6IHZvaWQge1xuICAgIHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICB9XG5cbiAgLy8gVE9ETzogcm9sZSBzaG91bGQgZXZlbnR1YWxseSBqdXN0IGJlIHNldCBpbiB0aGUgY29tcG9uZW50IGhvc3RcbiAgcHJvdGVjdGVkIF9zZXRSb2xlRnJvbURhdGEoKTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgIXRoaXMuX3RyZWUudHJlZUNvbnRyb2wuaXNFeHBhbmRhYmxlICYmXG4gICAgICAhdGhpcy5fdHJlZS50cmVlQ29udHJvbC5nZXRDaGlsZHJlbiAmJlxuICAgICAgKHR5cGVvZiBuZ0Rldk1vZGUgPT09ICd1bmRlZmluZWQnIHx8IG5nRGV2TW9kZSlcbiAgICApIHtcbiAgICAgIHRocm93IGdldFRyZWVDb250cm9sRnVuY3Rpb25zTWlzc2luZ0Vycm9yKCk7XG4gICAgfVxuICAgIHRoaXMucm9sZSA9ICd0cmVlaXRlbSc7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0UGFyZW50Tm9kZUFyaWFMZXZlbChub2RlRWxlbWVudDogSFRNTEVsZW1lbnQpOiBudW1iZXIge1xuICBsZXQgcGFyZW50ID0gbm9kZUVsZW1lbnQucGFyZW50RWxlbWVudDtcbiAgd2hpbGUgKHBhcmVudCAmJiAhaXNOb2RlRWxlbWVudChwYXJlbnQpKSB7XG4gICAgcGFyZW50ID0gcGFyZW50LnBhcmVudEVsZW1lbnQ7XG4gIH1cbiAgaWYgKCFwYXJlbnQpIHtcbiAgICBpZiAodHlwZW9mIG5nRGV2TW9kZSA9PT0gJ3VuZGVmaW5lZCcgfHwgbmdEZXZNb2RlKSB7XG4gICAgICB0aHJvdyBFcnJvcignSW5jb3JyZWN0IHRyZWUgc3RydWN0dXJlIGNvbnRhaW5pbmcgZGV0YWNoZWQgbm9kZS4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIC0xO1xuICAgIH1cbiAgfSBlbHNlIGlmIChwYXJlbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdjZGstbmVzdGVkLXRyZWUtbm9kZScpKSB7XG4gICAgcmV0dXJuIGNvZXJjZU51bWJlclByb3BlcnR5KHBhcmVudC5nZXRBdHRyaWJ1dGUoJ2FyaWEtbGV2ZWwnKSEpO1xuICB9IGVsc2Uge1xuICAgIC8vIFRoZSBhbmNlc3RvciBlbGVtZW50IGlzIHRoZSBjZGstdHJlZSBpdHNlbGZcbiAgICByZXR1cm4gMDtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc05vZGVFbGVtZW50KGVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XG4gIGNvbnN0IGNsYXNzTGlzdCA9IGVsZW1lbnQuY2xhc3NMaXN0O1xuICByZXR1cm4gISEoY2xhc3NMaXN0Py5jb250YWlucygnY2RrLW5lc3RlZC10cmVlLW5vZGUnKSB8fCBjbGFzc0xpc3Q/LmNvbnRhaW5zKCdjZGstdHJlZScpKTtcbn1cbiJdfQ==
|