@angular/compiler-cli 12.1.0-next.6 → 12.1.3
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/linker/src/file_linker/emit_scopes/iife_emit_scope.js +1 -1
- package/linker/src/file_linker/partial_linkers/partial_component_linker_1.js +2 -3
- package/linker/src/file_linker/partial_linkers/partial_linker_selector.js +2 -2
- package/ngcc/src/dependencies/commonjs_dependency_host.js +1 -1
- package/ngcc/src/dependencies/dts_dependency_host.js +1 -1
- package/ngcc/src/dependencies/esm_dependency_host.js +1 -1
- package/ngcc/src/dependencies/umd_dependency_host.js +1 -1
- package/ngcc/src/entry_point_finder/program_based_entry_point_finder.js +1 -1
- package/ngcc/src/entry_point_finder/targeted_entry_point_finder.js +1 -1
- package/ngcc/src/execution/tasks/queues/parallel_task_queue.js +1 -1
- package/ngcc/src/execution/tasks/queues/serial_task_queue.js +1 -1
- package/ngcc/src/host/commonjs_host.js +1 -1
- package/ngcc/src/host/esm2015_host.js +1 -1
- package/ngcc/src/host/esm5_host.js +1 -1
- package/ngcc/src/host/umd_host.js +1 -1
- package/ngcc/src/packages/build_marker.d.ts +1 -1
- package/ngcc/src/packages/build_marker.js +1 -1
- package/ngcc/src/packages/configuration.d.ts +7 -0
- package/ngcc/src/packages/configuration.js +8 -3
- package/ngcc/src/packages/entry_point_manifest.js +2 -2
- package/ngcc/src/packages/ngcc_compiler_host.js +1 -1
- package/ngcc/src/rendering/commonjs_rendering_formatter.js +1 -1
- package/ngcc/src/rendering/esm5_rendering_formatter.js +1 -1
- package/ngcc/src/rendering/umd_rendering_formatter.js +1 -1
- package/ngcc/src/writing/new_entry_point_file_writer.js +1 -1
- package/package.json +2 -2
- package/src/ngtsc/annotations/src/component.d.ts +2 -0
- package/src/ngtsc/annotations/src/component.js +6 -2
- package/src/ngtsc/annotations/src/directive.js +1 -1
- package/src/ngtsc/annotations/src/ng_module.js +1 -1
- package/src/ngtsc/annotations/src/pipe.js +1 -1
- package/src/ngtsc/core/api/src/public_options.d.ts +12 -0
- package/src/ngtsc/core/api/src/public_options.js +1 -1
- package/src/ngtsc/core/src/compiler.d.ts +5 -0
- package/src/ngtsc/core/src/compiler.js +10 -1
- package/src/ngtsc/cycles/src/analyzer.d.ts +7 -0
- package/src/ngtsc/cycles/src/analyzer.js +89 -4
- package/src/ngtsc/cycles/src/imports.d.ts +1 -6
- package/src/ngtsc/cycles/src/imports.js +5 -23
- package/src/ngtsc/file_system/testing/src/mock_file_system_native.js +1 -1
- package/src/ngtsc/file_system/testing/src/mock_file_system_posix.js +1 -1
- package/src/ngtsc/file_system/testing/src/mock_file_system_windows.js +1 -1
- package/src/ngtsc/incremental/semantic_graph/src/graph.js +1 -1
- package/src/ngtsc/incremental/src/incremental.js +30 -4
- package/src/ngtsc/indexer/src/template.js +1 -1
- package/src/ngtsc/metadata/src/dts.js +2 -3
- package/src/ngtsc/metadata/src/inheritance.js +2 -7
- package/src/ngtsc/partial_evaluator/src/builtin.js +1 -1
- package/src/ngtsc/partial_evaluator/src/diagnostics.js +4 -1
- package/src/ngtsc/partial_evaluator/src/dynamic.d.ts +19 -1
- package/src/ngtsc/partial_evaluator/src/dynamic.js +12 -4
- package/src/ngtsc/partial_evaluator/src/interpreter.d.ts +2 -0
- package/src/ngtsc/partial_evaluator/src/interpreter.js +53 -5
- package/src/ngtsc/partial_evaluator/src/ts_helpers.js +1 -1
- package/src/ngtsc/program.d.ts +1 -0
- package/src/ngtsc/program.js +26 -2
- package/src/ngtsc/program_driver/src/api.d.ts +20 -1
- package/src/ngtsc/program_driver/src/api.js +3 -2
- package/src/ngtsc/program_driver/src/ts_create_program_driver.d.ts +2 -2
- package/src/ngtsc/program_driver/src/ts_create_program_driver.js +7 -3
- package/src/ngtsc/reflection/src/typescript.js +4 -1
- package/src/ngtsc/transform/src/api.d.ts +6 -0
- package/src/ngtsc/transform/src/api.js +1 -1
- package/src/ngtsc/transform/src/compilation.d.ts +2 -0
- package/src/ngtsc/transform/src/compilation.js +59 -20
- package/src/ngtsc/transform/src/transform.js +1 -1
- package/src/ngtsc/typecheck/src/context.d.ts +2 -1
- package/src/ngtsc/typecheck/src/context.js +11 -3
- package/src/ngtsc/typecheck/src/template_semantics.js +1 -1
- package/src/ngtsc/typecheck/src/template_symbol_builder.js +36 -4
- package/src/ngtsc/typecheck/src/type_check_block.js +2 -2
- package/src/ngtsc/typecheck/src/type_check_file.js +1 -1
- package/src/ngtsc/typecheck/src/type_emitter.d.ts +2 -1
- package/src/ngtsc/typecheck/src/type_emitter.js +54 -48
- package/src/ngtsc/typecheck/src/type_parameter_emitter.d.ts +2 -0
- package/src/ngtsc/typecheck/src/type_parameter_emitter.js +21 -7
- package/src/ngtsc/util/src/visitor.d.ts +1 -1
- package/src/ngtsc/util/src/visitor.js +1 -8
- package/src/ngtsc/xi18n/index.d.ts +9 -0
- package/src/ngtsc/xi18n/index.js +22 -0
- package/src/ngtsc/xi18n/src/context.d.ts +26 -0
- package/src/ngtsc/xi18n/src/context.js +20 -0
- package/src/transformers/api.d.ts +0 -3
- package/src/transformers/api.js +1 -1
- package/src/transformers/i18n.d.ts +14 -0
- package/src/transformers/i18n.js +76 -0
- package/src/transformers/program.d.ts +0 -4
- package/src/transformers/program.js +5 -56
- package/src/version.js +1 -1
- package/compiler-cli.externs.js +0 -0
- package/index.mjs +0 -20
- package/linker/babel/babel.externs.js +0 -0
- package/linker/babel/index.mjs +0 -11
- package/linker/babel/src/ast/babel_ast_factory.mjs +0 -137
- package/linker/babel/src/ast/babel_ast_host.mjs +0 -154
- package/linker/babel/src/babel_declaration_scope.mjs +0 -52
- package/linker/babel/src/babel_plugin.mjs +0 -23
- package/linker/babel/src/es2015_linker_plugin.mjs +0 -158
- package/linker/babel/src/linker_plugin_options.mjs +0 -2
- package/linker/index.mjs +0 -7
- package/linker/linker.externs.js +0 -0
- package/linker/src/ast/ast_host.mjs +0 -9
- package/linker/src/ast/ast_value.mjs +0 -256
- package/linker/src/ast/typescript/typescript_ast_host.mjs +0 -156
- package/linker/src/ast/utils.mjs +0 -17
- package/linker/src/fatal_linker_error.mjs +0 -30
- package/linker/src/file_linker/declaration_scope.mjs +0 -9
- package/linker/src/file_linker/emit_scopes/emit_scope.mjs +0 -41
- package/linker/src/file_linker/emit_scopes/iife_emit_scope.mjs +0 -33
- package/linker/src/file_linker/file_linker.mjs +0 -70
- package/linker/src/file_linker/get_source_file.mjs +0 -28
- package/linker/src/file_linker/linker_environment.mjs +0 -23
- package/linker/src/file_linker/linker_options.mjs +0 -16
- package/linker/src/file_linker/needs_linking.mjs +0 -27
- package/linker/src/file_linker/partial_linkers/partial_class_metadata_linker_1.mjs +0 -29
- package/linker/src/file_linker/partial_linkers/partial_component_linker_1.mjs +0 -194
- package/linker/src/file_linker/partial_linkers/partial_directive_linker_1.mjs +0 -137
- package/linker/src/file_linker/partial_linkers/partial_factory_linker_1.mjs +0 -52
- package/linker/src/file_linker/partial_linkers/partial_injectable_linker_1.mjs +0 -56
- package/linker/src/file_linker/partial_linkers/partial_injector_linker_1.mjs +0 -38
- package/linker/src/file_linker/partial_linkers/partial_linker.mjs +0 -2
- package/linker/src/file_linker/partial_linkers/partial_linker_selector.mjs +0 -166
- package/linker/src/file_linker/partial_linkers/partial_ng_module_linker_1.mjs +0 -110
- package/linker/src/file_linker/partial_linkers/partial_pipe_linker_1.mjs +0 -42
- package/linker/src/file_linker/partial_linkers/util.mjs +0 -78
- package/linker/src/file_linker/translator.mjs +0 -23
- package/linker/src/linker_import_generator.mjs +0 -28
- package/ngcc/index.mjs +0 -16
- package/ngcc/main-ivy-ngcc.mjs +0 -12
- package/ngcc/main-ngcc.mjs +0 -32
- package/ngcc/ngcc.externs.js +0 -0
- package/ngcc/src/analysis/decoration_analyzer.mjs +0 -215
- package/ngcc/src/analysis/migration_host.mjs +0 -80
- package/ngcc/src/analysis/module_with_providers_analyzer.mjs +0 -178
- package/ngcc/src/analysis/ngcc_references_registry.mjs +0 -45
- package/ngcc/src/analysis/ngcc_trait_compiler.mjs +0 -70
- package/ngcc/src/analysis/private_declarations_analyzer.mjs +0 -47
- package/ngcc/src/analysis/switch_marker_analyzer.mjs +0 -34
- package/ngcc/src/analysis/types.mjs +0 -2
- package/ngcc/src/analysis/util.mjs +0 -19
- package/ngcc/src/command_line_options.mjs +0 -142
- package/ngcc/src/constants.mjs +0 -10
- package/ngcc/src/dependencies/commonjs_dependency_host.mjs +0 -87
- package/ngcc/src/dependencies/dependency_host.mjs +0 -102
- package/ngcc/src/dependencies/dependency_resolver.mjs +0 -151
- package/ngcc/src/dependencies/dts_dependency_host.mjs +0 -18
- package/ngcc/src/dependencies/esm_dependency_host.mjs +0 -286
- package/ngcc/src/dependencies/module_resolver.mjs +0 -233
- package/ngcc/src/dependencies/umd_dependency_host.mjs +0 -33
- package/ngcc/src/entry_point_finder/directory_walker_entry_point_finder.mjs +0 -42
- package/ngcc/src/entry_point_finder/entry_point_collector.mjs +0 -120
- package/ngcc/src/entry_point_finder/interface.mjs +0 -2
- package/ngcc/src/entry_point_finder/program_based_entry_point_finder.mjs +0 -91
- package/ngcc/src/entry_point_finder/targeted_entry_point_finder.mjs +0 -216
- package/ngcc/src/entry_point_finder/tracing_entry_point_finder.mjs +0 -63
- package/ngcc/src/entry_point_finder/utils.mjs +0 -176
- package/ngcc/src/execution/analyze_entry_points.mjs +0 -130
- package/ngcc/src/execution/api.mjs +0 -2
- package/ngcc/src/execution/cluster/api.mjs +0 -9
- package/ngcc/src/execution/cluster/executor.mjs +0 -27
- package/ngcc/src/execution/cluster/master.mjs +0 -261
- package/ngcc/src/execution/cluster/package_json_updater.mjs +0 -45
- package/ngcc/src/execution/cluster/utils.mjs +0 -59
- package/ngcc/src/execution/cluster/worker.mjs +0 -81
- package/ngcc/src/execution/create_compile_function.mjs +0 -62
- package/ngcc/src/execution/single_process_executor.mjs +0 -57
- package/ngcc/src/execution/tasks/api.mjs +0 -22
- package/ngcc/src/execution/tasks/completion.mjs +0 -61
- package/ngcc/src/execution/tasks/queues/base_task_queue.mjs +0 -78
- package/ngcc/src/execution/tasks/queues/parallel_task_queue.mjs +0 -53
- package/ngcc/src/execution/tasks/queues/serial_task_queue.mjs +0 -29
- package/ngcc/src/execution/tasks/utils.mjs +0 -114
- package/ngcc/src/host/commonjs_host.mjs +0 -220
- package/ngcc/src/host/commonjs_umd_utils.mjs +0 -186
- package/ngcc/src/host/delegating_host.mjs +0 -140
- package/ngcc/src/host/esm2015_host.mjs +0 -2293
- package/ngcc/src/host/esm5_host.mjs +0 -721
- package/ngcc/src/host/ngcc_host.mjs +0 -15
- package/ngcc/src/host/umd_host.mjs +0 -486
- package/ngcc/src/host/utils.mjs +0 -12
- package/ngcc/src/locking/async_locker.mjs +0 -76
- package/ngcc/src/locking/lock_file.mjs +0 -4
- package/ngcc/src/locking/lock_file_with_child_process/index.mjs +0 -78
- package/ngcc/src/locking/lock_file_with_child_process/unlocker.mjs +0 -34
- package/ngcc/src/locking/lock_file_with_child_process/util.mjs +0 -29
- package/ngcc/src/locking/sync_locker.mjs +0 -52
- package/ngcc/src/main.mjs +0 -134
- package/ngcc/src/migrations/migration.mjs +0 -2
- package/ngcc/src/migrations/missing_injectable_migration.mjs +0 -164
- package/ngcc/src/migrations/undecorated_child_migration.mjs +0 -61
- package/ngcc/src/migrations/undecorated_parent_migration.mjs +0 -86
- package/ngcc/src/migrations/utils.mjs +0 -117
- package/ngcc/src/ngcc_options.mjs +0 -119
- package/ngcc/src/packages/build_marker.mjs +0 -84
- package/ngcc/src/packages/bundle_program.mjs +0 -52
- package/ngcc/src/packages/configuration.mjs +0 -250
- package/ngcc/src/packages/entry_point.mjs +0 -239
- package/ngcc/src/packages/entry_point_bundle.mjs +0 -68
- package/ngcc/src/packages/entry_point_manifest.mjs +0 -162
- package/ngcc/src/packages/ngcc_compiler_host.mjs +0 -77
- package/ngcc/src/packages/patch_ts_expando_initializer.mjs +0 -166
- package/ngcc/src/packages/source_file_cache.mjs +0 -187
- package/ngcc/src/packages/transformer.mjs +0 -140
- package/ngcc/src/path_mappings.mjs +0 -13
- package/ngcc/src/rendering/commonjs_rendering_formatter.mjs +0 -65
- package/ngcc/src/rendering/dts_renderer.mjs +0 -139
- package/ngcc/src/rendering/esm5_rendering_formatter.mjs +0 -50
- package/ngcc/src/rendering/esm_rendering_formatter.mjs +0 -251
- package/ngcc/src/rendering/ngcc_import_rewriter.mjs +0 -32
- package/ngcc/src/rendering/renderer.mjs +0 -170
- package/ngcc/src/rendering/rendering_formatter.mjs +0 -2
- package/ngcc/src/rendering/source_maps.mjs +0 -54
- package/ngcc/src/rendering/umd_rendering_formatter.mjs +0 -292
- package/ngcc/src/rendering/utils.mjs +0 -20
- package/ngcc/src/utils.mjs +0 -144
- package/ngcc/src/writing/cleaning/cleaning_strategies.mjs +0 -61
- package/ngcc/src/writing/cleaning/package_cleaner.mjs +0 -67
- package/ngcc/src/writing/cleaning/utils.mjs +0 -16
- package/ngcc/src/writing/file_writer.mjs +0 -2
- package/ngcc/src/writing/in_place_file_writer.mjs +0 -62
- package/ngcc/src/writing/new_entry_point_file_writer.mjs +0 -161
- package/ngcc/src/writing/package_json_updater.mjs +0 -144
- package/src/diagnostics/translate_diagnostics.mjs +0 -47
- package/src/diagnostics/typescript_version.mjs +0 -79
- package/src/extract_i18n.mjs +0 -46
- package/src/language_services.mjs +0 -18
- package/src/main.mjs +0 -185
- package/src/metadata/bundle_index_host.mjs +0 -107
- package/src/metadata/bundler.mjs +0 -556
- package/src/metadata/collector.mjs +0 -701
- package/src/metadata/evaluator.mjs +0 -643
- package/src/metadata/index.mjs +0 -11
- package/src/metadata/index_writer.mjs +0 -44
- package/src/metadata/schema.mjs +0 -102
- package/src/metadata/symbols.mjs +0 -117
- package/src/ngtsc/annotations/annotations.externs.js +0 -0
- package/src/ngtsc/annotations/index.mjs +0 -15
- package/src/ngtsc/annotations/src/api.mjs +0 -9
- package/src/ngtsc/annotations/src/component.mjs +0 -1064
- package/src/ngtsc/annotations/src/diagnostics.mjs +0 -147
- package/src/ngtsc/annotations/src/directive.mjs +0 -692
- package/src/ngtsc/annotations/src/factory.mjs +0 -17
- package/src/ngtsc/annotations/src/injectable.mjs +0 -260
- package/src/ngtsc/annotations/src/metadata.mjs +0 -145
- package/src/ngtsc/annotations/src/ng_module.mjs +0 -565
- package/src/ngtsc/annotations/src/pipe.mjs +0 -151
- package/src/ngtsc/annotations/src/references_registry.mjs +0 -16
- package/src/ngtsc/annotations/src/util.mjs +0 -495
- package/src/ngtsc/core/api/index.mjs +0 -12
- package/src/ngtsc/core/api/src/adapter.mjs +0 -9
- package/src/ngtsc/core/api/src/interfaces.mjs +0 -9
- package/src/ngtsc/core/api/src/options.mjs +0 -9
- package/src/ngtsc/core/api/src/public_options.mjs +0 -9
- package/src/ngtsc/core/api.externs.js +0 -0
- package/src/ngtsc/core/core.externs.js +0 -0
- package/src/ngtsc/core/index.mjs +0 -10
- package/src/ngtsc/core/src/compiler.mjs +0 -908
- package/src/ngtsc/core/src/config.mjs +0 -15
- package/src/ngtsc/core/src/host.mjs +0 -229
- package/src/ngtsc/cycles/cycles.externs.js +0 -0
- package/src/ngtsc/cycles/index.mjs +0 -10
- package/src/ngtsc/cycles/src/analyzer.mjs +0 -60
- package/src/ngtsc/cycles/src/imports.mjs +0 -152
- package/src/ngtsc/diagnostics/diagnostics.externs.js +0 -0
- package/src/ngtsc/diagnostics/index.mjs +0 -11
- package/src/ngtsc/diagnostics/src/error.mjs +0 -51
- package/src/ngtsc/diagnostics/src/error_code.mjs +0 -198
- package/src/ngtsc/diagnostics/src/util.mjs +0 -21
- package/src/ngtsc/entry_point/entry_point.externs.js +0 -0
- package/src/ngtsc/entry_point/index.mjs +0 -12
- package/src/ngtsc/entry_point/src/generator.mjs +0 -35
- package/src/ngtsc/entry_point/src/logic.mjs +0 -35
- package/src/ngtsc/entry_point/src/private_export_checker.mjs +0 -122
- package/src/ngtsc/entry_point/src/reference_graph.mjs +0 -73
- package/src/ngtsc/file_system/file_system.externs.js +0 -0
- package/src/ngtsc/file_system/index.mjs +0 -13
- package/src/ngtsc/file_system/src/compiler_host.mjs +0 -64
- package/src/ngtsc/file_system/src/helpers.mjs +0 -99
- package/src/ngtsc/file_system/src/invalid_file_system.mjs +0 -95
- package/src/ngtsc/file_system/src/logical.mjs +0 -84
- package/src/ngtsc/file_system/src/node_js_file_system.mjs +0 -142
- package/src/ngtsc/file_system/src/types.mjs +0 -9
- package/src/ngtsc/file_system/src/util.mjs +0 -22
- package/src/ngtsc/file_system/testing/index.mjs +0 -13
- package/src/ngtsc/file_system/testing/src/mock_file_system.mjs +0 -293
- package/src/ngtsc/file_system/testing/src/mock_file_system_native.mjs +0 -57
- package/src/ngtsc/file_system/testing/src/mock_file_system_posix.mjs +0 -38
- package/src/ngtsc/file_system/testing/src/mock_file_system_windows.mjs +0 -38
- package/src/ngtsc/file_system/testing/src/test_helper.mjs +0 -108
- package/src/ngtsc/file_system/testing/testing.externs.js +0 -0
- package/src/ngtsc/imports/imports.externs.js +0 -0
- package/src/ngtsc/imports/index.mjs +0 -14
- package/src/ngtsc/imports/src/alias.mjs +0 -137
- package/src/ngtsc/imports/src/core.mjs +0 -78
- package/src/ngtsc/imports/src/default.mjs +0 -135
- package/src/ngtsc/imports/src/emitter.mjs +0 -266
- package/src/ngtsc/imports/src/find_export.mjs +0 -56
- package/src/ngtsc/imports/src/reexport.mjs +0 -9
- package/src/ngtsc/imports/src/references.mjs +0 -137
- package/src/ngtsc/imports/src/resolver.mjs +0 -24
- package/src/ngtsc/incremental/api.externs.js +0 -0
- package/src/ngtsc/incremental/api.mjs +0 -9
- package/src/ngtsc/incremental/incremental.externs.js +0 -0
- package/src/ngtsc/incremental/index.mjs +0 -12
- package/src/ngtsc/incremental/semantic_graph/index.mjs +0 -12
- package/src/ngtsc/incremental/semantic_graph/semantic_graph.externs.js +0 -0
- package/src/ngtsc/incremental/semantic_graph/src/api.mjs +0 -36
- package/src/ngtsc/incremental/semantic_graph/src/graph.mjs +0 -237
- package/src/ngtsc/incremental/semantic_graph/src/type_parameters.mjs +0 -40
- package/src/ngtsc/incremental/semantic_graph/src/util.mjs +0 -69
- package/src/ngtsc/incremental/src/dependency_tracking.mjs +0 -117
- package/src/ngtsc/incremental/src/incremental.mjs +0 -271
- package/src/ngtsc/incremental/src/noop.mjs +0 -13
- package/src/ngtsc/incremental/src/state.mjs +0 -17
- package/src/ngtsc/incremental/src/strategy.mjs +0 -76
- package/src/ngtsc/indexer/index.mjs +0 -11
- package/src/ngtsc/indexer/indexer.externs.js +0 -0
- package/src/ngtsc/indexer/src/api.mjs +0 -30
- package/src/ngtsc/indexer/src/context.mjs +0 -25
- package/src/ngtsc/indexer/src/template.mjs +0 -303
- package/src/ngtsc/indexer/src/transform.mjs +0 -51
- package/src/ngtsc/logging/index.mjs +0 -10
- package/src/ngtsc/logging/logging.externs.js +0 -0
- package/src/ngtsc/logging/src/console_logger.mjs +0 -43
- package/src/ngtsc/logging/src/logger.mjs +0 -15
- package/src/ngtsc/logging/testing/index.mjs +0 -9
- package/src/ngtsc/logging/testing/src/mock_logger.mjs +0 -32
- package/src/ngtsc/logging/testing/testing.externs.js +0 -0
- package/src/ngtsc/metadata/index.mjs +0 -15
- package/src/ngtsc/metadata/metadata.externs.js +0 -0
- package/src/ngtsc/metadata/src/api.mjs +0 -13
- package/src/ngtsc/metadata/src/dts.mjs +0 -143
- package/src/ngtsc/metadata/src/inheritance.mjs +0 -71
- package/src/ngtsc/metadata/src/property_mapping.mjs +0 -136
- package/src/ngtsc/metadata/src/registry.mjs +0 -80
- package/src/ngtsc/metadata/src/resource_registry.mjs +0 -81
- package/src/ngtsc/metadata/src/util.mjs +0 -200
- package/src/ngtsc/partial_evaluator/index.mjs +0 -12
- package/src/ngtsc/partial_evaluator/partial_evaluator.externs.js +0 -0
- package/src/ngtsc/partial_evaluator/src/builtin.mjs +0 -65
- package/src/ngtsc/partial_evaluator/src/diagnostics.mjs +0 -171
- package/src/ngtsc/partial_evaluator/src/dynamic.mjs +0 -86
- package/src/ngtsc/partial_evaluator/src/interface.mjs +0 -27
- package/src/ngtsc/partial_evaluator/src/interpreter.mjs +0 -683
- package/src/ngtsc/partial_evaluator/src/known_declaration.mjs +0 -43
- package/src/ngtsc/partial_evaluator/src/result.mjs +0 -50
- package/src/ngtsc/partial_evaluator/src/ts_helpers.mjs +0 -72
- package/src/ngtsc/perf/index.mjs +0 -11
- package/src/ngtsc/perf/perf.externs.js +0 -0
- package/src/ngtsc/perf/src/api.mjs +0 -278
- package/src/ngtsc/perf/src/clock.mjs +0 -15
- package/src/ngtsc/perf/src/noop.mjs +0 -21
- package/src/ngtsc/perf/src/recorder.mjs +0 -125
- package/src/ngtsc/program.mjs +0 -247
- package/src/ngtsc/program_driver/index.mjs +0 -10
- package/src/ngtsc/program_driver/program_driver.externs.js +0 -0
- package/src/ngtsc/program_driver/src/api.mjs +0 -22
- package/src/ngtsc/program_driver/src/ts_create_program_driver.mjs +0 -164
- package/src/ngtsc/reflection/index.mjs +0 -12
- package/src/ngtsc/reflection/reflection.externs.js +0 -0
- package/src/ngtsc/reflection/src/host.mjs +0 -73
- package/src/ngtsc/reflection/src/type_to_value.mjs +0 -243
- package/src/ngtsc/reflection/src/typescript.mjs +0 -608
- package/src/ngtsc/reflection/src/util.mjs +0 -21
- package/src/ngtsc/resource/index.mjs +0 -9
- package/src/ngtsc/resource/resource.externs.js +0 -0
- package/src/ngtsc/resource/src/loader.mjs +0 -242
- package/src/ngtsc/routing/index.mjs +0 -11
- package/src/ngtsc/routing/routing.externs.js +0 -0
- package/src/ngtsc/routing/src/analyzer.mjs +0 -69
- package/src/ngtsc/routing/src/lazy.mjs +0 -168
- package/src/ngtsc/routing/src/route.mjs +0 -51
- package/src/ngtsc/scope/index.mjs +0 -12
- package/src/ngtsc/scope/scope.externs.js +0 -0
- package/src/ngtsc/scope/src/api.mjs +0 -9
- package/src/ngtsc/scope/src/component_scope.mjs +0 -31
- package/src/ngtsc/scope/src/dependency.mjs +0 -134
- package/src/ngtsc/scope/src/local.mjs +0 -531
- package/src/ngtsc/scope/src/typecheck.mjs +0 -83
- package/src/ngtsc/shims/api.externs.js +0 -0
- package/src/ngtsc/shims/api.mjs +0 -2
- package/src/ngtsc/shims/index.mjs +0 -14
- package/src/ngtsc/shims/shims.externs.js +0 -0
- package/src/ngtsc/shims/src/adapter.mjs +0 -188
- package/src/ngtsc/shims/src/expando.mjs +0 -102
- package/src/ngtsc/shims/src/factory_generator.mjs +0 -265
- package/src/ngtsc/shims/src/reference_tagger.mjs +0 -67
- package/src/ngtsc/shims/src/summary_generator.mjs +0 -64
- package/src/ngtsc/shims/src/util.mjs +0 -26
- package/src/ngtsc/sourcemaps/index.mjs +0 -11
- package/src/ngtsc/sourcemaps/sourcemaps.externs.js +0 -0
- package/src/ngtsc/sourcemaps/src/content_origin.mjs +0 -35
- package/src/ngtsc/sourcemaps/src/raw_source_map.mjs +0 -2
- package/src/ngtsc/sourcemaps/src/segment_marker.mjs +0 -40
- package/src/ngtsc/sourcemaps/src/source_file.mjs +0 -459
- package/src/ngtsc/sourcemaps/src/source_file_loader.mjs +0 -213
- package/src/ngtsc/switch/index.mjs +0 -9
- package/src/ngtsc/switch/src/switch.mjs +0 -115
- package/src/ngtsc/switch/switch.externs.js +0 -0
- package/src/ngtsc/transform/index.mjs +0 -14
- package/src/ngtsc/transform/src/alias.mjs +0 -30
- package/src/ngtsc/transform/src/api.mjs +0 -63
- package/src/ngtsc/transform/src/compilation.mjs +0 -496
- package/src/ngtsc/transform/src/declaration.mjs +0 -182
- package/src/ngtsc/transform/src/trait.mjs +0 -95
- package/src/ngtsc/transform/src/transform.mjs +0 -298
- package/src/ngtsc/transform/src/utils.mjs +0 -57
- package/src/ngtsc/transform/transform.externs.js +0 -0
- package/src/ngtsc/translator/index.mjs +0 -14
- package/src/ngtsc/translator/src/api/ast_factory.mjs +0 -9
- package/src/ngtsc/translator/src/api/import_generator.mjs +0 -9
- package/src/ngtsc/translator/src/context.mjs +0 -24
- package/src/ngtsc/translator/src/import_manager.mjs +0 -48
- package/src/ngtsc/translator/src/translator.mjs +0 -317
- package/src/ngtsc/translator/src/type_translator.mjs +0 -204
- package/src/ngtsc/translator/src/typescript_ast_factory.mjs +0 -211
- package/src/ngtsc/translator/src/typescript_translator.mjs +0 -17
- package/src/ngtsc/translator/translator.externs.js +0 -0
- package/src/ngtsc/tsc_plugin.mjs +0 -98
- package/src/ngtsc/typecheck/api/api.externs.js +0 -0
- package/src/ngtsc/typecheck/api/api.mjs +0 -9
- package/src/ngtsc/typecheck/api/checker.mjs +0 -31
- package/src/ngtsc/typecheck/api/completion.mjs +0 -16
- package/src/ngtsc/typecheck/api/context.mjs +0 -9
- package/src/ngtsc/typecheck/api/index.mjs +0 -14
- package/src/ngtsc/typecheck/api/scope.mjs +0 -9
- package/src/ngtsc/typecheck/api/symbols.mjs +0 -22
- package/src/ngtsc/typecheck/diagnostics/diagnostics.externs.js +0 -0
- package/src/ngtsc/typecheck/diagnostics/index.mjs +0 -10
- package/src/ngtsc/typecheck/diagnostics/src/diagnostic.mjs +0 -99
- package/src/ngtsc/typecheck/diagnostics/src/id.mjs +0 -23
- package/src/ngtsc/typecheck/index.mjs +0 -12
- package/src/ngtsc/typecheck/src/checker.mjs +0 -591
- package/src/ngtsc/typecheck/src/comments.mjs +0 -159
- package/src/ngtsc/typecheck/src/completion.mjs +0 -155
- package/src/ngtsc/typecheck/src/context.mjs +0 -350
- package/src/ngtsc/typecheck/src/diagnostics.mjs +0 -95
- package/src/ngtsc/typecheck/src/dom.mjs +0 -68
- package/src/ngtsc/typecheck/src/environment.mjs +0 -146
- package/src/ngtsc/typecheck/src/expression.mjs +0 -412
- package/src/ngtsc/typecheck/src/line_mappings.mjs +0 -60
- package/src/ngtsc/typecheck/src/oob.mjs +0 -112
- package/src/ngtsc/typecheck/src/shim.mjs +0 -37
- package/src/ngtsc/typecheck/src/source.mjs +0 -74
- package/src/ngtsc/typecheck/src/tcb_util.mjs +0 -135
- package/src/ngtsc/typecheck/src/template_semantics.mjs +0 -34
- package/src/ngtsc/typecheck/src/template_symbol_builder.mjs +0 -472
- package/src/ngtsc/typecheck/src/ts_util.mjs +0 -157
- package/src/ngtsc/typecheck/src/type_check_block.mjs +0 -1770
- package/src/ngtsc/typecheck/src/type_check_file.mjs +0 -65
- package/src/ngtsc/typecheck/src/type_constructor.mjs +0 -227
- package/src/ngtsc/typecheck/src/type_emitter.mjs +0 -140
- package/src/ngtsc/typecheck/src/type_parameter_emitter.mjs +0 -80
- package/src/ngtsc/typecheck/typecheck.externs.js +0 -0
- package/src/ngtsc/util/src/path.mjs +0 -18
- package/src/ngtsc/util/src/typescript.mjs +0 -143
- package/src/ngtsc/util/src/visitor.mjs +0 -107
- package/src/ngtsc/util/util.externs.js +0 -0
- package/src/perform_compile.mjs +0 -275
- package/src/perform_watch.mjs +0 -247
- package/src/tooling.mjs +0 -32
- package/src/transformers/api.mjs +0 -27
- package/src/transformers/compiler_host.mjs +0 -593
- package/src/transformers/downlevel_decorators_transform.mjs +0 -507
- package/src/transformers/entry_points.mjs +0 -10
- package/src/transformers/inline_resources.mjs +0 -269
- package/src/transformers/lower_expressions.mjs +0 -336
- package/src/transformers/metadata_cache.mjs +0 -53
- package/src/transformers/metadata_reader.mjs +0 -104
- package/src/transformers/node_emitter.mjs +0 -606
- package/src/transformers/node_emitter_transform.mjs +0 -78
- package/src/transformers/patch_alias_reference_resolution.mjs +0 -109
- package/src/transformers/program.mjs +0 -935
- package/src/transformers/r3_metadata_transform.mjs +0 -46
- package/src/transformers/r3_transform.mjs +0 -29
- package/src/transformers/util.mjs +0 -89
- package/src/typescript_support.mjs +0 -57
- package/src/version.mjs +0 -15
|
@@ -1,496 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright Google LLC All Rights Reserved.
|
|
4
|
-
*
|
|
5
|
-
* Use of this source code is governed by an MIT-style license that can be
|
|
6
|
-
* found in the LICENSE file at https://angular.io/license
|
|
7
|
-
*/
|
|
8
|
-
import * as ts from 'typescript';
|
|
9
|
-
import { ErrorCode, FatalDiagnosticError } from '../../diagnostics';
|
|
10
|
-
import { PerfEvent } from '../../perf';
|
|
11
|
-
import { getSourceFile } from '../../util/src/typescript';
|
|
12
|
-
import { CompilationMode, HandlerPrecedence } from './api';
|
|
13
|
-
import { Trait, TraitState } from './trait';
|
|
14
|
-
/**
|
|
15
|
-
* The heart of Angular compilation.
|
|
16
|
-
*
|
|
17
|
-
* The `TraitCompiler` is responsible for processing all classes in the program. Any time a
|
|
18
|
-
* `DecoratorHandler` matches a class, a "trait" is created to represent that Angular aspect of the
|
|
19
|
-
* class (such as the class having a component definition).
|
|
20
|
-
*
|
|
21
|
-
* The `TraitCompiler` transitions each trait through the various phases of compilation, culminating
|
|
22
|
-
* in the production of `CompileResult`s instructing the compiler to apply various mutations to the
|
|
23
|
-
* class (like adding fields or type declarations).
|
|
24
|
-
*/
|
|
25
|
-
export class TraitCompiler {
|
|
26
|
-
constructor(handlers, reflector, perf, incrementalBuild, compileNonExportedClasses, compilationMode, dtsTransforms, semanticDepGraphUpdater) {
|
|
27
|
-
this.handlers = handlers;
|
|
28
|
-
this.reflector = reflector;
|
|
29
|
-
this.perf = perf;
|
|
30
|
-
this.incrementalBuild = incrementalBuild;
|
|
31
|
-
this.compileNonExportedClasses = compileNonExportedClasses;
|
|
32
|
-
this.compilationMode = compilationMode;
|
|
33
|
-
this.dtsTransforms = dtsTransforms;
|
|
34
|
-
this.semanticDepGraphUpdater = semanticDepGraphUpdater;
|
|
35
|
-
/**
|
|
36
|
-
* Maps class declarations to their `ClassRecord`, which tracks the Ivy traits being applied to
|
|
37
|
-
* those classes.
|
|
38
|
-
*/
|
|
39
|
-
this.classes = new Map();
|
|
40
|
-
/**
|
|
41
|
-
* Maps source files to any class declaration(s) within them which have been discovered to contain
|
|
42
|
-
* Ivy traits.
|
|
43
|
-
*/
|
|
44
|
-
this.fileToClasses = new Map();
|
|
45
|
-
this.reexportMap = new Map();
|
|
46
|
-
this.handlersByName = new Map();
|
|
47
|
-
for (const handler of handlers) {
|
|
48
|
-
this.handlersByName.set(handler.name, handler);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
analyzeSync(sf) {
|
|
52
|
-
this.analyze(sf, false);
|
|
53
|
-
}
|
|
54
|
-
analyzeAsync(sf) {
|
|
55
|
-
return this.analyze(sf, true);
|
|
56
|
-
}
|
|
57
|
-
analyze(sf, preanalyze) {
|
|
58
|
-
// We shouldn't analyze declaration files.
|
|
59
|
-
if (sf.isDeclarationFile) {
|
|
60
|
-
return undefined;
|
|
61
|
-
}
|
|
62
|
-
// analyze() really wants to return `Promise<void>|void`, but TypeScript cannot narrow a return
|
|
63
|
-
// type of 'void', so `undefined` is used instead.
|
|
64
|
-
const promises = [];
|
|
65
|
-
const priorWork = this.incrementalBuild.priorAnalysisFor(sf);
|
|
66
|
-
if (priorWork !== null) {
|
|
67
|
-
for (const priorRecord of priorWork) {
|
|
68
|
-
this.adopt(priorRecord);
|
|
69
|
-
}
|
|
70
|
-
this.perf.eventCount(PerfEvent.SourceFileReuseAnalysis);
|
|
71
|
-
this.perf.eventCount(PerfEvent.TraitReuseAnalysis, priorWork.length);
|
|
72
|
-
// Skip the rest of analysis, as this file's prior traits are being reused.
|
|
73
|
-
return;
|
|
74
|
-
}
|
|
75
|
-
const visit = (node) => {
|
|
76
|
-
if (this.reflector.isClass(node)) {
|
|
77
|
-
this.analyzeClass(node, preanalyze ? promises : null);
|
|
78
|
-
}
|
|
79
|
-
ts.forEachChild(node, visit);
|
|
80
|
-
};
|
|
81
|
-
visit(sf);
|
|
82
|
-
if (preanalyze && promises.length > 0) {
|
|
83
|
-
return Promise.all(promises).then(() => undefined);
|
|
84
|
-
}
|
|
85
|
-
else {
|
|
86
|
-
return undefined;
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
recordFor(clazz) {
|
|
90
|
-
if (this.classes.has(clazz)) {
|
|
91
|
-
return this.classes.get(clazz);
|
|
92
|
-
}
|
|
93
|
-
else {
|
|
94
|
-
return null;
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
recordsFor(sf) {
|
|
98
|
-
if (!this.fileToClasses.has(sf)) {
|
|
99
|
-
return null;
|
|
100
|
-
}
|
|
101
|
-
const records = [];
|
|
102
|
-
for (const clazz of this.fileToClasses.get(sf)) {
|
|
103
|
-
records.push(this.classes.get(clazz));
|
|
104
|
-
}
|
|
105
|
-
return records;
|
|
106
|
-
}
|
|
107
|
-
getAnalyzedRecords() {
|
|
108
|
-
const result = new Map();
|
|
109
|
-
for (const [sf, classes] of this.fileToClasses) {
|
|
110
|
-
const records = [];
|
|
111
|
-
for (const clazz of classes) {
|
|
112
|
-
records.push(this.classes.get(clazz));
|
|
113
|
-
}
|
|
114
|
-
result.set(sf, records);
|
|
115
|
-
}
|
|
116
|
-
return result;
|
|
117
|
-
}
|
|
118
|
-
/**
|
|
119
|
-
* Import a `ClassRecord` from a previous compilation.
|
|
120
|
-
*
|
|
121
|
-
* Traits from the `ClassRecord` have accurate metadata, but the `handler` is from the old program
|
|
122
|
-
* and needs to be updated (matching is done by name). A new pending trait is created and then
|
|
123
|
-
* transitioned to analyzed using the previous analysis. If the trait is in the errored state,
|
|
124
|
-
* instead the errors are copied over.
|
|
125
|
-
*/
|
|
126
|
-
adopt(priorRecord) {
|
|
127
|
-
const record = {
|
|
128
|
-
hasPrimaryHandler: priorRecord.hasPrimaryHandler,
|
|
129
|
-
hasWeakHandlers: priorRecord.hasWeakHandlers,
|
|
130
|
-
metaDiagnostics: priorRecord.metaDiagnostics,
|
|
131
|
-
node: priorRecord.node,
|
|
132
|
-
traits: [],
|
|
133
|
-
};
|
|
134
|
-
for (const priorTrait of priorRecord.traits) {
|
|
135
|
-
const handler = this.handlersByName.get(priorTrait.handler.name);
|
|
136
|
-
let trait = Trait.pending(handler, priorTrait.detected);
|
|
137
|
-
if (priorTrait.state === TraitState.Analyzed || priorTrait.state === TraitState.Resolved) {
|
|
138
|
-
const symbol = this.makeSymbolForTrait(handler, record.node, priorTrait.analysis);
|
|
139
|
-
trait = trait.toAnalyzed(priorTrait.analysis, priorTrait.analysisDiagnostics, symbol);
|
|
140
|
-
if (trait.analysis !== null && trait.handler.register !== undefined) {
|
|
141
|
-
trait.handler.register(record.node, trait.analysis);
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
else if (priorTrait.state === TraitState.Skipped) {
|
|
145
|
-
trait = trait.toSkipped();
|
|
146
|
-
}
|
|
147
|
-
record.traits.push(trait);
|
|
148
|
-
}
|
|
149
|
-
this.classes.set(record.node, record);
|
|
150
|
-
const sf = record.node.getSourceFile();
|
|
151
|
-
if (!this.fileToClasses.has(sf)) {
|
|
152
|
-
this.fileToClasses.set(sf, new Set());
|
|
153
|
-
}
|
|
154
|
-
this.fileToClasses.get(sf).add(record.node);
|
|
155
|
-
}
|
|
156
|
-
scanClassForTraits(clazz) {
|
|
157
|
-
if (!this.compileNonExportedClasses && !this.reflector.isStaticallyExported(clazz)) {
|
|
158
|
-
return null;
|
|
159
|
-
}
|
|
160
|
-
const decorators = this.reflector.getDecoratorsOfDeclaration(clazz);
|
|
161
|
-
return this.detectTraits(clazz, decorators);
|
|
162
|
-
}
|
|
163
|
-
detectTraits(clazz, decorators) {
|
|
164
|
-
let record = this.recordFor(clazz);
|
|
165
|
-
let foundTraits = [];
|
|
166
|
-
for (const handler of this.handlers) {
|
|
167
|
-
const result = handler.detect(clazz, decorators);
|
|
168
|
-
if (result === undefined) {
|
|
169
|
-
continue;
|
|
170
|
-
}
|
|
171
|
-
const isPrimaryHandler = handler.precedence === HandlerPrecedence.PRIMARY;
|
|
172
|
-
const isWeakHandler = handler.precedence === HandlerPrecedence.WEAK;
|
|
173
|
-
const trait = Trait.pending(handler, result);
|
|
174
|
-
foundTraits.push(trait);
|
|
175
|
-
if (record === null) {
|
|
176
|
-
// This is the first handler to match this class. This path is a fast path through which
|
|
177
|
-
// most classes will flow.
|
|
178
|
-
record = {
|
|
179
|
-
node: clazz,
|
|
180
|
-
traits: [trait],
|
|
181
|
-
metaDiagnostics: null,
|
|
182
|
-
hasPrimaryHandler: isPrimaryHandler,
|
|
183
|
-
hasWeakHandlers: isWeakHandler,
|
|
184
|
-
};
|
|
185
|
-
this.classes.set(clazz, record);
|
|
186
|
-
const sf = clazz.getSourceFile();
|
|
187
|
-
if (!this.fileToClasses.has(sf)) {
|
|
188
|
-
this.fileToClasses.set(sf, new Set());
|
|
189
|
-
}
|
|
190
|
-
this.fileToClasses.get(sf).add(clazz);
|
|
191
|
-
}
|
|
192
|
-
else {
|
|
193
|
-
// This is at least the second handler to match this class. This is a slower path that some
|
|
194
|
-
// classes will go through, which validates that the set of decorators applied to the class
|
|
195
|
-
// is valid.
|
|
196
|
-
// Validate according to rules as follows:
|
|
197
|
-
//
|
|
198
|
-
// * WEAK handlers are removed if a non-WEAK handler matches.
|
|
199
|
-
// * Only one PRIMARY handler can match at a time. Any other PRIMARY handler matching a
|
|
200
|
-
// class with an existing PRIMARY handler is an error.
|
|
201
|
-
if (!isWeakHandler && record.hasWeakHandlers) {
|
|
202
|
-
// The current handler is not a WEAK handler, but the class has other WEAK handlers.
|
|
203
|
-
// Remove them.
|
|
204
|
-
record.traits =
|
|
205
|
-
record.traits.filter(field => field.handler.precedence !== HandlerPrecedence.WEAK);
|
|
206
|
-
record.hasWeakHandlers = false;
|
|
207
|
-
}
|
|
208
|
-
else if (isWeakHandler && !record.hasWeakHandlers) {
|
|
209
|
-
// The current handler is a WEAK handler, but the class has non-WEAK handlers already.
|
|
210
|
-
// Drop the current one.
|
|
211
|
-
continue;
|
|
212
|
-
}
|
|
213
|
-
if (isPrimaryHandler && record.hasPrimaryHandler) {
|
|
214
|
-
// The class already has a PRIMARY handler, and another one just matched.
|
|
215
|
-
record.metaDiagnostics = [{
|
|
216
|
-
category: ts.DiagnosticCategory.Error,
|
|
217
|
-
code: Number('-99' + ErrorCode.DECORATOR_COLLISION),
|
|
218
|
-
file: getSourceFile(clazz),
|
|
219
|
-
start: clazz.getStart(undefined, false),
|
|
220
|
-
length: clazz.getWidth(),
|
|
221
|
-
messageText: 'Two incompatible decorators on class',
|
|
222
|
-
}];
|
|
223
|
-
record.traits = foundTraits = [];
|
|
224
|
-
break;
|
|
225
|
-
}
|
|
226
|
-
// Otherwise, it's safe to accept the multiple decorators here. Update some of the metadata
|
|
227
|
-
// regarding this class.
|
|
228
|
-
record.traits.push(trait);
|
|
229
|
-
record.hasPrimaryHandler = record.hasPrimaryHandler || isPrimaryHandler;
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
return foundTraits.length > 0 ? foundTraits : null;
|
|
233
|
-
}
|
|
234
|
-
makeSymbolForTrait(handler, decl, analysis) {
|
|
235
|
-
if (analysis === null) {
|
|
236
|
-
return null;
|
|
237
|
-
}
|
|
238
|
-
const symbol = handler.symbol(decl, analysis);
|
|
239
|
-
if (symbol !== null && this.semanticDepGraphUpdater !== null) {
|
|
240
|
-
const isPrimary = handler.precedence === HandlerPrecedence.PRIMARY;
|
|
241
|
-
if (!isPrimary) {
|
|
242
|
-
throw new Error(`AssertionError: ${handler.name} returned a symbol but is not a primary handler.`);
|
|
243
|
-
}
|
|
244
|
-
this.semanticDepGraphUpdater.registerSymbol(symbol);
|
|
245
|
-
}
|
|
246
|
-
return symbol;
|
|
247
|
-
}
|
|
248
|
-
analyzeClass(clazz, preanalyzeQueue) {
|
|
249
|
-
const traits = this.scanClassForTraits(clazz);
|
|
250
|
-
if (traits === null) {
|
|
251
|
-
// There are no Ivy traits on the class, so it can safely be skipped.
|
|
252
|
-
return;
|
|
253
|
-
}
|
|
254
|
-
for (const trait of traits) {
|
|
255
|
-
const analyze = () => this.analyzeTrait(clazz, trait);
|
|
256
|
-
let preanalysis = null;
|
|
257
|
-
if (preanalyzeQueue !== null && trait.handler.preanalyze !== undefined) {
|
|
258
|
-
// Attempt to run preanalysis. This could fail with a `FatalDiagnosticError`; catch it if it
|
|
259
|
-
// does.
|
|
260
|
-
try {
|
|
261
|
-
preanalysis = trait.handler.preanalyze(clazz, trait.detected.metadata) || null;
|
|
262
|
-
}
|
|
263
|
-
catch (err) {
|
|
264
|
-
if (err instanceof FatalDiagnosticError) {
|
|
265
|
-
trait.toAnalyzed(null, [err.toDiagnostic()], null);
|
|
266
|
-
return;
|
|
267
|
-
}
|
|
268
|
-
else {
|
|
269
|
-
throw err;
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
if (preanalysis !== null) {
|
|
274
|
-
preanalyzeQueue.push(preanalysis.then(analyze));
|
|
275
|
-
}
|
|
276
|
-
else {
|
|
277
|
-
analyze();
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
analyzeTrait(clazz, trait, flags) {
|
|
282
|
-
var _a, _b, _c;
|
|
283
|
-
if (trait.state !== TraitState.Pending) {
|
|
284
|
-
throw new Error(`Attempt to analyze trait of ${clazz.name.text} in state ${TraitState[trait.state]} (expected DETECTED)`);
|
|
285
|
-
}
|
|
286
|
-
this.perf.eventCount(PerfEvent.TraitAnalyze);
|
|
287
|
-
// Attempt analysis. This could fail with a `FatalDiagnosticError`; catch it if it does.
|
|
288
|
-
let result;
|
|
289
|
-
try {
|
|
290
|
-
result = trait.handler.analyze(clazz, trait.detected.metadata, flags);
|
|
291
|
-
}
|
|
292
|
-
catch (err) {
|
|
293
|
-
if (err instanceof FatalDiagnosticError) {
|
|
294
|
-
trait.toAnalyzed(null, [err.toDiagnostic()], null);
|
|
295
|
-
return;
|
|
296
|
-
}
|
|
297
|
-
else {
|
|
298
|
-
throw err;
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
const symbol = this.makeSymbolForTrait(trait.handler, clazz, (_a = result.analysis) !== null && _a !== void 0 ? _a : null);
|
|
302
|
-
if (result.analysis !== undefined && trait.handler.register !== undefined) {
|
|
303
|
-
trait.handler.register(clazz, result.analysis);
|
|
304
|
-
}
|
|
305
|
-
trait = trait.toAnalyzed((_b = result.analysis) !== null && _b !== void 0 ? _b : null, (_c = result.diagnostics) !== null && _c !== void 0 ? _c : null, symbol);
|
|
306
|
-
}
|
|
307
|
-
resolve() {
|
|
308
|
-
var _a, _b;
|
|
309
|
-
const classes = Array.from(this.classes.keys());
|
|
310
|
-
for (const clazz of classes) {
|
|
311
|
-
const record = this.classes.get(clazz);
|
|
312
|
-
for (let trait of record.traits) {
|
|
313
|
-
const handler = trait.handler;
|
|
314
|
-
switch (trait.state) {
|
|
315
|
-
case TraitState.Skipped:
|
|
316
|
-
continue;
|
|
317
|
-
case TraitState.Pending:
|
|
318
|
-
throw new Error(`Resolving a trait that hasn't been analyzed: ${clazz.name.text} / ${Object.getPrototypeOf(trait.handler).constructor.name}`);
|
|
319
|
-
case TraitState.Resolved:
|
|
320
|
-
throw new Error(`Resolving an already resolved trait`);
|
|
321
|
-
}
|
|
322
|
-
if (trait.analysis === null) {
|
|
323
|
-
// No analysis results, cannot further process this trait.
|
|
324
|
-
continue;
|
|
325
|
-
}
|
|
326
|
-
if (handler.resolve === undefined) {
|
|
327
|
-
// No resolution of this trait needed - it's considered successful by default.
|
|
328
|
-
trait = trait.toResolved(null, null);
|
|
329
|
-
continue;
|
|
330
|
-
}
|
|
331
|
-
let result;
|
|
332
|
-
try {
|
|
333
|
-
result = handler.resolve(clazz, trait.analysis, trait.symbol);
|
|
334
|
-
}
|
|
335
|
-
catch (err) {
|
|
336
|
-
if (err instanceof FatalDiagnosticError) {
|
|
337
|
-
trait = trait.toResolved(null, [err.toDiagnostic()]);
|
|
338
|
-
continue;
|
|
339
|
-
}
|
|
340
|
-
else {
|
|
341
|
-
throw err;
|
|
342
|
-
}
|
|
343
|
-
}
|
|
344
|
-
trait = trait.toResolved((_a = result.data) !== null && _a !== void 0 ? _a : null, (_b = result.diagnostics) !== null && _b !== void 0 ? _b : null);
|
|
345
|
-
if (result.reexports !== undefined) {
|
|
346
|
-
const fileName = clazz.getSourceFile().fileName;
|
|
347
|
-
if (!this.reexportMap.has(fileName)) {
|
|
348
|
-
this.reexportMap.set(fileName, new Map());
|
|
349
|
-
}
|
|
350
|
-
const fileReexports = this.reexportMap.get(fileName);
|
|
351
|
-
for (const reexport of result.reexports) {
|
|
352
|
-
fileReexports.set(reexport.asAlias, [reexport.fromModule, reexport.symbolName]);
|
|
353
|
-
}
|
|
354
|
-
}
|
|
355
|
-
}
|
|
356
|
-
}
|
|
357
|
-
}
|
|
358
|
-
/**
|
|
359
|
-
* Generate type-checking code into the `TypeCheckContext` for any components within the given
|
|
360
|
-
* `ts.SourceFile`.
|
|
361
|
-
*/
|
|
362
|
-
typeCheck(sf, ctx) {
|
|
363
|
-
if (!this.fileToClasses.has(sf)) {
|
|
364
|
-
return;
|
|
365
|
-
}
|
|
366
|
-
for (const clazz of this.fileToClasses.get(sf)) {
|
|
367
|
-
const record = this.classes.get(clazz);
|
|
368
|
-
for (const trait of record.traits) {
|
|
369
|
-
if (trait.state !== TraitState.Resolved) {
|
|
370
|
-
continue;
|
|
371
|
-
}
|
|
372
|
-
else if (trait.handler.typeCheck === undefined) {
|
|
373
|
-
continue;
|
|
374
|
-
}
|
|
375
|
-
if (trait.resolution !== null) {
|
|
376
|
-
trait.handler.typeCheck(ctx, clazz, trait.analysis, trait.resolution);
|
|
377
|
-
}
|
|
378
|
-
}
|
|
379
|
-
}
|
|
380
|
-
}
|
|
381
|
-
index(ctx) {
|
|
382
|
-
for (const clazz of this.classes.keys()) {
|
|
383
|
-
const record = this.classes.get(clazz);
|
|
384
|
-
for (const trait of record.traits) {
|
|
385
|
-
if (trait.state !== TraitState.Resolved) {
|
|
386
|
-
// Skip traits that haven't been resolved successfully.
|
|
387
|
-
continue;
|
|
388
|
-
}
|
|
389
|
-
else if (trait.handler.index === undefined) {
|
|
390
|
-
// Skip traits that don't affect indexing.
|
|
391
|
-
continue;
|
|
392
|
-
}
|
|
393
|
-
if (trait.resolution !== null) {
|
|
394
|
-
trait.handler.index(ctx, clazz, trait.analysis, trait.resolution);
|
|
395
|
-
}
|
|
396
|
-
}
|
|
397
|
-
}
|
|
398
|
-
}
|
|
399
|
-
updateResources(clazz) {
|
|
400
|
-
if (!this.reflector.isClass(clazz) || !this.classes.has(clazz)) {
|
|
401
|
-
return;
|
|
402
|
-
}
|
|
403
|
-
const record = this.classes.get(clazz);
|
|
404
|
-
for (const trait of record.traits) {
|
|
405
|
-
if (trait.state !== TraitState.Resolved || trait.handler.updateResources === undefined) {
|
|
406
|
-
continue;
|
|
407
|
-
}
|
|
408
|
-
trait.handler.updateResources(clazz, trait.analysis, trait.resolution);
|
|
409
|
-
}
|
|
410
|
-
}
|
|
411
|
-
compile(clazz, constantPool) {
|
|
412
|
-
const original = ts.getOriginalNode(clazz);
|
|
413
|
-
if (!this.reflector.isClass(clazz) || !this.reflector.isClass(original) ||
|
|
414
|
-
!this.classes.has(original)) {
|
|
415
|
-
return null;
|
|
416
|
-
}
|
|
417
|
-
const record = this.classes.get(original);
|
|
418
|
-
let res = [];
|
|
419
|
-
for (const trait of record.traits) {
|
|
420
|
-
if (trait.state !== TraitState.Resolved || trait.analysisDiagnostics !== null ||
|
|
421
|
-
trait.resolveDiagnostics !== null) {
|
|
422
|
-
// Cannot compile a trait that is not resolved, or had any errors in its declaration.
|
|
423
|
-
continue;
|
|
424
|
-
}
|
|
425
|
-
// `trait.resolution` is non-null asserted here because TypeScript does not recognize that
|
|
426
|
-
// `Readonly<unknown>` is nullable (as `unknown` itself is nullable) due to the way that
|
|
427
|
-
// `Readonly` works.
|
|
428
|
-
let compileRes;
|
|
429
|
-
if (this.compilationMode === CompilationMode.PARTIAL &&
|
|
430
|
-
trait.handler.compilePartial !== undefined) {
|
|
431
|
-
compileRes = trait.handler.compilePartial(clazz, trait.analysis, trait.resolution);
|
|
432
|
-
}
|
|
433
|
-
else {
|
|
434
|
-
compileRes =
|
|
435
|
-
trait.handler.compileFull(clazz, trait.analysis, trait.resolution, constantPool);
|
|
436
|
-
}
|
|
437
|
-
const compileMatchRes = compileRes;
|
|
438
|
-
if (Array.isArray(compileMatchRes)) {
|
|
439
|
-
for (const result of compileMatchRes) {
|
|
440
|
-
if (!res.some(r => r.name === result.name)) {
|
|
441
|
-
res.push(result);
|
|
442
|
-
}
|
|
443
|
-
}
|
|
444
|
-
}
|
|
445
|
-
else if (!res.some(result => result.name === compileMatchRes.name)) {
|
|
446
|
-
res.push(compileMatchRes);
|
|
447
|
-
}
|
|
448
|
-
}
|
|
449
|
-
// Look up the .d.ts transformer for the input file and record that at least one field was
|
|
450
|
-
// generated, which will allow the .d.ts to be transformed later.
|
|
451
|
-
this.dtsTransforms.getIvyDeclarationTransform(original.getSourceFile())
|
|
452
|
-
.addFields(original, res);
|
|
453
|
-
// Return the instruction to the transformer so the fields will be added.
|
|
454
|
-
return res.length > 0 ? res : null;
|
|
455
|
-
}
|
|
456
|
-
decoratorsFor(node) {
|
|
457
|
-
const original = ts.getOriginalNode(node);
|
|
458
|
-
if (!this.reflector.isClass(original) || !this.classes.has(original)) {
|
|
459
|
-
return [];
|
|
460
|
-
}
|
|
461
|
-
const record = this.classes.get(original);
|
|
462
|
-
const decorators = [];
|
|
463
|
-
for (const trait of record.traits) {
|
|
464
|
-
if (trait.state !== TraitState.Resolved) {
|
|
465
|
-
continue;
|
|
466
|
-
}
|
|
467
|
-
if (trait.detected.trigger !== null && ts.isDecorator(trait.detected.trigger)) {
|
|
468
|
-
decorators.push(trait.detected.trigger);
|
|
469
|
-
}
|
|
470
|
-
}
|
|
471
|
-
return decorators;
|
|
472
|
-
}
|
|
473
|
-
get diagnostics() {
|
|
474
|
-
const diagnostics = [];
|
|
475
|
-
for (const clazz of this.classes.keys()) {
|
|
476
|
-
const record = this.classes.get(clazz);
|
|
477
|
-
if (record.metaDiagnostics !== null) {
|
|
478
|
-
diagnostics.push(...record.metaDiagnostics);
|
|
479
|
-
}
|
|
480
|
-
for (const trait of record.traits) {
|
|
481
|
-
if ((trait.state === TraitState.Analyzed || trait.state === TraitState.Resolved) &&
|
|
482
|
-
trait.analysisDiagnostics !== null) {
|
|
483
|
-
diagnostics.push(...trait.analysisDiagnostics);
|
|
484
|
-
}
|
|
485
|
-
if (trait.state === TraitState.Resolved && trait.resolveDiagnostics !== null) {
|
|
486
|
-
diagnostics.push(...trait.resolveDiagnostics);
|
|
487
|
-
}
|
|
488
|
-
}
|
|
489
|
-
}
|
|
490
|
-
return diagnostics;
|
|
491
|
-
}
|
|
492
|
-
get exportStatements() {
|
|
493
|
-
return this.reexportMap;
|
|
494
|
-
}
|
|
495
|
-
}
|
|
496
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcGlsYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21waWxlci1jbGkvc3JjL25ndHNjL3RyYW5zZm9ybS9zcmMvY29tcGlsYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBR0gsT0FBTyxLQUFLLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFakMsT0FBTyxFQUFDLFNBQVMsRUFBRSxvQkFBb0IsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBSWxFLE9BQU8sRUFBQyxTQUFTLEVBQWUsTUFBTSxZQUFZLENBQUM7QUFHbkQsT0FBTyxFQUFDLGFBQWEsRUFBYSxNQUFNLDJCQUEyQixDQUFDO0FBRXBFLE9BQU8sRUFBaUIsZUFBZSxFQUFpRCxpQkFBaUIsRUFBZ0IsTUFBTSxPQUFPLENBQUM7QUFFdkksT0FBTyxFQUFlLEtBQUssRUFBRSxVQUFVLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFxQ3hEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLE9BQU8sYUFBYTtJQWtCeEIsWUFDWSxRQUE0RSxFQUM1RSxTQUF5QixFQUFVLElBQWtCLEVBQ3JELGdCQUF3RCxFQUN4RCx5QkFBa0MsRUFBVSxlQUFnQyxFQUM1RSxhQUFtQyxFQUNuQyx1QkFBcUQ7UUFMckQsYUFBUSxHQUFSLFFBQVEsQ0FBb0U7UUFDNUUsY0FBUyxHQUFULFNBQVMsQ0FBZ0I7UUFBVSxTQUFJLEdBQUosSUFBSSxDQUFjO1FBQ3JELHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBd0M7UUFDeEQsOEJBQXlCLEdBQXpCLHlCQUF5QixDQUFTO1FBQVUsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQzVFLGtCQUFhLEdBQWIsYUFBYSxDQUFzQjtRQUNuQyw0QkFBdUIsR0FBdkIsdUJBQXVCLENBQThCO1FBdkJqRTs7O1dBR0c7UUFDSyxZQUFPLEdBQUcsSUFBSSxHQUFHLEVBQWlDLENBQUM7UUFF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QUFLLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRTtnQkFDakMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEtBQUssVUFBVSxDQUFDLFFBQVEsSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLFVBQVUsQ0FBQyxRQUFRLENBQUM7b0JBQzVFLEtBQUssQ0FBQyxtQkFBbUIsS0FBSyxJQUFJLEVBQUU7b0JBQ3RDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUMsbUJBQW1CLENBQUMsQ0FBQztpQkFDaEQ7Z0JBQ0QsSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLFVBQVUsQ0FBQyxRQUFRLElBQUksS0FBSyxDQUFDLGtCQUFrQixLQUFLLElBQUksRUFBRTtvQkFDNUUsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO2lCQUMvQzthQUNGO1NBQ0Y7UUFDRCxPQUFPLFdBQVcsQ0FBQztJQUNyQixDQUFDO0lBRUQsSUFBSSxnQkFBZ0I7UUFDbEIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQzFCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG5pbXBvcnQge0NvbnN0YW50UG9vbH0gZnJvbSAnQGFuZ3VsYXIvY29tcGlsZXInO1xuaW1wb3J0ICogYXMgdHMgZnJvbSAndHlwZXNjcmlwdCc7XG5cbmltcG9ydCB7RXJyb3JDb2RlLCBGYXRhbERpYWdub3N0aWNFcnJvcn0gZnJvbSAnLi4vLi4vZGlhZ25vc3RpY3MnO1xuaW1wb3J0IHtJbmNyZW1lbnRhbEJ1aWxkfSBmcm9tICcuLi8uLi9pbmNyZW1lbnRhbC9hcGknO1xuaW1wb3J0IHtTZW1hbnRpY0RlcEdyYXBoVXBkYXRlciwgU2VtYW50aWNTeW1ib2x9IGZyb20gJy4uLy4uL2luY3JlbWVudGFsL3NlbWFudGljX2dyYXBoJztcbmltcG9ydCB7SW5kZXhpbmdDb250ZXh0fSBmcm9tICcuLi8uLi9pbmRleGVyJztcbmltcG9ydCB7UGVyZkV2ZW50LCBQZXJmUmVjb3JkZXJ9IGZyb20gJy4uLy4uL3BlcmYnO1xuaW1wb3J0IHtDbGFzc0RlY2xhcmF0aW9uLCBEZWNsYXJhdGlvbk5vZGUsIERlY29yYXRvciwgUmVmbGVjdGlvbkhvc3R9IGZyb20gJy4uLy4uL3JlZmxlY3Rpb24nO1xuaW1wb3J0IHtQcm9ncmFtVHlwZUNoZWNrQWRhcHRlciwgVHlwZUNoZWNrQ29udGV4dH0gZnJvbSAnLi4vLi4vdHlwZWNoZWNrL2FwaSc7XG5pbXBvcnQge2dldFNvdXJjZUZpbGUsIGlzRXhwb3J0ZWR9IGZyb20gJy4uLy4uL3V0aWwvc3JjL3R5cGVzY3JpcHQnO1xuXG5pbXBvcnQge0FuYWx5c2lzT3V0cHV0LCBDb21waWxhdGlvbk1vZGUsIENvbXBpbGVSZXN1bHQsIERlY29yYXRvckhhbmRsZXIsIEhhbmRsZXJGbGFncywgSGFuZGxlclByZWNlZGVuY2UsIFJlc29sdmVSZXN1bHR9IGZyb20gJy4vYXBpJztcbmltcG9ydCB7RHRzVHJhbnNmb3JtUmVnaXN0cnl9IGZyb20gJy4vZGVjbGFyYXRpb24nO1xuaW1wb3J0IHtQZW5kaW5nVHJhaXQsIFRyYWl0LCBUcmFpdFN0YXRlfSBmcm9tICcuL3RyYWl0JztcblxuXG4vKipcbiAqIFJlY29yZHMgaW5mb3JtYXRpb24gYWJvdXQgYSBzcGVjaWZpYyBjbGFzcyB0aGF0IGhhcyBtYXRjaGVkIHRyYWl0cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDbGFzc1JlY29yZCB7XG4gIC8qKlxuICAgKiBUaGUgYENsYXNzRGVjbGFyYXRpb25gIG9mIHRoZSBjbGFzcyB3aGljaCBoYXMgQW5ndWxhciB0cmFpdHMgYXBwbGllZC5cbiAgICovXG4gIG5vZGU6IENsYXNzRGVjbGFyYXRpb247XG5cbiAgLyoqXG4gICAqIEFsbCB0cmFpdHMgd2hpY2ggbWF0Y2hlZCBvbiB0aGUgY2xhc3MuXG4gICAqL1xuICB0cmFpdHM6IFRyYWl0PHVua25vd24sIHVua25vd24sIFNlbWFudGljU3ltYm9sfG51bGwsIHVua25vd24+W107XG5cbiAgLyoqXG4gICAqIE1ldGEtZGlhZ25vc3RpY3MgYWJvdXQgdGhlIGNsYXNzLCB3aGljaCBhcmUgdXN1YWxseSByZWxhdGVkIHRvIHdoZXRoZXIgY2VydGFpbiBjb21iaW5hdGlvbnMgb2ZcbiAgICogQW5ndWxhciBkZWNvcmF0b3JzIGFyZSBub3QgcGVybWl0dGVkLlxuICAgKi9cbiAgbWV0YURpYWdub3N0aWNzOiB0cy5EaWFnbm9zdGljW118bnVsbDtcblxuICAvLyBTdWJzZXF1ZW50IGZpZWxkcyBhcmUgXCJpbnRlcm5hbFwiIGFuZCB1c2VkIGR1cmluZyB0aGUgbWF0Y2hpbmcgb2YgYERlY29yYXRvckhhbmRsZXJgcy4gVGhpcyBpc1xuICAvLyBtdXRhYmxlIHN0YXRlIGR1cmluZyB0aGUgYGRldGVjdGAvYGFuYWx5emVgIHBoYXNlcyBvZiBjb21waWxhdGlvbi5cblxuICAvKipcbiAgICogV2hldGhlciBgdHJhaXRzYCBjb250YWlucyB0cmFpdHMgbWF0Y2hlZCBmcm9tIGBEZWNvcmF0b3JIYW5kbGVyYHMgbWFya2VkIGFzIGBXRUFLYC5cbiAgICovXG4gIGhhc1dlYWtIYW5kbGVyczogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciBgdHJhaXRzYCBjb250YWlucyBhIHRyYWl0IGZyb20gYSBgRGVjb3JhdG9ySGFuZGxlcmAgbWF0Y2hlZCBhcyBgUFJJTUFSWWAuXG4gICAqL1xuICBoYXNQcmltYXJ5SGFuZGxlcjogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBUaGUgaGVhcnQgb2YgQW5ndWxhciBjb21waWxhdGlvbi5cbiAqXG4gKiBUaGUgYFRyYWl0Q29tcGlsZXJgIGlzIHJlc3BvbnNpYmxlIGZvciBwcm9jZXNzaW5nIGFsbCBjbGFzc2VzIGluIHRoZSBwcm9ncmFtLiBBbnkgdGltZSBhXG4gKiBgRGVjb3JhdG9ySGFuZGxlcmAgbWF0Y2hlcyBhIGNsYXNzLCBhIFwidHJhaXRcIiBpcyBjcmVhdGVkIHRvIHJlcHJlc2VudCB0aGF0IEFuZ3VsYXIgYXNwZWN0IG9mIHRoZVxuICogY2xhc3MgKHN1Y2ggYXMgdGhlIGNsYXNzIGhhdmluZyBhIGNvbXBvbmVudCBkZWZpbml0aW9uKS5cbiAqXG4gKiBUaGUgYFRyYWl0Q29tcGlsZXJgIHRyYW5zaXRpb25zIGVhY2ggdHJhaXQgdGhyb3VnaCB0aGUgdmFyaW91cyBwaGFzZXMgb2YgY29tcGlsYXRpb24sIGN1bG1pbmF0aW5nXG4gKiBpbiB0aGUgcHJvZHVjdGlvbiBvZiBgQ29tcGlsZVJlc3VsdGBzIGluc3RydWN0aW5nIHRoZSBjb21waWxlciB0byBhcHBseSB2YXJpb3VzIG11dGF0aW9ucyB0byB0aGVcbiAqIGNsYXNzIChsaWtlIGFkZGluZyBmaWVsZHMgb3IgdHlwZSBkZWNsYXJhdGlvbnMpLlxuICovXG5leHBvcnQgY2xhc3MgVHJhaXRDb21waWxlciBpbXBsZW1lbnRzIFByb2dyYW1UeXBlQ2hlY2tBZGFwdGVyIHtcbiAgLyoqXG4gICAqIE1hcHMgY2xhc3MgZGVjbGFyYXRpb25zIHRvIHRoZWlyIGBDbGFzc1JlY29yZGAsIHdoaWNoIHRyYWNrcyB0aGUgSXZ5IHRyYWl0cyBiZWluZyBhcHBsaWVkIHRvXG4gICAqIHRob3NlIGNsYXNzZXMuXG4gICAqL1xuICBwcml2YXRlIGNsYXNzZXMgPSBuZXcgTWFwPENsYXNzRGVjbGFyYXRpb24sIENsYXNzUmVjb3JkPigpO1xuXG4gIC8qKlxuICAgKiBNYXBzIHNvdXJjZSBmaWxlcyB0byBhbnkgY2xhc3MgZGVjbGFyYXRpb24ocykgd2l0aGluIHRoZW0gd2hpY2ggaGF2ZSBiZWVuIGRpc2NvdmVyZWQgdG8gY29udGFpblxuICAgKiBJdnkgdHJhaXRzLlxuICAgKi9cbiAgcHJvdGVjdGVkIGZpbGVUb0NsYXNzZXMgPSBuZXcgTWFwPHRzLlNvdXJjZUZpbGUsIFNldDxDbGFzc0RlY2xhcmF0aW9uPj4oKTtcblxuICBwcml2YXRlIHJlZXhwb3J0TWFwID0gbmV3IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIFtzdHJpbmcsIHN0cmluZ10+PigpO1xuXG4gIHByaXZhdGUgaGFuZGxlcnNCeU5hbWUgPVxuICAgICAgbmV3IE1hcDxzdHJpbmcsIERlY29yYXRvckhhbmRsZXI8dW5rbm93biwgdW5rbm93biwgU2VtYW50aWNTeW1ib2x8bnVsbCwgdW5rbm93bj4+KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBwcml2YXRlIGhhbmRsZXJzOiBEZWNvcmF0b3JIYW5kbGVyPHVua25vd24sIHVua25vd24sIFNlbWFudGljU3ltYm9sfG51bGwsIHVua25vd24+W10sXG4gICAgICBwcml2YXRlIHJlZmxlY3RvcjogUmVmbGVjdGlvbkhvc3QsIHByaXZhdGUgcGVyZjogUGVyZlJlY29yZGVyLFxuICAgICAgcHJpdmF0ZSBpbmNyZW1lbnRhbEJ1aWxkOiBJbmNyZW1lbnRhbEJ1aWxkPENsYXNzUmVjb3JkLCB1bmtub3duPixcbiAgICAgIHByaXZhdGUgY29tcGlsZU5vbkV4cG9ydGVkQ2xhc3NlczogYm9vbGVhbiwgcHJpdmF0ZSBjb21waWxhdGlvbk1vZGU6IENvbXBpbGF0aW9uTW9kZSxcbiAgICAgIHByaXZhdGUgZHRzVHJhbnNmb3JtczogRHRzVHJhbnNmb3JtUmVnaXN0cnksXG4gICAgICBwcml2YXRlIHNlbWFudGljRGVwR3JhcGhVcGRhdGVyOiBTZW1hbnRpY0RlcEdyYXBoVXBkYXRlcnxudWxsKSB7XG4gICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIGhhbmRsZXJzKSB7XG4gICAgICB0aGlzLmhhbmRsZXJzQnlOYW1lLnNldChoYW5kbGVyLm5hbWUsIGhhbmRsZXIpO1xuICAgIH1cbiAgfVxuXG4gIGFuYWx5emVTeW5jKHNmOiB0cy5Tb3VyY2VGaWxlKTogdm9pZCB7XG4gICAgdGhpcy5hbmFseXplKHNmLCBmYWxzZSk7XG4gIH1cblxuICBhbmFseXplQXN5bmMoc2Y6IHRzLlNvdXJjZUZpbGUpOiBQcm9taXNlPHZvaWQ+fHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuYW5hbHl6ZShzZiwgdHJ1ZSk7XG4gIH1cblxuICBwcml2YXRlIGFuYWx5emUoc2Y6IHRzLlNvdXJjZUZpbGUsIHByZWFuYWx5emU6IGZhbHNlKTogdm9pZDtcbiAgcHJpdmF0ZSBhbmFseXplKHNmOiB0cy5Tb3VyY2VGaWxlLCBwcmVhbmFseXplOiB0cnVlKTogUHJvbWlzZTx2b2lkPnx1bmRlZmluZWQ7XG4gIHByaXZhdGUgYW5hbHl6ZShzZjogdHMuU291cmNlRmlsZSwgcHJlYW5hbHl6ZTogYm9vbGVhbik6IFByb21pc2U8dm9pZD58dW5kZWZpbmVkIHtcbiAgICAvLyBXZSBzaG91bGRuJ3QgYW5hbHl6ZSBkZWNsYXJhdGlvbiBmaWxlcy5cbiAgICBpZiAoc2YuaXNEZWNsYXJhdGlvbkZpbGUpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gYW5hbHl6ZSgpIHJlYWxseSB3YW50cyB0byByZXR1cm4gYFByb21pc2U8dm9pZD58dm9pZGAsIGJ1dCBUeXBlU2NyaXB0IGNhbm5vdCBuYXJyb3cgYSByZXR1cm5cbiAgICAvLyB0eXBlIG9mICd2b2lkJywgc28gYHVuZGVmaW5lZGAgaXMgdXNlZCBpbnN0ZWFkLlxuICAgIGNvbnN0IHByb21pc2VzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcblxuICAgIGNvbnN0IHByaW9yV29yayA9IHRoaXMuaW5jcmVtZW50YWxCdWlsZC5wcmlvckFuYWx5c2lzRm9yKHNmKTtcbiAgICBpZiAocHJpb3JXb3JrICE9PSBudWxsKSB7XG4gICAgICBmb3IgKGNvbnN0IHByaW9yUmVjb3JkIG9mIHByaW9yV29yaykge1xuICAgICAgICB0aGlzLmFkb3B0KHByaW9yUmVjb3JkKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5wZXJmLmV2ZW50Q291bnQoUGVyZkV2ZW50LlNvdXJjZUZpbGVSZXVzZUFuYWx5c2lzKTtcbiAgICAgIHRoaXMucGVyZi5ldmVudENvdW50KFBlcmZFdmVudC5UcmFpdFJldXNlQW5hbHlzaXMsIHByaW9yV29yay5sZW5ndGgpO1xuXG4gICAgICAvLyBTa2lwIHRoZSByZXN0IG9mIGFuYWx5c2lzLCBhcyB0aGlzIGZpbGUncyBwcmlvciB0cmFpdHMgYXJlIGJlaW5nIHJldXNlZC5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB2aXNpdCA9IChub2RlOiB0cy5Ob2RlKTogdm9pZCA9PiB7XG4gICAgICBpZiAodGhpcy5yZWZsZWN0b3IuaXNDbGFzcyhub2RlKSkge1xuICAgICAgICB0aGlzLmFuYWx5emVDbGFzcyhub2RlLCBwcmVhbmFseXplID8gcHJvbWlzZXMgOiBudWxsKTtcbiAgICAgIH1cbiAgICAgIHRzLmZvckVhY2hDaGlsZChub2RlLCB2aXNpdCk7XG4gICAgfTtcblxuICAgIHZpc2l0KHNmKTtcblxuICAgIGlmIChwcmVhbmFseXplICYmIHByb21pc2VzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbigoKSA9PiB1bmRlZmluZWQgYXMgdm9pZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgcmVjb3JkRm9yKGNsYXp6OiBDbGFzc0RlY2xhcmF0aW9uKTogQ2xhc3NSZWNvcmR8bnVsbCB7XG4gICAgaWYgKHRoaXMuY2xhc3Nlcy5oYXMoY2xhenopKSB7XG4gICAgICByZXR1cm4gdGhpcy5jbGFzc2VzLmdldChjbGF6eikhO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICByZWNvcmRzRm9yKHNmOiB0cy5Tb3VyY2VGaWxlKTogQ2xhc3NSZWNvcmRbXXxudWxsIHtcbiAgICBpZiAoIXRoaXMuZmlsZVRvQ2xhc3Nlcy5oYXMoc2YpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgcmVjb3JkczogQ2xhc3NSZWNvcmRbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgY2xhenogb2YgdGhpcy5maWxlVG9DbGFzc2VzLmdldChzZikhKSB7XG4gICAgICByZWNvcmRzLnB1c2godGhpcy5jbGFzc2VzLmdldChjbGF6eikhKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlY29yZHM7XG4gIH1cblxuICBnZXRBbmFseXplZFJlY29yZHMoKTogTWFwPHRzLlNvdXJjZUZpbGUsIENsYXNzUmVjb3JkW10+IHtcbiAgICBjb25zdCByZXN1bHQgPSBuZXcgTWFwPHRzLlNvdXJjZUZpbGUsIENsYXNzUmVjb3JkW10+KCk7XG4gICAgZm9yIChjb25zdCBbc2YsIGNsYXNzZXNdIG9mIHRoaXMuZmlsZVRvQ2xhc3Nlcykge1xuICAgICAgY29uc3QgcmVjb3JkczogQ2xhc3NSZWNvcmRbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCBjbGF6eiBvZiBjbGFzc2VzKSB7XG4gICAgICAgIHJlY29yZHMucHVzaCh0aGlzLmNsYXNzZXMuZ2V0KGNsYXp6KSEpO1xuICAgICAgfVxuICAgICAgcmVzdWx0LnNldChzZiwgcmVjb3Jkcyk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogSW1wb3J0IGEgYENsYXNzUmVjb3JkYCBmcm9tIGEgcHJldmlvdXMgY29tcGlsYXRpb24uXG4gICAqXG4gICAqIFRyYWl0cyBmcm9tIHRoZSBgQ2xhc3NSZWNvcmRgIGhhdmUgYWNjdXJhdGUgbWV0YWRhdGEsIGJ1dCB0aGUgYGhhbmRsZXJgIGlzIGZyb20gdGhlIG9sZCBwcm9ncmFtXG4gICAqIGFuZCBuZWVkcyB0byBiZSB1cGRhdGVkIChtYXRjaGluZyBpcyBkb25lIGJ5IG5hbWUpLiBBIG5ldyBwZW5kaW5nIHRyYWl0IGlzIGNyZWF0ZWQgYW5kIHRoZW5cbiAgICogdHJhbnNpdGlvbmVkIHRvIGFuYWx5emVkIHVzaW5nIHRoZSBwcmV2aW91cyBhbmFseXNpcy4gSWYgdGhlIHRyYWl0IGlzIGluIHRoZSBlcnJvcmVkIHN0YXRlLFxuICAgKiBpbnN0ZWFkIHRoZSBlcnJvcnMgYXJlIGNvcGllZCBvdmVyLlxuICAgKi9cbiAgcHJpdmF0ZSBhZG9wdChwcmlvclJlY29yZDogQ2xhc3NSZWNvcmQpOiB2b2lkIHtcbiAgICBjb25zdCByZWNvcmQ6IENsYXNzUmVjb3JkID0ge1xuICAgICAgaGFzUHJpbWFyeUhhbmRsZXI6IHByaW9yUmVjb3JkLmhhc1ByaW1hcnlIYW5kbGVyLFxuICAgICAgaGFzV2Vha0hhbmRsZXJzOiBwcmlvclJlY29yZC5oYXNXZWFrSGFuZGxlcnMsXG4gICAgICBtZXRhRGlhZ25vc3RpY3M6IHByaW9yUmVjb3JkLm1ldGFEaWFnbm9zdGljcyxcbiAgICAgIG5vZGU6IHByaW9yUmVjb3JkLm5vZGUsXG4gICAgICB0cmFpdHM6IFtdLFxuICAgIH07XG5cbiAgICBmb3IgKGNvbnN0IHByaW9yVHJhaXQgb2YgcHJpb3JSZWNvcmQudHJhaXRzKSB7XG4gICAgICBjb25zdCBoYW5kbGVyID0gdGhpcy5oYW5kbGVyc0J5TmFtZS5nZXQocHJpb3JUcmFpdC5oYW5kbGVyLm5hbWUpITtcbiAgICAgIGxldCB0cmFpdDogVHJhaXQ8dW5rbm93biwgdW5rbm93biwgU2VtYW50aWNTeW1ib2x8bnVsbCwgdW5rbm93bj4gPVxuICAgICAgICAgIFRyYWl0LnBlbmRpbmcoaGFuZGxlciwgcHJpb3JUcmFpdC5kZXRlY3RlZCk7XG5cbiAgICAgIGlmIChwcmlvclRyYWl0LnN0YXRlID09PSBUcmFpdFN0YXRlLkFuYWx5emVkIHx8IHByaW9yVHJhaXQuc3RhdGUgPT09IFRyYWl0U3RhdGUuUmVzb2x2ZWQpIHtcbiAgICAgICAgY29uc3Qgc3ltYm9sID0gdGhpcy5tYWtlU3ltYm9sRm9yVHJhaXQoaGFuZGxlciwgcmVjb3JkLm5vZGUsIHByaW9yVHJhaXQuYW5hbHlzaXMpO1xuICAgICAgICB0cmFpdCA9IHRyYWl0LnRvQW5hbHl6ZWQocHJpb3JUcmFpdC5hbmFseXNpcywgcHJpb3JUcmFpdC5hbmFseXNpc0RpYWdub3N0aWNzLCBzeW1ib2wpO1xuICAgICAgICBpZiAodHJhaXQuYW5hbHlzaXMgIT09IG51bGwgJiYgdHJhaXQuaGFuZGxlci5yZWdpc3RlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdHJhaXQuaGFuZGxlci5yZWdpc3RlcihyZWNvcmQubm9kZSwgdHJhaXQuYW5hbHlzaXMpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHByaW9yVHJhaXQuc3RhdGUgPT09IFRyYWl0U3RhdGUuU2tpcHBlZCkge1xuICAgICAgICB0cmFpdCA9IHRyYWl0LnRvU2tpcHBlZCgpO1xuICAgICAgfVxuXG4gICAgICByZWNvcmQudHJhaXRzLnB1c2godHJhaXQpO1xuICAgIH1cblxuICAgIHRoaXMuY2xhc3Nlcy5zZXQocmVjb3JkLm5vZGUsIHJlY29yZCk7XG4gICAgY29uc3Qgc2YgPSByZWNvcmQubm9kZS5nZXRTb3VyY2VGaWxlKCk7XG4gICAgaWYgKCF0aGlzLmZpbGVUb0NsYXNzZXMuaGFzKHNmKSkge1xuICAgICAgdGhpcy5maWxlVG9DbGFzc2VzLnNldChzZiwgbmV3IFNldDxDbGFzc0RlY2xhcmF0aW9uPigpKTtcbiAgICB9XG4gICAgdGhpcy5maWxlVG9DbGFzc2VzLmdldChzZikhLmFkZChyZWNvcmQubm9kZSk7XG4gIH1cblxuICBwcml2YXRlIHNjYW5DbGFzc0ZvclRyYWl0cyhjbGF6ejogQ2xhc3NEZWNsYXJhdGlvbik6XG4gICAgICBQZW5kaW5nVHJhaXQ8dW5rbm93biwgdW5rbm93biwgU2VtYW50aWNTeW1ib2x8bnVsbCwgdW5rbm93bj5bXXxudWxsIHtcbiAgICBpZiAoIXRoaXMuY29tcGlsZU5vbkV4cG9ydGVkQ2xhc3NlcyAmJiAhdGhpcy5yZWZsZWN0b3IuaXNTdGF0aWNhbGx5RXhwb3J0ZWQoY2xhenopKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBkZWNvcmF0b3JzID0gdGhpcy5yZWZsZWN0b3IuZ2V0RGVjb3JhdG9yc09mRGVjbGFyYXRpb24oY2xhenopO1xuXG4gICAgcmV0dXJuIHRoaXMuZGV0ZWN0VHJhaXRzKGNsYXp6LCBkZWNvcmF0b3JzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBkZXRlY3RUcmFpdHMoY2xheno6IENsYXNzRGVjbGFyYXRpb24sIGRlY29yYXRvcnM6IERlY29yYXRvcltdfG51bGwpOlxuICAgICAgUGVuZGluZ1RyYWl0PHVua25vd24sIHVua25vd24sIFNlbWFudGljU3ltYm9sfG51bGwsIHVua25vd24+W118bnVsbCB7XG4gICAgbGV0IHJlY29yZDogQ2xhc3NSZWNvcmR8bnVsbCA9IHRoaXMucmVjb3JkRm9yKGNsYXp6KTtcbiAgICBsZXQgZm91bmRUcmFpdHM6IFBlbmRpbmdUcmFpdDx1bmtub3duLCB1bmtub3duLCBTZW1hbnRpY1N5bWJvbHxudWxsLCB1bmtub3duPltdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgdGhpcy5oYW5kbGVycykge1xuICAgICAgY29uc3QgcmVzdWx0ID0gaGFuZGxlci5kZXRlY3QoY2xhenosIGRlY29yYXRvcnMpO1xuICAgICAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBpc1ByaW1hcnlIYW5kbGVyID0gaGFuZGxlci5wcmVjZWRlbmNlID09PSBIYW5kbGVyUHJlY2VkZW5jZS5QUklNQVJZO1xuICAgICAgY29uc3QgaXNXZWFrSGFuZGxlciA9IGhhbmRsZXIucHJlY2VkZW5jZSA9PT0gSGFuZGxlclByZWNlZGVuY2UuV0VBSztcbiAgICAgIGNvbnN0IHRyYWl0ID0gVHJhaXQucGVuZGluZyhoYW5kbGVyLCByZXN1bHQpO1xuXG4gICAgICBmb3VuZFRyYWl0cy5wdXNoKHRyYWl0KTtcblxuICAgICAgaWYgKHJlY29yZCA9PT0gbnVsbCkge1xuICAgICAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCBoYW5kbGVyIHRvIG1hdGNoIHRoaXMgY2xhc3MuIFRoaXMgcGF0aCBpcyBhIGZhc3QgcGF0aCB0aHJvdWdoIHdoaWNoXG4gICAgICAgIC8vIG1vc3QgY2xhc3NlcyB3aWxsIGZsb3cuXG4gICAgICAgIHJlY29yZCA9IHtcbiAgICAgICAgICBub2RlOiBjbGF6eixcbiAgICAgICAgICB0cmFpdHM6IFt0cmFpdF0sXG4gICAgICAgICAgbWV0YURpYWdub3N0aWNzOiBudWxsLFxuICAgICAgICAgIGhhc1ByaW1hcnlIYW5kbGVyOiBpc1ByaW1hcnlIYW5kbGVyLFxuICAgICAgICAgIGhhc1dlYWtIYW5kbGVyczogaXNXZWFrSGFuZGxlcixcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmNsYXNzZXMuc2V0KGNsYXp6LCByZWNvcmQpO1xuICAgICAgICBjb25zdCBzZiA9IGNsYXp6LmdldFNvdXJjZUZpbGUoKTtcbiAgICAgICAgaWYgKCF0aGlzLmZpbGVUb0NsYXNzZXMuaGFzKHNmKSkge1xuICAgICAgICAgIHRoaXMuZmlsZVRvQ2xhc3Nlcy5zZXQoc2YsIG5ldyBTZXQ8Q2xhc3NEZWNsYXJhdGlvbj4oKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5maWxlVG9DbGFzc2VzLmdldChzZikhLmFkZChjbGF6eik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUaGlzIGlzIGF0IGxlYXN0IHRoZSBzZWNvbmQgaGFuZGxlciB0byBtYXRjaCB0aGlzIGNsYXNzLiBUaGlzIGlzIGEgc2xvd2VyIHBhdGggdGhhdCBzb21lXG4gICAgICAgIC8vIGNsYXNzZXMgd2lsbCBnbyB0aHJvdWdoLCB3aGljaCB2YWxpZGF0ZXMgdGhhdCB0aGUgc2V0IG9mIGRlY29yYXRvcnMgYXBwbGllZCB0byB0aGUgY2xhc3NcbiAgICAgICAgLy8gaXMgdmFsaWQuXG5cbiAgICAgICAgLy8gVmFsaWRhdGUgYWNjb3JkaW5nIHRvIHJ1bGVzIGFzIGZvbGxvd3M6XG4gICAgICAgIC8vXG4gICAgICAgIC8vICogV0VBSyBoYW5kbGVycyBhcmUgcmVtb3ZlZCBpZiBhIG5vbi1XRUFLIGhhbmRsZXIgbWF0Y2hlcy5cbiAgICAgICAgLy8gKiBPbmx5IG9uZSBQUklNQVJZIGhhbmRsZXIgY2FuIG1hdGNoIGF0IGEgdGltZS4gQW55IG90aGVyIFBSSU1BUlkgaGFuZGxlciBtYXRjaGluZyBhXG4gICAgICAgIC8vICAgY2xhc3Mgd2l0aCBhbiBleGlzdGluZyBQUklNQVJZIGhhbmRsZXIgaXMgYW4gZXJyb3IuXG5cbiAgICAgICAgaWYgKCFpc1dlYWtIYW5kbGVyICYmIHJlY29yZC5oYXNXZWFrSGFuZGxlcnMpIHtcbiAgICAgICAgICAvLyBUaGUgY3VycmVudCBoYW5kbGVyIGlzIG5vdCBhIFdFQUsgaGFuZGxlciwgYnV0IHRoZSBjbGFzcyBoYXMgb3RoZXIgV0VBSyBoYW5kbGVycy5cbiAgICAgICAgICAvLyBSZW1vdmUgdGhlbS5cbiAgICAgICAgICByZWNvcmQudHJhaXRzID1cbiAgICAgICAgICAgICAgcmVjb3JkLnRyYWl0cy5maWx0ZXIoZmllbGQgPT4gZmllbGQuaGFuZGxlci5wcmVjZWRlbmNlICE9PSBIYW5kbGVyUHJlY2VkZW5jZS5XRUFLKTtcbiAgICAgICAgICByZWNvcmQuaGFzV2Vha0hhbmRsZXJzID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNXZWFrSGFuZGxlciAmJiAhcmVjb3JkLmhhc1dlYWtIYW5kbGVycykge1xuICAgICAgICAgIC8vIFRoZSBjdXJyZW50IGhhbmRsZXIgaXMgYSBXRUFLIGhhbmRsZXIsIGJ1dCB0aGUgY2xhc3MgaGFzIG5vbi1XRUFLIGhhbmRsZXJzIGFscmVhZHkuXG4gICAgICAgICAgLy8gRHJvcCB0aGUgY3VycmVudCBvbmUuXG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNQcmltYXJ5SGFuZGxlciAmJiByZWNvcmQuaGFzUHJpbWFyeUhhbmRsZXIpIHtcbiAgICAgICAgICAvLyBUaGUgY2xhc3MgYWxyZWFkeSBoYXMgYSBQUklNQVJZIGhhbmRsZXIsIGFuZCBhbm90aGVyIG9uZSBqdXN0IG1hdGNoZWQuXG4gICAgICAgICAgcmVjb3JkLm1ldGFEaWFnbm9zdGljcyA9IFt7XG4gICAgICAgICAgICBjYXRlZ29yeTogdHMuRGlhZ25vc3RpY0NhdGVnb3J5LkVycm9yLFxuICAgICAgICAgICAgY29kZTogTnVtYmVyKCctOTknICsgRXJyb3JDb2RlLkRFQ09SQVRPUl9DT0xMSVNJT04pLFxuICAgICAgICAgICAgZmlsZTogZ2V0U291cmNlRmlsZShjbGF6eiksXG4gICAgICAgICAgICBzdGFydDogY2xhenouZ2V0U3RhcnQodW5kZWZpbmVkLCBmYWxzZSksXG4gICAgICAgICAgICBsZW5ndGg6IGNsYXp6LmdldFdpZHRoKCksXG4gICAgICAgICAgICBtZXNzYWdlVGV4dDogJ1R3byBpbmNvbXBhdGlibGUgZGVjb3JhdG9ycyBvbiBjbGFzcycsXG4gICAgICAgICAgfV07XG4gICAgICAgICAgcmVjb3JkLnRyYWl0cyA9IGZvdW5kVHJhaXRzID0gW107XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBPdGhlcndpc2UsIGl0J3Mgc2FmZSB0byBhY2NlcHQgdGhlIG11bHRpcGxlIGRlY29yYXRvcnMgaGVyZS4gVXBkYXRlIHNvbWUgb2YgdGhlIG1ldGFkYXRhXG4gICAgICAgIC8vIHJlZ2FyZGluZyB0aGlzIGNsYXNzLlxuICAgICAgICByZWNvcmQudHJhaXRzLnB1c2godHJhaXQpO1xuICAgICAgICByZWNvcmQuaGFzUHJpbWFyeUhhbmRsZXIgPSByZWNvcmQuaGFzUHJpbWFyeUhhbmRsZXIgfHwgaXNQcmltYXJ5SGFuZGxlcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZm91bmRUcmFpdHMubGVuZ3RoID4gMCA/IGZvdW5kVHJhaXRzIDogbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgbWFrZVN5bWJvbEZvclRyYWl0KFxuICAgICAgaGFuZGxlcjogRGVjb3JhdG9ySGFuZGxlcjx1bmtub3duLCB1bmtub3duLCBTZW1hbnRpY1N5bWJvbHxudWxsLCB1bmtub3duPixcbiAgICAgIGRlY2w6IENsYXNzRGVjbGFyYXRpb24sIGFuYWx5c2lzOiBSZWFkb25seTx1bmtub3duPnxudWxsKTogU2VtYW50aWNTeW1ib2x8bnVsbCB7XG4gICAgaWYgKGFuYWx5c2lzID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3Qgc3ltYm9sID0gaGFuZGxlci5zeW1ib2woZGVjbCwgYW5hbHlzaXMpO1xuICAgIGlmIChzeW1ib2wgIT09IG51bGwgJiYgdGhpcy5zZW1hbnRpY0RlcEdyYXBoVXBkYXRlciAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgaXNQcmltYXJ5ID0gaGFuZGxlci5wcmVjZWRlbmNlID09PSBIYW5kbGVyUHJlY2VkZW5jZS5QUklNQVJZO1xuICAgICAgaWYgKCFpc1ByaW1hcnkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEFzc2VydGlvbkVycm9yOiAke2hhbmRsZXIubmFtZX0gcmV0dXJuZWQgYSBzeW1ib2wgYnV0IGlzIG5vdCBhIHByaW1hcnkgaGFuZGxlci5gKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2VtYW50aWNEZXBHcmFwaFVwZGF0ZXIucmVnaXN0ZXJTeW1ib2woc3ltYm9sKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3ltYm9sO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFuYWx5emVDbGFzcyhjbGF6ejogQ2xhc3NEZWNsYXJhdGlvbiwgcHJlYW5hbHl6ZVF1ZXVlOiBQcm9taXNlPHZvaWQ+W118bnVsbCk6IHZvaWQge1xuICAgIGNvbnN0IHRyYWl0cyA9IHRoaXMuc2NhbkNsYXNzRm9yVHJhaXRzKGNsYXp6KTtcblxuICAgIGlmICh0cmFpdHMgPT09IG51bGwpIHtcbiAgICAgIC8vIFRoZXJlIGFyZSBubyBJdnkgdHJhaXRzIG9uIHRoZSBjbGFzcywgc28gaXQgY2FuIHNhZmVseSBiZSBza2lwcGVkLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgdHJhaXQgb2YgdHJhaXRzKSB7XG4gICAgICBjb25zdCBhbmFseXplID0gKCkgPT4gdGhpcy5hbmFseXplVHJhaXQoY2xhenosIHRyYWl0KTtcblxuICAgICAgbGV0IHByZWFuYWx5c2lzOiBQcm9taXNlPHZvaWQ+fG51bGwgPSBudWxsO1xuICAgICAgaWYgKHByZWFuYWx5emVRdWV1ZSAhPT0gbnVsbCAmJiB0cmFpdC5oYW5kbGVyLnByZWFuYWx5emUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBBdHRlbXB0IHRvIHJ1biBwcmVhbmFseXNpcy4gVGhpcyBjb3VsZCBmYWlsIHdpdGggYSBgRmF0YWxEaWFnbm9zdGljRXJyb3JgOyBjYXRjaCBpdCBpZiBpdFxuICAgICAgICAvLyBkb2VzLlxuICAgICAgICB0cnkge1xuICAgICAgICAgIHByZWFuYWx5c2lzID0gdHJhaXQuaGFuZGxlci5wcmVhbmFseXplKGNsYXp6LCB0cmFpdC5kZXRlY3RlZC5tZXRhZGF0YSkgfHwgbnVsbDtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIEZhdGFsRGlhZ25vc3RpY0Vycm9yKSB7XG4gICAgICAgICAgICB0cmFpdC50b0FuYWx5emVkKG51bGwsIFtlcnIudG9EaWFnbm9zdGljKCldLCBudWxsKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHByZWFuYWx5c2lzICE9PSBudWxsKSB7XG4gICAgICAgIHByZWFuYWx5emVRdWV1ZSEucHVzaChwcmVhbmFseXNpcy50aGVuKGFuYWx5emUpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFuYWx5emUoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgYW5hbHl6ZVRyYWl0KFxuICAgICAgY2xheno6IENsYXNzRGVjbGFyYXRpb24sIHRyYWl0OiBUcmFpdDx1bmtub3duLCB1bmtub3duLCBTZW1hbnRpY1N5bWJvbHxudWxsLCB1bmtub3duPixcbiAgICAgIGZsYWdzPzogSGFuZGxlckZsYWdzKTogdm9pZCB7XG4gICAgaWYgKHRyYWl0LnN0YXRlICE9PSBUcmFpdFN0YXRlLlBlbmRpbmcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQXR0ZW1wdCB0byBhbmFseXplIHRyYWl0IG9mICR7Y2xhenoubmFtZS50ZXh0fSBpbiBzdGF0ZSAke1xuICAgICAgICAgIFRyYWl0U3RhdGVbdHJhaXQuc3RhdGVdfSAoZXhwZWN0ZWQgREVURUNURUQpYCk7XG4gICAgfVxuXG4gICAgdGhpcy5wZXJmLmV2ZW50Q291bnQoUGVyZkV2ZW50LlRyYWl0QW5hbHl6ZSk7XG5cbiAgICAvLyBBdHRlbXB0IGFuYWx5c2lzLiBUaGlzIGNvdWxkIGZhaWwgd2l0aCBhIGBGYXRhbERpYWdub3N0aWNFcnJvcmA7IGNhdGNoIGl0IGlmIGl0IGRvZXMuXG4gICAgbGV0IHJlc3VsdDogQW5hbHlzaXNPdXRwdXQ8dW5rbm93bj47XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IHRyYWl0LmhhbmRsZXIuYW5hbHl6ZShjbGF6eiwgdHJhaXQuZGV0ZWN0ZWQubWV0YWRhdGEsIGZsYWdzKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBGYXRhbERpYWdub3N0aWNFcnJvcikge1xuICAgICAgICB0cmFpdC50b0FuYWx5emVkKG51bGwsIFtlcnIudG9EaWFnbm9zdGljKCldLCBudWxsKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHN5bWJvbCA9IHRoaXMubWFrZVN5bWJvbEZvclRyYWl0KHRyYWl0LmhhbmRsZXIsIGNsYXp6LCByZXN1bHQuYW5hbHlzaXMgPz8gbnVsbCk7XG4gICAgaWYgKHJlc3VsdC5hbmFseXNpcyAhPT0gdW5kZWZpbmVkICYmIHRyYWl0LmhhbmRsZXIucmVnaXN0ZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdHJhaXQuaGFuZGxlci5yZWdpc3RlcihjbGF6eiwgcmVzdWx0LmFuYWx5c2lzKTtcbiAgICB9XG4gICAgdHJhaXQgPSB0cmFpdC50b0FuYWx5emVkKHJlc3VsdC5hbmFseXNpcyA/PyBudWxsLCByZXN1bHQuZGlhZ25vc3RpY3MgPz8gbnVsbCwgc3ltYm9sKTtcbiAgfVxuXG4gIHJlc29sdmUoKTogdm9pZCB7XG4gICAgY29uc3QgY2xhc3NlcyA9IEFycmF5LmZyb20odGhpcy5jbGFzc2VzLmtleXMoKSk7XG4gICAgZm9yIChjb25zdCBjbGF6eiBvZiBjbGFzc2VzKSB7XG4gICAgICBjb25zdCByZWNvcmQgPSB0aGlzLmNsYXNzZXMuZ2V0KGNsYXp6KSE7XG4gICAgICBmb3IgKGxldCB0cmFpdCBvZiByZWNvcmQudHJhaXRzKSB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSB0cmFpdC5oYW5kbGVyO1xuICAgICAgICBzd2l0Y2ggKHRyYWl0LnN0YXRlKSB7XG4gICAgICAgICAgY2FzZSBUcmFpdFN0YXRlLlNraXBwZWQ6XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICBjYXNlIFRyYWl0U3RhdGUuUGVuZGluZzpcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVzb2x2aW5nIGEgdHJhaXQgdGhhdCBoYXNuJ3QgYmVlbiBhbmFseXplZDogJHtjbGF6ei5uYW1lLnRleHR9IC8gJHtcbiAgICAgICAgICAgICAgICBPYmplY3QuZ2V0UHJvdG90eXBlT2YodHJhaXQuaGFuZGxlcikuY29uc3RydWN0b3IubmFtZX1gKTtcbiAgICAgICAgICBjYXNlIFRyYWl0U3RhdGUuUmVzb2x2ZWQ6XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFJlc29sdmluZyBhbiBhbHJlYWR5IHJlc29sdmVkIHRyYWl0YCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHJhaXQuYW5hbHlzaXMgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBObyBhbmFseXNpcyByZXN1bHRzLCBjYW5ub3QgZnVydGhlciBwcm9jZXNzIHRoaXMgdHJhaXQuXG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaGFuZGxlci5yZXNvbHZlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBObyByZXNvbHV0aW9uIG9mIHRoaXMgdHJhaXQgbmVlZGVkIC0gaXQncyBjb25zaWRlcmVkIHN1Y2Nlc3NmdWwgYnkgZGVmYXVsdC5cbiAgICAgICAgICB0cmFpdCA9IHRyYWl0LnRvUmVzb2x2ZWQobnVsbCwgbnVsbCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmVzdWx0OiBSZXNvbHZlUmVzdWx0PHVua25vd24+O1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJlc3VsdCA9IGhhbmRsZXIucmVzb2x2ZShjbGF6eiwgdHJhaXQuYW5hbHlzaXMgYXMgUmVhZG9ubHk8dW5rbm93bj4sIHRyYWl0LnN5bWJvbCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBGYXRhbERpYWdub3N0aWNFcnJvcikge1xuICAgICAgICAgICAgdHJhaXQgPSB0cmFpdC50b1Jlc29sdmVkKG51bGwsIFtlcnIudG9EaWFnbm9zdGljKCldKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdHJhaXQgPSB0cmFpdC50b1Jlc29sdmVkKHJlc3VsdC5kYXRhID8/IG51bGwsIHJlc3VsdC5kaWFnbm9zdGljcyA/PyBudWxsKTtcblxuICAgICAgICBpZiAocmVzdWx0LnJlZXhwb3J0cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBjbGF6ei5nZXRTb3VyY2VGaWxlKCkuZmlsZU5hbWU7XG4gICAgICAgICAgaWYgKCF0aGlzLnJlZXhwb3J0TWFwLmhhcyhmaWxlTmFtZSkpIHtcbiAgICAgICAgICAgIHRoaXMucmVleHBvcnRNYXAuc2V0KGZpbGVOYW1lLCBuZXcgTWFwPHN0cmluZywgW3N0cmluZywgc3RyaW5nXT4oKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGZpbGVSZWV4cG9ydHMgPSB0aGlzLnJlZXhwb3J0TWFwLmdldChmaWxlTmFtZSkhO1xuICAgICAgICAgIGZvciAoY29uc3QgcmVleHBvcnQgb2YgcmVzdWx0LnJlZXhwb3J0cykge1xuICAgICAgICAgICAgZmlsZVJlZXhwb3J0cy5zZXQocmVleHBvcnQuYXNBbGlhcywgW3JlZXhwb3J0LmZyb21Nb2R1bGUsIHJlZXhwb3J0LnN5bWJvbE5hbWVdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgdHlwZS1jaGVja2luZyBjb2RlIGludG8gdGhlIGBUeXBlQ2hlY2tDb250ZXh0YCBmb3IgYW55IGNvbXBvbmVudHMgd2l0aGluIHRoZSBnaXZlblxuICAgKiBgdHMuU291cmNlRmlsZWAuXG4gICAqL1xuICB0eXBlQ2hlY2soc2Y6IHRzLlNvdXJjZUZpbGUsIGN0eDogVHlwZUNoZWNrQ29udGV4dCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5maWxlVG9DbGFzc2VzLmhhcyhzZikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGNsYXp6IG9mIHRoaXMuZmlsZVRvQ2xhc3Nlcy5nZXQoc2YpISkge1xuICAgICAgY29uc3QgcmVjb3JkID0gdGhpcy5jbGFzc2VzLmdldChjbGF6eikhO1xuICAgICAgZm9yIChjb25zdCB0cmFpdCBvZiByZWNvcmQudHJhaXRzKSB7XG4gICAgICAgIGlmICh0cmFpdC5zdGF0ZSAhPT0gVHJhaXRTdGF0ZS5SZXNvbHZlZCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHRyYWl0LmhhbmRsZXIudHlwZUNoZWNrID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHJhaXQucmVzb2x1dGlvbiAhPT0gbnVsbCkge1xuICAgICAgICAgIHRyYWl0LmhhbmRsZXIudHlwZUNoZWNrKGN0eCwgY2xhenosIHRyYWl0LmFuYWx5c2lzLCB0cmFpdC5yZXNvbHV0aW9uKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGluZGV4KGN0eDogSW5kZXhpbmdDb250ZXh0KTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBjbGF6eiBvZiB0aGlzLmNsYXNzZXMua2V5cygpKSB7XG4gICAgICBjb25zdCByZWNvcmQgPSB0aGlzLmNsYXNzZXMuZ2V0KGNsYXp6KSE7XG4gICAgICBmb3IgKGNvbnN0IHRyYWl0IG9mIHJlY29yZC50cmFpdHMpIHtcbiAgICAgICAgaWYgKHRyYWl0LnN0YXRlICE9PSBUcmFpdFN0YXRlLlJlc29sdmVkKSB7XG4gICAgICAgICAgLy8gU2tpcCB0cmFpdHMgdGhhdCBoYXZlbid0IGJlZW4gcmVzb2x2ZWQgc3VjY2Vzc2Z1bGx5LlxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHRyYWl0LmhhbmRsZXIuaW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIFNraXAgdHJhaXRzIHRoYXQgZG9uJ3QgYWZmZWN0IGluZGV4aW5nLlxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRyYWl0LnJlc29sdXRpb24gIT09IG51bGwpIHtcbiAgICAgICAgICB0cmFpdC5oYW5kbGVyLmluZGV4KGN0eCwgY2xhenosIHRyYWl0LmFuYWx5c2lzLCB0cmFpdC5yZXNvbHV0aW9uKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZVJlc291cmNlcyhjbGF6ejogRGVjbGFyYXRpb25Ob2RlKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnJlZmxlY3Rvci5pc0NsYXNzKGNsYXp6KSB8fCAhdGhpcy5jbGFzc2VzLmhhcyhjbGF6eikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcmVjb3JkID0gdGhpcy5jbGFzc2VzLmdldChjbGF6eikhO1xuICAgIGZvciAoY29uc3QgdHJhaXQgb2YgcmVjb3JkLnRyYWl0cykge1xuICAgICAgaWYgKHRyYWl0LnN0YXRlICE9PSBUcmFpdFN0YXRlLlJlc29sdmVkIHx8IHRyYWl0LmhhbmRsZXIudXBkYXRlUmVzb3VyY2VzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHRyYWl0LmhhbmRsZXIudXBkYXRlUmVzb3VyY2VzKGNsYXp6LCB0cmFpdC5hbmFseXNpcywgdHJhaXQucmVzb2x1dGlvbik7XG4gICAgfVxuICB9XG5cbiAgY29tcGlsZShjbGF6ejogRGVjbGFyYXRpb25Ob2RlLCBjb25zdGFudFBvb2w6IENvbnN0YW50UG9vbCk6IENvbXBpbGVSZXN1bHRbXXxudWxsIHtcbiAgICBjb25zdCBvcmlnaW5hbCA9IHRzLmdldE9yaWdpbmFsTm9kZShjbGF6eikgYXMgdHlwZW9mIGNsYXp6O1xuICAgIGlmICghdGhpcy5yZWZsZWN0b3IuaXNDbGFzcyhjbGF6eikgfHwgIXRoaXMucmVmbGVjdG9yLmlzQ2xhc3Mob3JpZ2luYWwpIHx8XG4gICAgICAgICF0aGlzLmNsYXNzZXMuaGFzKG9yaWdpbmFsKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgcmVjb3JkID0gdGhpcy5jbGFzc2VzLmdldChvcmlnaW5hbCkhO1xuXG4gICAgbGV0IHJlczogQ29tcGlsZVJlc3VsdFtdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IHRyYWl0IG9mIHJlY29yZC50cmFpdHMpIHtcbiAgICAgIGlmICh0cmFpdC5zdGF0ZSAhPT0gVHJhaXRTdGF0ZS5SZXNvbHZlZCB8fCB0cmFpdC5hbmFseXNpc0RpYWdub3N0aWNzICE9PSBudWxsIHx8XG4gICAgICAgICAgdHJhaXQucmVzb2x2ZURpYWdub3N0aWNzICE9PSBudWxsKSB7XG4gICAgICAgIC8vIENhbm5vdCBjb21waWxlIGEgdHJhaXQgdGhhdCBpcyBub3QgcmVzb2x2ZWQsIG9yIGhhZCBhbnkgZXJyb3JzIGluIGl0cyBkZWNsYXJhdGlvbi5cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGB0cmFpdC5yZXNvbHV0aW9uYCBpcyBub24tbnVsbCBhc3NlcnRlZCBoZXJlIGJlY2F1c2UgVHlwZVNjcmlwdCBkb2VzIG5vdCByZWNvZ25pemUgdGhhdFxuICAgICAgLy8gYFJlYWRvbmx5PHVua25vd24+YCBpcyBudWxsYWJsZSAoYXMgYHVua25vd25gIGl0c2VsZiBpcyBudWxsYWJsZSkgZHVlIHRvIHRoZSB3YXkgdGhhdFxuICAgICAgLy8gYFJlYWRvbmx5YCB3b3Jrcy5cblxuICAgICAgbGV0IGNvbXBpbGVSZXM6IENvbXBpbGVSZXN1bHR8Q29tcGlsZVJlc3VsdFtdO1xuICAgICAgaWYgKHRoaXMuY29tcGlsYXRpb25Nb2RlID09PSBDb21waWxhdGlvbk1vZGUuUEFSVElBTCAmJlxuICAgICAgICAgIHRyYWl0LmhhbmRsZXIuY29tcGlsZVBhcnRpYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb21waWxlUmVzID0gdHJhaXQuaGFuZGxlci5jb21waWxlUGFydGlhbChjbGF6eiwgdHJhaXQuYW5hbHlzaXMsIHRyYWl0LnJlc29sdXRpb24hKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbXBpbGVSZXMgPVxuICAgICAgICAgICAgdHJhaXQuaGFuZGxlci5jb21waWxlRnVsbChjbGF6eiwgdHJhaXQuYW5hbHlzaXMsIHRyYWl0LnJlc29sdXRpb24hLCBjb25zdGFudFBvb2wpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjb21waWxlTWF0Y2hSZXMgPSBjb21waWxlUmVzO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29tcGlsZU1hdGNoUmVzKSkge1xuICAgICAgICBmb3IgKGNvbnN0IHJlc3VsdCBvZiBjb21waWxlTWF0Y2hSZXMpIHtcbiAgICAgICAgICBpZiAoIXJlcy5zb21lKHIgPT4gci5uYW1lID09PSByZXN1bHQubmFtZSkpIHtcbiAgICAgICAgICAgIHJlcy5wdXNoKHJlc3VsdCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCFyZXMuc29tZShyZXN1bHQgPT4gcmVzdWx0Lm5hbWUgPT09IGNvbXBpbGVNYXRjaFJlcy5uYW1lKSkge1xuICAgICAgICByZXMucHVzaChjb21waWxlTWF0Y2hSZXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIExvb2sgdXAgdGhlIC5kLnRzIHRyYW5zZm9ybWVyIGZvciB0aGUgaW5wdXQgZmlsZSBhbmQgcmVjb3JkIHRoYXQgYXQgbGVhc3Qgb25lIGZpZWxkIHdhc1xuICAgIC8vIGdlbmVyYXRlZCwgd2hpY2ggd2lsbCBhbGxvdyB0aGUgLmQudHMgdG8gYmUgdHJhbnNmb3JtZWQgbGF0ZXIuXG4gICAgdGhpcy5kdHNUcmFuc2Zvcm1zLmdldEl2eURlY2xhcmF0aW9uVHJhbnNmb3JtKG9yaWdpbmFsLmdldFNvdXJjZUZpbGUoKSlcbiAgICAgICAgLmFkZEZpZWxkcyhvcmlnaW5hbCwgcmVzKTtcblxuICAgIC8vIFJldHVybiB0aGUgaW5zdHJ1Y3Rpb24gdG8gdGhlIHRyYW5zZm9ybWVyIHNvIHRoZSBmaWVsZHMgd2lsbCBiZSBhZGRlZC5cbiAgICByZXR1cm4gcmVzLmxlbmd0aCA+IDAgPyByZXMgOiBudWxsO1xuICB9XG5cbiAgZGVjb3JhdG9yc0Zvcihub2RlOiB0cy5EZWNsYXJhdGlvbik6IHRzLkRlY29yYXRvcltdIHtcbiAgICBjb25zdCBvcmlnaW5hbCA9IHRzLmdldE9yaWdpbmFsTm9kZShub2RlKSBhcyB0eXBlb2Ygbm9kZTtcbiAgICBpZiAoIXRoaXMucmVmbGVjdG9yLmlzQ2xhc3Mob3JpZ2luYWwpIHx8ICF0aGlzLmNsYXNzZXMuaGFzKG9yaWdpbmFsKSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IHJlY29yZCA9IHRoaXMuY2xhc3Nlcy5nZXQob3JpZ2luYWwpITtcbiAgICBjb25zdCBkZWNvcmF0b3JzOiB0cy5EZWNvcmF0b3JbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCB0cmFpdCBvZiByZWNvcmQudHJhaXRzKSB7XG4gICAgICBpZiAodHJhaXQuc3RhdGUgIT09IFRyYWl0U3RhdGUuUmVzb2x2ZWQpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICh0cmFpdC5kZXRlY3RlZC50cmlnZ2VyICE9PSBudWxsICYmIHRzLmlzRGVjb3JhdG9yKHRyYWl0LmRldGVjdGVkLnRyaWdnZXIpKSB7XG4gICAgICAgIGRlY29yYXRvcnMucHVzaCh0cmFpdC5kZXRlY3RlZC50cmlnZ2VyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZGVjb3JhdG9ycztcbiAgfVxuXG4gIGdldCBkaWFnbm9zdGljcygpOiBSZWFkb25seUFycmF5PHRzLkRpYWdub3N0aWM+IHtcbiAgICBjb25zdCBkaWFnbm9zdGljczogdHMuRGlhZ25vc3RpY1tdID0gW107XG4gICAgZm9yIChjb25zdCBjbGF6eiBvZiB0aGlzLmNsYXNzZXMua2V5cygpKSB7XG4gICAgICBjb25zdCByZWNvcmQgPSB0aGlzLmNsYXNzZXMuZ2V0KGNsYXp6KSE7XG4gICAgICBpZiAocmVjb3JkLm1ldGFEaWFnbm9zdGljcyAhPT0gbnVsbCkge1xuICAgICAgICBkaWFnbm9zdGljcy5wdXNoKC4uLnJlY29yZC5tZXRhRGlhZ25vc3RpY3MpO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCB0cmFpdCBvZiByZWNvcmQudHJhaXRzKSB7XG4gICAgICAgIGlmICgodHJhaXQuc3RhdGUgPT09IFRyYWl0U3RhdGUuQW5hbHl6ZWQgfHwgdHJhaXQuc3RhdGUgPT09IFRyYWl0U3RhdGUuUmVzb2x2ZWQpICYmXG4gICAgICAgICAgICB0cmFpdC5hbmFseXNpc0RpYWdub3N0aWNzICE9PSBudWxsKSB7XG4gICAgICAgICAgZGlhZ25vc3RpY3MucHVzaCguLi50cmFpdC5hbmFseXNpc0RpYWdub3N0aWNzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHJhaXQuc3RhdGUgPT09IFRyYWl0U3RhdGUuUmVzb2x2ZWQgJiYgdHJhaXQucmVzb2x2ZURpYWdub3N0aWNzICE9PSBudWxsKSB7XG4gICAgICAgICAgZGlhZ25vc3RpY3MucHVzaCguLi50cmFpdC5yZXNvbHZlRGlhZ25vc3RpY3MpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkaWFnbm9zdGljcztcbiAgfVxuXG4gIGdldCBleHBvcnRTdGF0ZW1lbnRzKCk6IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIFtzdHJpbmcsIHN0cmluZ10+PiB7XG4gICAgcmV0dXJuIHRoaXMucmVleHBvcnRNYXA7XG4gIH1cbn1cbiJdfQ==
|