taon-typeorm 18.0.24 → 19.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/shared/shared_folder_info.txt +1 -1
- package/browser/README.md +24 -24
- package/client/README.md +24 -24
- package/index.js.map +1 -1
- package/lib/build-info._auto-generated_.js.map +1 -1
- package/lib/index._auto-generated_.js.map +1 -1
- package/lib/index.js.map +1 -1
- package/lib/typeorm/cache/DbQueryResultCache.js.map +1 -1
- package/lib/typeorm/cache/QueryResultCache.js.map +1 -1
- package/lib/typeorm/cache/QueryResultCacheFactory.js.map +1 -1
- package/lib/typeorm/cache/QueryResultCacheOptions.js.map +1 -1
- package/lib/typeorm/cache/RedisQueryResultCache.js.map +1 -1
- package/lib/typeorm/cli-ts-node-commonjs.js.map +1 -1
- package/lib/typeorm/cli-ts-node-esm.js.map +1 -1
- package/lib/typeorm/cli.js.map +1 -1
- package/lib/typeorm/commands/CacheClearCommand.js.map +1 -1
- package/lib/typeorm/commands/CommandUtils.js.map +1 -1
- package/lib/typeorm/commands/EntityCreateCommand.js.map +1 -1
- package/lib/typeorm/commands/InitCommand.js.map +1 -1
- package/lib/typeorm/commands/MigrationCreateCommand.js.map +1 -1
- package/lib/typeorm/commands/MigrationGenerateCommand.js.map +1 -1
- package/lib/typeorm/commands/MigrationRevertCommand.js.map +1 -1
- package/lib/typeorm/commands/MigrationRunCommand.js.map +1 -1
- package/lib/typeorm/commands/MigrationShowCommand.js.map +1 -1
- package/lib/typeorm/commands/QueryCommand.js.map +1 -1
- package/lib/typeorm/commands/SchemaDropCommand.js.map +1 -1
- package/lib/typeorm/commands/SchemaLogCommand.js.map +1 -1
- package/lib/typeorm/commands/SchemaSyncCommand.js.map +1 -1
- package/lib/typeorm/commands/SubscriberCreateCommand.js.map +1 -1
- package/lib/typeorm/commands/VersionCommand.js.map +1 -1
- package/lib/typeorm/common/DeepPartial.js.map +1 -1
- package/lib/typeorm/common/EntityTarget.js.map +1 -1
- package/lib/typeorm/common/MixedList.js.map +1 -1
- package/lib/typeorm/common/NonNever.js.map +1 -1
- package/lib/typeorm/common/ObjectLiteral.js.map +1 -1
- package/lib/typeorm/common/ObjectType.js.map +1 -1
- package/lib/typeorm/common/RelationType.js.map +1 -1
- package/lib/typeorm/connection/BaseConnectionOptions.js.map +1 -1
- package/lib/typeorm/connection/Connection.js.map +1 -1
- package/lib/typeorm/connection/ConnectionManager.js.map +1 -1
- package/lib/typeorm/connection/ConnectionMetadataBuilder.js.map +1 -1
- package/lib/typeorm/connection/ConnectionOptions.js.map +1 -1
- package/lib/typeorm/connection/ConnectionOptionsReader.js.map +1 -1
- package/lib/typeorm/connection/options-reader/ConnectionOptionsEnvReader.js.map +1 -1
- package/lib/typeorm/connection/options-reader/ConnectionOptionsXmlReader.js.map +1 -1
- package/lib/typeorm/connection/options-reader/ConnectionOptionsYmlReader.js.map +1 -1
- package/lib/typeorm/constants.js.map +1 -1
- package/lib/typeorm/container.js.map +1 -1
- package/lib/typeorm/data-source/BaseDataSourceOptions.js.map +1 -1
- package/lib/typeorm/data-source/DataSource.js.map +1 -1
- package/lib/typeorm/data-source/DataSourceOptions.js.map +1 -1
- package/lib/typeorm/data-source/index.js.map +1 -1
- package/lib/typeorm/decorator/Check.js.map +1 -1
- package/lib/typeorm/decorator/EntityRepository.js.map +1 -1
- package/lib/typeorm/decorator/Exclusion.js.map +1 -1
- package/lib/typeorm/decorator/Generated.js.map +1 -1
- package/lib/typeorm/decorator/Index.js.map +1 -1
- package/lib/typeorm/decorator/Unique.js.map +1 -1
- package/lib/typeorm/decorator/columns/Column.js.map +1 -1
- package/lib/typeorm/decorator/columns/CreateDateColumn.js.map +1 -1
- package/lib/typeorm/decorator/columns/DeleteDateColumn.js.map +1 -1
- package/lib/typeorm/decorator/columns/ObjectIdColumn.js.map +1 -1
- package/lib/typeorm/decorator/columns/PrimaryColumn.js.map +1 -1
- package/lib/typeorm/decorator/columns/PrimaryGeneratedColumn.js.map +1 -1
- package/lib/typeorm/decorator/columns/UpdateDateColumn.js.map +1 -1
- package/lib/typeorm/decorator/columns/VersionColumn.js.map +1 -1
- package/lib/typeorm/decorator/columns/ViewColumn.js.map +1 -1
- package/lib/typeorm/decorator/columns/VirtualColumn.js.map +1 -1
- package/lib/typeorm/decorator/entity/ChildEntity.js.map +1 -1
- package/lib/typeorm/decorator/entity/Entity.js.map +1 -1
- package/lib/typeorm/decorator/entity/TableInheritance.js.map +1 -1
- package/lib/typeorm/decorator/entity-view/ViewEntity.js.map +1 -1
- package/lib/typeorm/decorator/listeners/AfterInsert.js.map +1 -1
- package/lib/typeorm/decorator/listeners/AfterLoad.js.map +1 -1
- package/lib/typeorm/decorator/listeners/AfterRecover.js.map +1 -1
- package/lib/typeorm/decorator/listeners/AfterRemove.js.map +1 -1
- package/lib/typeorm/decorator/listeners/AfterSoftRemove.js.map +1 -1
- package/lib/typeorm/decorator/listeners/AfterUpdate.js.map +1 -1
- package/lib/typeorm/decorator/listeners/BeforeInsert.js.map +1 -1
- package/lib/typeorm/decorator/listeners/BeforeRecover.js.map +1 -1
- package/lib/typeorm/decorator/listeners/BeforeRemove.js.map +1 -1
- package/lib/typeorm/decorator/listeners/BeforeSoftRemove.js.map +1 -1
- package/lib/typeorm/decorator/listeners/BeforeUpdate.js.map +1 -1
- package/lib/typeorm/decorator/listeners/EventSubscriber.js.map +1 -1
- package/lib/typeorm/decorator/options/ColumnCommonOptions.js.map +1 -1
- package/lib/typeorm/decorator/options/ColumnEmbeddedOptions.js.map +1 -1
- package/lib/typeorm/decorator/options/ColumnEnumOptions.js.map +1 -1
- package/lib/typeorm/decorator/options/ColumnHstoreOptions.js.map +1 -1
- package/lib/typeorm/decorator/options/ColumnNumericOptions.js.map +1 -1
- package/lib/typeorm/decorator/options/ColumnOptions.js.map +1 -1
- package/lib/typeorm/decorator/options/ColumnWithLengthOptions.js.map +1 -1
- package/lib/typeorm/decorator/options/ColumnWithWidthOptions.js.map +1 -1
- package/lib/typeorm/decorator/options/EntityOptions.js.map +1 -1
- package/lib/typeorm/decorator/options/IndexOptions.js.map +1 -1
- package/lib/typeorm/decorator/options/JoinColumnOptions.js.map +1 -1
- package/lib/typeorm/decorator/options/JoinTableMultipleColumnsOptions.js.map +1 -1
- package/lib/typeorm/decorator/options/JoinTableOptions.js.map +1 -1
- package/lib/typeorm/decorator/options/PrimaryGeneratedColumnIdentityOptions.js.map +1 -1
- package/lib/typeorm/decorator/options/PrimaryGeneratedColumnNumericOptions.js.map +1 -1
- package/lib/typeorm/decorator/options/PrimaryGeneratedColumnUUIDOptions.js.map +1 -1
- package/lib/typeorm/decorator/options/RelationOptions.js.map +1 -1
- package/lib/typeorm/decorator/options/SpatialColumnOptions.js.map +1 -1
- package/lib/typeorm/decorator/options/TransactionOptions.js.map +1 -1
- package/lib/typeorm/decorator/options/UniqueOptions.js.map +1 -1
- package/lib/typeorm/decorator/options/ValueTransformer.js.map +1 -1
- package/lib/typeorm/decorator/options/ViewColumnOptions.js.map +1 -1
- package/lib/typeorm/decorator/options/ViewEntityOptions.js.map +1 -1
- package/lib/typeorm/decorator/options/VirtualColumnOptions.js.map +1 -1
- package/lib/typeorm/decorator/relations/JoinColumn.js.map +1 -1
- package/lib/typeorm/decorator/relations/JoinTable.js.map +1 -1
- package/lib/typeorm/decorator/relations/ManyToMany.js.map +1 -1
- package/lib/typeorm/decorator/relations/ManyToOne.js.map +1 -1
- package/lib/typeorm/decorator/relations/OneToMany.js.map +1 -1
- package/lib/typeorm/decorator/relations/OneToOne.js.map +1 -1
- package/lib/typeorm/decorator/relations/RelationCount.js.map +1 -1
- package/lib/typeorm/decorator/relations/RelationId.js.map +1 -1
- package/lib/typeorm/decorator/tree/Tree.js.map +1 -1
- package/lib/typeorm/decorator/tree/TreeChildren.js.map +1 -1
- package/lib/typeorm/decorator/tree/TreeLevelColumn.js.map +1 -1
- package/lib/typeorm/decorator/tree/TreeParent.js.map +1 -1
- package/lib/typeorm/driver/Driver.js.map +1 -1
- package/lib/typeorm/driver/DriverFactory.js.map +1 -1
- package/lib/typeorm/driver/DriverUtils.js.map +1 -1
- package/lib/typeorm/driver/Query.js.map +1 -1
- package/lib/typeorm/driver/SqlInMemory.js.map +1 -1
- package/lib/typeorm/driver/aurora-mysql/AuroraMysqlConnection.js.map +1 -1
- package/lib/typeorm/driver/aurora-mysql/AuroraMysqlConnectionCredentialsOptions.js.map +1 -1
- package/lib/typeorm/driver/aurora-mysql/AuroraMysqlConnectionOptions.js.map +1 -1
- package/lib/typeorm/driver/aurora-mysql/AuroraMysqlDriver.js.map +1 -1
- package/lib/typeorm/driver/aurora-mysql/AuroraMysqlQueryRunner.js.map +1 -1
- package/lib/typeorm/driver/aurora-postgres/AuroraPostgresConnectionOptions.js.map +1 -1
- package/lib/typeorm/driver/aurora-postgres/AuroraPostgresDriver.js.map +1 -1
- package/lib/typeorm/driver/aurora-postgres/AuroraPostgresQueryRunner.js.map +1 -1
- package/lib/typeorm/driver/better-sqlite3/BetterSqlite3ConnectionOptions.js.map +1 -1
- package/lib/typeorm/driver/better-sqlite3/BetterSqlite3Driver.js.map +1 -1
- package/lib/typeorm/driver/better-sqlite3/BetterSqlite3QueryRunner.js.map +1 -1
- package/lib/typeorm/driver/capacitor/CapacitorConnectionOptions.js.map +1 -1
- package/lib/typeorm/driver/capacitor/CapacitorDriver.js.map +1 -1
- package/lib/typeorm/driver/capacitor/CapacitorQueryRunner.js.map +1 -1
- package/lib/typeorm/driver/cockroachdb/CockroachConnectionCredentialsOptions.js.map +1 -1
- package/lib/typeorm/driver/cockroachdb/CockroachConnectionOptions.js.map +1 -1
- package/lib/typeorm/driver/cockroachdb/CockroachDriver.js.map +1 -1
- package/lib/typeorm/driver/cockroachdb/CockroachQueryRunner.js.map +1 -1
- package/lib/typeorm/driver/cordova/CordovaConnectionOptions.js.map +1 -1
- package/lib/typeorm/driver/cordova/CordovaDriver.js.map +1 -1
- package/lib/typeorm/driver/cordova/CordovaQueryRunner.js.map +1 -1
- package/lib/typeorm/driver/expo/ExpoConnectionOptions.js.map +1 -1
- package/lib/typeorm/driver/expo/ExpoDriver.js.map +1 -1
- package/lib/typeorm/driver/expo/ExpoQueryRunner.js.map +1 -1
- package/lib/typeorm/driver/mongodb/MongoConnectionOptions.js.map +1 -1
- package/lib/typeorm/driver/mongodb/MongoDriver.js.map +1 -1
- package/lib/typeorm/driver/mongodb/MongoQueryRunner.js.map +1 -1
- package/lib/typeorm/driver/mongodb/typings.js.map +1 -1
- package/lib/typeorm/driver/mysql/MysqlConnectionCredentialsOptions.js.map +1 -1
- package/lib/typeorm/driver/mysql/MysqlConnectionOptions.js.map +1 -1
- package/lib/typeorm/driver/mysql/MysqlDriver.js.map +1 -1
- package/lib/typeorm/driver/mysql/MysqlQueryRunner.js.map +1 -1
- package/lib/typeorm/driver/nativescript/NativescriptConnectionOptions.js.map +1 -1
- package/lib/typeorm/driver/nativescript/NativescriptDriver.js.map +1 -1
- package/lib/typeorm/driver/nativescript/NativescriptQueryRunner.js.map +1 -1
- package/lib/typeorm/driver/oracle/OracleConnectionCredentialsOptions.js.map +1 -1
- package/lib/typeorm/driver/oracle/OracleConnectionOptions.js.map +1 -1
- package/lib/typeorm/driver/oracle/OracleDriver.js.map +1 -1
- package/lib/typeorm/driver/oracle/OracleQueryRunner.js.map +1 -1
- package/lib/typeorm/driver/postgres/PostgresConnectionCredentialsOptions.js.map +1 -1
- package/lib/typeorm/driver/postgres/PostgresConnectionOptions.js.map +1 -1
- package/lib/typeorm/driver/postgres/PostgresDriver.js.map +1 -1
- package/lib/typeorm/driver/postgres/PostgresQueryRunner.js.map +1 -1
- package/lib/typeorm/driver/react-native/ReactNativeConnectionOptions.js.map +1 -1
- package/lib/typeorm/driver/react-native/ReactNativeDriver.js.map +1 -1
- package/lib/typeorm/driver/react-native/ReactNativeQueryRunner.js.map +1 -1
- package/lib/typeorm/driver/sap/SapConnectionCredentialsOptions.js.map +1 -1
- package/lib/typeorm/driver/sap/SapConnectionOptions.js.map +1 -1
- package/lib/typeorm/driver/sap/SapDriver.js.map +1 -1
- package/lib/typeorm/driver/sap/SapQueryRunner.js.map +1 -1
- package/lib/typeorm/driver/spanner/SpannerConnectionCredentialsOptions.js.map +1 -1
- package/lib/typeorm/driver/spanner/SpannerConnectionOptions.js.map +1 -1
- package/lib/typeorm/driver/spanner/SpannerDriver.js.map +1 -1
- package/lib/typeorm/driver/spanner/SpannerQueryRunner.js.map +1 -1
- package/lib/typeorm/driver/sqlite/SqliteConnectionOptions.js.map +1 -1
- package/lib/typeorm/driver/sqlite/SqliteDriver.js.map +1 -1
- package/lib/typeorm/driver/sqlite/SqliteQueryRunner.js.map +1 -1
- package/lib/typeorm/driver/sqlite-abstract/AbstractSqliteDriver.js.map +1 -1
- package/lib/typeorm/driver/sqlite-abstract/AbstractSqliteQueryRunner.js.map +1 -1
- package/lib/typeorm/driver/sqljs/SqljsConnectionOptions.js.map +1 -1
- package/lib/typeorm/driver/sqljs/SqljsDriver.js.map +1 -1
- package/lib/typeorm/driver/sqljs/SqljsQueryRunner.js.map +1 -1
- package/lib/typeorm/driver/sqlserver/MssqlParameter.js.map +1 -1
- package/lib/typeorm/driver/sqlserver/SqlServerConnectionCredentialsOptions.js.map +1 -1
- package/lib/typeorm/driver/sqlserver/SqlServerConnectionOptions.js.map +1 -1
- package/lib/typeorm/driver/sqlserver/SqlServerDriver.js.map +1 -1
- package/lib/typeorm/driver/sqlserver/SqlServerQueryRunner.js.map +1 -1
- package/lib/typeorm/driver/sqlserver/authentication/AzureActiveDirectoryAccessTokenAuthentication.js.map +1 -1
- package/lib/typeorm/driver/sqlserver/authentication/AzureActiveDirectoryMsiAppServiceAuthentication.js.map +1 -1
- package/lib/typeorm/driver/sqlserver/authentication/AzureActiveDirectoryMsiVmAuthentication.js.map +1 -1
- package/lib/typeorm/driver/sqlserver/authentication/AzureActiveDirectoryPasswordAuthentication.js.map +1 -1
- package/lib/typeorm/driver/sqlserver/authentication/AzureActiveDirectoryServicePrincipalSecret.js.map +1 -1
- package/lib/typeorm/driver/sqlserver/authentication/DefaultAuthentication.js.map +1 -1
- package/lib/typeorm/driver/sqlserver/authentication/NtlmAuthentication.js.map +1 -1
- package/lib/typeorm/driver/types/ColumnTypes.js.map +1 -1
- package/lib/typeorm/driver/types/CteCapabilities.js.map +1 -1
- package/lib/typeorm/driver/types/DataTypeDefaults.js.map +1 -1
- package/lib/typeorm/driver/types/DatabaseType.js.map +1 -1
- package/lib/typeorm/driver/types/IsolationLevel.js.map +1 -1
- package/lib/typeorm/driver/types/MappedColumnTypes.js.map +1 -1
- package/lib/typeorm/driver/types/MetadataTableType.js.map +1 -1
- package/lib/typeorm/driver/types/ReplicationMode.js.map +1 -1
- package/lib/typeorm/driver/types/UpsertType.js.map +1 -1
- package/lib/typeorm/entity-manager/EntityManager.js.map +1 -1
- package/lib/typeorm/entity-manager/EntityManagerFactory.js.map +1 -1
- package/lib/typeorm/entity-manager/MongoEntityManager.js.map +1 -1
- package/lib/typeorm/entity-manager/SqljsEntityManager.js.map +1 -1
- package/lib/typeorm/entity-schema/EntitySchema.js.map +1 -1
- package/lib/typeorm/entity-schema/EntitySchemaCheckOptions.js.map +1 -1
- package/lib/typeorm/entity-schema/EntitySchemaColumnOptions.js.map +1 -1
- package/lib/typeorm/entity-schema/EntitySchemaEmbeddedColumnOptions.js.map +1 -1
- package/lib/typeorm/entity-schema/EntitySchemaEmbeddedError.js.map +1 -1
- package/lib/typeorm/entity-schema/EntitySchemaExclusionOptions.js.map +1 -1
- package/lib/typeorm/entity-schema/EntitySchemaIndexOptions.js.map +1 -1
- package/lib/typeorm/entity-schema/EntitySchemaOptions.js.map +1 -1
- package/lib/typeorm/entity-schema/EntitySchemaRelationIdOptions.js.map +1 -1
- package/lib/typeorm/entity-schema/EntitySchemaRelationOptions.js.map +1 -1
- package/lib/typeorm/entity-schema/EntitySchemaTransformer.js.map +1 -1
- package/lib/typeorm/entity-schema/EntitySchemaUniqueOptions.js.map +1 -1
- package/lib/typeorm/error/AlreadyHasActiveConnectionError.js.map +1 -1
- package/lib/typeorm/error/CannotAttachTreeChildrenEntityError.js.map +1 -1
- package/lib/typeorm/error/CannotConnectAlreadyConnectedError.js.map +1 -1
- package/lib/typeorm/error/CannotCreateEntityIdMapError.js.map +1 -1
- package/lib/typeorm/error/CannotDetermineEntityError.js.map +1 -1
- package/lib/typeorm/error/CannotExecuteNotConnectedError.js.map +1 -1
- package/lib/typeorm/error/CannotGetEntityManagerNotConnectedError.js.map +1 -1
- package/lib/typeorm/error/CannotReflectMethodParameterTypeError.js.map +1 -1
- package/lib/typeorm/error/CircularRelationsError.js.map +1 -1
- package/lib/typeorm/error/ColumnTypeUndefinedError.js.map +1 -1
- package/lib/typeorm/error/ConnectionIsNotSetError.js.map +1 -1
- package/lib/typeorm/error/ConnectionNotFoundError.js.map +1 -1
- package/lib/typeorm/error/CustomRepositoryCannotInheritRepositoryError.js.map +1 -1
- package/lib/typeorm/error/CustomRepositoryDoesNotHaveEntityError.js.map +1 -1
- package/lib/typeorm/error/CustomRepositoryNotFoundError.js.map +1 -1
- package/lib/typeorm/error/DataTypeNotSupportedError.js.map +1 -1
- package/lib/typeorm/error/DriverOptionNotSetError.js.map +1 -1
- package/lib/typeorm/error/DriverPackageNotInstalledError.js.map +1 -1
- package/lib/typeorm/error/EntityMetadataNotFoundError.js.map +1 -1
- package/lib/typeorm/error/EntityNotFoundError.js.map +1 -1
- package/lib/typeorm/error/EntityPropertyNotFoundError.js.map +1 -1
- package/lib/typeorm/error/FindRelationsNotFoundError.js.map +1 -1
- package/lib/typeorm/error/ForbiddenTransactionModeOverrideError.js.map +1 -1
- package/lib/typeorm/error/InitializedRelationError.js.map +1 -1
- package/lib/typeorm/error/InsertValuesMissingError.js.map +1 -1
- package/lib/typeorm/error/LimitOnUpdateNotSupportedError.js.map +1 -1
- package/lib/typeorm/error/LockNotSupportedOnGivenDriverError.js.map +1 -1
- package/lib/typeorm/error/MetadataAlreadyExistsError.js.map +1 -1
- package/lib/typeorm/error/MetadataWithSuchNameAlreadyExistsError.js.map +1 -1
- package/lib/typeorm/error/MissingDeleteDateColumnError.js.map +1 -1
- package/lib/typeorm/error/MissingDriverError.js.map +1 -1
- package/lib/typeorm/error/MissingJoinColumnError.js.map +1 -1
- package/lib/typeorm/error/MissingJoinTableError.js.map +1 -1
- package/lib/typeorm/error/MissingPrimaryColumnError.js.map +1 -1
- package/lib/typeorm/error/MustBeEntityError.js.map +1 -1
- package/lib/typeorm/error/NamingStrategyNotFoundError.js.map +1 -1
- package/lib/typeorm/error/NestedSetMultipleRootError.js.map +1 -1
- package/lib/typeorm/error/NoConnectionForRepositoryError.js.map +1 -1
- package/lib/typeorm/error/NoConnectionOptionError.js.map +1 -1
- package/lib/typeorm/error/NoNeedToReleaseEntityManagerError.js.map +1 -1
- package/lib/typeorm/error/NoVersionOrUpdateDateColumnError.js.map +1 -1
- package/lib/typeorm/error/OffsetWithoutLimitNotSupportedError.js.map +1 -1
- package/lib/typeorm/error/OptimisticLockCanNotBeUsedError.js.map +1 -1
- package/lib/typeorm/error/OptimisticLockVersionMismatchError.js.map +1 -1
- package/lib/typeorm/error/PersistedEntityNotFoundError.js.map +1 -1
- package/lib/typeorm/error/PessimisticLockTransactionRequiredError.js.map +1 -1
- package/lib/typeorm/error/PrimaryColumnCannotBeNullableError.js.map +1 -1
- package/lib/typeorm/error/QueryFailedError.js.map +1 -1
- package/lib/typeorm/error/QueryRunnerAlreadyReleasedError.js.map +1 -1
- package/lib/typeorm/error/QueryRunnerProviderAlreadyReleasedError.js.map +1 -1
- package/lib/typeorm/error/RepositoryNotTreeError.js.map +1 -1
- package/lib/typeorm/error/ReturningStatementNotSupportedError.js.map +1 -1
- package/lib/typeorm/error/SubjectRemovedAndUpdatedError.js.map +1 -1
- package/lib/typeorm/error/SubjectWithoutIdentifierError.js.map +1 -1
- package/lib/typeorm/error/TransactionAlreadyStartedError.js.map +1 -1
- package/lib/typeorm/error/TransactionNotStartedError.js.map +1 -1
- package/lib/typeorm/error/TreeRepositoryNotSupportedError.js.map +1 -1
- package/lib/typeorm/error/TypeORMError.js.map +1 -1
- package/lib/typeorm/error/UpdateValuesMissingError.js.map +1 -1
- package/lib/typeorm/error/UsingJoinColumnIsNotAllowedError.js.map +1 -1
- package/lib/typeorm/error/UsingJoinColumnOnlyOnOneSideAllowedError.js.map +1 -1
- package/lib/typeorm/error/UsingJoinTableIsNotAllowedError.js.map +1 -1
- package/lib/typeorm/error/UsingJoinTableOnlyOnOneSideAllowedError.js.map +1 -1
- package/lib/typeorm/error/index.js.map +1 -1
- package/lib/typeorm/find-options/EqualOperator.js.map +1 -1
- package/lib/typeorm/find-options/FindManyOptions.js.map +1 -1
- package/lib/typeorm/find-options/FindOneOptions.js.map +1 -1
- package/lib/typeorm/find-options/FindOperator.js.map +1 -1
- package/lib/typeorm/find-options/FindOperatorType.js.map +1 -1
- package/lib/typeorm/find-options/FindOptionsOrder.js.map +1 -1
- package/lib/typeorm/find-options/FindOptionsRelations.js.map +1 -1
- package/lib/typeorm/find-options/FindOptionsSelect.js.map +1 -1
- package/lib/typeorm/find-options/FindOptionsUtils.js.map +1 -1
- package/lib/typeorm/find-options/FindOptionsWhere.js.map +1 -1
- package/lib/typeorm/find-options/FindTreeOptions.js.map +1 -1
- package/lib/typeorm/find-options/JoinOptions.js.map +1 -1
- package/lib/typeorm/find-options/OrderByCondition.js.map +1 -1
- package/lib/typeorm/find-options/mongodb/MongoFindManyOptions.js.map +1 -1
- package/lib/typeorm/find-options/mongodb/MongoFindOneOptions.js.map +1 -1
- package/lib/typeorm/find-options/operator/And.js.map +1 -1
- package/lib/typeorm/find-options/operator/Any.js.map +1 -1
- package/lib/typeorm/find-options/operator/ArrayContainedBy.js.map +1 -1
- package/lib/typeorm/find-options/operator/ArrayContains.js.map +1 -1
- package/lib/typeorm/find-options/operator/ArrayOverlap.js.map +1 -1
- package/lib/typeorm/find-options/operator/Between.js.map +1 -1
- package/lib/typeorm/find-options/operator/Equal.js.map +1 -1
- package/lib/typeorm/find-options/operator/ILike.js.map +1 -1
- package/lib/typeorm/find-options/operator/In.js.map +1 -1
- package/lib/typeorm/find-options/operator/IsNull.js.map +1 -1
- package/lib/typeorm/find-options/operator/LessThan.js.map +1 -1
- package/lib/typeorm/find-options/operator/LessThanOrEqual.js.map +1 -1
- package/lib/typeorm/find-options/operator/Like.js.map +1 -1
- package/lib/typeorm/find-options/operator/MoreThan.js.map +1 -1
- package/lib/typeorm/find-options/operator/MoreThanOrEqual.js.map +1 -1
- package/lib/typeorm/find-options/operator/Not.js.map +1 -1
- package/lib/typeorm/find-options/operator/Raw.js.map +1 -1
- package/lib/typeorm/globals.js.map +1 -1
- package/lib/typeorm/index.js.map +1 -1
- package/lib/typeorm/logger/AdvancedConsoleLogger.js.map +1 -1
- package/lib/typeorm/logger/DebugLogger.js.map +1 -1
- package/lib/typeorm/logger/FileLogger.js.map +1 -1
- package/lib/typeorm/logger/Logger.js.map +1 -1
- package/lib/typeorm/logger/LoggerFactory.js.map +1 -1
- package/lib/typeorm/logger/LoggerOptions.js.map +1 -1
- package/lib/typeorm/logger/SimpleConsoleLogger.js.map +1 -1
- package/lib/typeorm/metadata/CheckMetadata.js.map +1 -1
- package/lib/typeorm/metadata/ColumnMetadata.js.map +1 -1
- package/lib/typeorm/metadata/EmbeddedMetadata.js.map +1 -1
- package/lib/typeorm/metadata/EntityListenerMetadata.js.map +1 -1
- package/lib/typeorm/metadata/EntityMetadata.js.map +1 -1
- package/lib/typeorm/metadata/ExclusionMetadata.js.map +1 -1
- package/lib/typeorm/metadata/ForeignKeyMetadata.js.map +1 -1
- package/lib/typeorm/metadata/IndexMetadata.js.map +1 -1
- package/lib/typeorm/metadata/RelationCountMetadata.js.map +1 -1
- package/lib/typeorm/metadata/RelationIdMetadata.js.map +1 -1
- package/lib/typeorm/metadata/RelationMetadata.js.map +1 -1
- package/lib/typeorm/metadata/UniqueMetadata.js.map +1 -1
- package/lib/typeorm/metadata/types/ClosureTreeOptions.js.map +1 -1
- package/lib/typeorm/metadata/types/DeferrableType.js.map +1 -1
- package/lib/typeorm/metadata/types/EventListenerTypes.js.map +1 -1
- package/lib/typeorm/metadata/types/OnDeleteType.js.map +1 -1
- package/lib/typeorm/metadata/types/OnUpdateType.js.map +1 -1
- package/lib/typeorm/metadata/types/PropertyTypeInFunction.js.map +1 -1
- package/lib/typeorm/metadata/types/RelationTypeInFunction.js.map +1 -1
- package/lib/typeorm/metadata/types/RelationTypes.js.map +1 -1
- package/lib/typeorm/metadata/types/TableTypes.js.map +1 -1
- package/lib/typeorm/metadata/types/TreeTypes.js.map +1 -1
- package/lib/typeorm/metadata-args/CheckMetadataArgs.js.map +1 -1
- package/lib/typeorm/metadata-args/ColumnMetadataArgs.js.map +1 -1
- package/lib/typeorm/metadata-args/DiscriminatorValueMetadataArgs.js.map +1 -1
- package/lib/typeorm/metadata-args/EmbeddedMetadataArgs.js.map +1 -1
- package/lib/typeorm/metadata-args/EntityListenerMetadataArgs.js.map +1 -1
- package/lib/typeorm/metadata-args/EntityRepositoryMetadataArgs.js.map +1 -1
- package/lib/typeorm/metadata-args/EntitySubscriberMetadataArgs.js.map +1 -1
- package/lib/typeorm/metadata-args/ExclusionMetadataArgs.js.map +1 -1
- package/lib/typeorm/metadata-args/GeneratedMetadataArgs.js.map +1 -1
- package/lib/typeorm/metadata-args/IndexMetadataArgs.js.map +1 -1
- package/lib/typeorm/metadata-args/InheritanceMetadataArgs.js.map +1 -1
- package/lib/typeorm/metadata-args/JoinColumnMetadataArgs.js.map +1 -1
- package/lib/typeorm/metadata-args/JoinTableMetadataArgs.js.map +1 -1
- package/lib/typeorm/metadata-args/MetadataArgsStorage.js.map +1 -1
- package/lib/typeorm/metadata-args/NamingStrategyMetadataArgs.js.map +1 -1
- package/lib/typeorm/metadata-args/RelationCountMetadataArgs.js.map +1 -1
- package/lib/typeorm/metadata-args/RelationIdMetadataArgs.js.map +1 -1
- package/lib/typeorm/metadata-args/RelationMetadataArgs.js.map +1 -1
- package/lib/typeorm/metadata-args/TableMetadataArgs.js.map +1 -1
- package/lib/typeorm/metadata-args/TransactionEntityMetadataArgs.js.map +1 -1
- package/lib/typeorm/metadata-args/TransactionRepositoryMetadataArgs.js.map +1 -1
- package/lib/typeorm/metadata-args/TreeMetadataArgs.js.map +1 -1
- package/lib/typeorm/metadata-args/UniqueMetadataArgs.js.map +1 -1
- package/lib/typeorm/metadata-args/types/ColumnMode.js.map +1 -1
- package/lib/typeorm/metadata-builder/ClosureJunctionEntityMetadataBuilder.js.map +1 -1
- package/lib/typeorm/metadata-builder/EntityMetadataBuilder.js.map +1 -1
- package/lib/typeorm/metadata-builder/EntityMetadataValidator.js.map +1 -1
- package/lib/typeorm/metadata-builder/JunctionEntityMetadataBuilder.js.map +1 -1
- package/lib/typeorm/metadata-builder/MetadataUtils.js.map +1 -1
- package/lib/typeorm/metadata-builder/RelationJoinColumnBuilder.js.map +1 -1
- package/lib/typeorm/migration/Migration.js.map +1 -1
- package/lib/typeorm/migration/MigrationExecutor.js.map +1 -1
- package/lib/typeorm/migration/MigrationInterface.js.map +1 -1
- package/lib/typeorm/naming-strategy/DefaultNamingStrategy.js.map +1 -1
- package/lib/typeorm/naming-strategy/NamingStrategyInterface.js.map +1 -1
- package/lib/typeorm/persistence/EntityPersistExecutor.js.map +1 -1
- package/lib/typeorm/persistence/Subject.js.map +1 -1
- package/lib/typeorm/persistence/SubjectChangeMap.js.map +1 -1
- package/lib/typeorm/persistence/SubjectChangedColumnsComputer.js.map +1 -1
- package/lib/typeorm/persistence/SubjectDatabaseEntityLoader.js.map +1 -1
- package/lib/typeorm/persistence/SubjectExecutor.js.map +1 -1
- package/lib/typeorm/persistence/SubjectTopoligicalSorter.js.map +1 -1
- package/lib/typeorm/persistence/subject-builder/CascadesSubjectBuilder.js.map +1 -1
- package/lib/typeorm/persistence/subject-builder/ManyToManySubjectBuilder.js.map +1 -1
- package/lib/typeorm/persistence/subject-builder/OneToManySubjectBuilder.js.map +1 -1
- package/lib/typeorm/persistence/subject-builder/OneToOneInverseSideSubjectBuilder.js.map +1 -1
- package/lib/typeorm/persistence/tree/ClosureSubjectExecutor.js.map +1 -1
- package/lib/typeorm/persistence/tree/MaterializedPathSubjectExecutor.js.map +1 -1
- package/lib/typeorm/persistence/tree/NestedSetSubjectExecutor.js.map +1 -1
- package/lib/typeorm/platform/PlatformTools.js.map +1 -1
- package/lib/typeorm/query-builder/Alias.js.map +1 -1
- package/lib/typeorm/query-builder/Brackets.js.map +1 -1
- package/lib/typeorm/query-builder/DeleteQueryBuilder.js.map +1 -1
- package/lib/typeorm/query-builder/InsertOrUpdateOptions.js.map +1 -1
- package/lib/typeorm/query-builder/InsertQueryBuilder.js.map +1 -1
- package/lib/typeorm/query-builder/JoinAttribute.js.map +1 -1
- package/lib/typeorm/query-builder/JoinOptions.js.map +1 -1
- package/lib/typeorm/query-builder/NotBrackets.js.map +1 -1
- package/lib/typeorm/query-builder/QueryBuilder.js.map +1 -1
- package/lib/typeorm/query-builder/QueryBuilderCte.js.map +1 -1
- package/lib/typeorm/query-builder/QueryBuilderUtils.js.map +1 -1
- package/lib/typeorm/query-builder/QueryExpressionMap.js.map +1 -1
- package/lib/typeorm/query-builder/QueryPartialEntity.js.map +1 -1
- package/lib/typeorm/query-builder/RelationIdLoader.js.map +1 -1
- package/lib/typeorm/query-builder/RelationLoader.js.map +1 -1
- package/lib/typeorm/query-builder/RelationQueryBuilder.js.map +1 -1
- package/lib/typeorm/query-builder/RelationRemover.js.map +1 -1
- package/lib/typeorm/query-builder/RelationUpdater.js.map +1 -1
- package/lib/typeorm/query-builder/ReturningResultsEntityUpdator.js.map +1 -1
- package/lib/typeorm/query-builder/SelectQuery.js.map +1 -1
- package/lib/typeorm/query-builder/SelectQueryBuilder.js.map +1 -1
- package/lib/typeorm/query-builder/SelectQueryBuilderOption.js.map +1 -1
- package/lib/typeorm/query-builder/SoftDeleteQueryBuilder.js.map +1 -1
- package/lib/typeorm/query-builder/UpdateQueryBuilder.js.map +1 -1
- package/lib/typeorm/query-builder/WhereClause.js.map +1 -1
- package/lib/typeorm/query-builder/WhereExpressionBuilder.js.map +1 -1
- package/lib/typeorm/query-builder/relation-count/RelationCountAttribute.js.map +1 -1
- package/lib/typeorm/query-builder/relation-count/RelationCountLoadResult.js.map +1 -1
- package/lib/typeorm/query-builder/relation-count/RelationCountLoader.js.map +1 -1
- package/lib/typeorm/query-builder/relation-count/RelationCountMetadataToAttributeTransformer.js.map +1 -1
- package/lib/typeorm/query-builder/relation-id/RelationIdAttribute.js.map +1 -1
- package/lib/typeorm/query-builder/relation-id/RelationIdLoadResult.js.map +1 -1
- package/lib/typeorm/query-builder/relation-id/RelationIdLoader.js.map +1 -1
- package/lib/typeorm/query-builder/relation-id/RelationIdMetadataToAttributeTransformer.js.map +1 -1
- package/lib/typeorm/query-builder/result/DeleteResult.js.map +1 -1
- package/lib/typeorm/query-builder/result/InsertResult.js.map +1 -1
- package/lib/typeorm/query-builder/result/UpdateResult.js.map +1 -1
- package/lib/typeorm/query-builder/transformer/DocumentToEntityTransformer.js.map +1 -1
- package/lib/typeorm/query-builder/transformer/PlainObjectToDatabaseEntityTransformer.js.map +1 -1
- package/lib/typeorm/query-builder/transformer/PlainObjectToNewEntityTransformer.js.map +1 -1
- package/lib/typeorm/query-builder/transformer/RawSqlResultsToEntityTransformer.js.map +1 -1
- package/lib/typeorm/query-runner/BaseQueryRunner.js.map +1 -1
- package/lib/typeorm/query-runner/QueryLock.js.map +1 -1
- package/lib/typeorm/query-runner/QueryResult.js.map +1 -1
- package/lib/typeorm/query-runner/QueryRunner.js.map +1 -1
- package/lib/typeorm/repository/AbstractRepository.js.map +1 -1
- package/lib/typeorm/repository/BaseEntity.js.map +1 -1
- package/lib/typeorm/repository/EntityId.js.map +1 -1
- package/lib/typeorm/repository/FindTreesOptions.js.map +1 -1
- package/lib/typeorm/repository/MongoRepository.js.map +1 -1
- package/lib/typeorm/repository/RemoveOptions.js.map +1 -1
- package/lib/typeorm/repository/Repository.js.map +1 -1
- package/lib/typeorm/repository/SaveOptions.js.map +1 -1
- package/lib/typeorm/repository/TreeRepository.js.map +1 -1
- package/lib/typeorm/repository/UpsertOptions.js.map +1 -1
- package/lib/typeorm/schema-builder/MongoSchemaBuilder.js.map +1 -1
- package/lib/typeorm/schema-builder/RdbmsSchemaBuilder.js.map +1 -1
- package/lib/typeorm/schema-builder/SchemaBuilder.js.map +1 -1
- package/lib/typeorm/schema-builder/options/TableCheckOptions.js.map +1 -1
- package/lib/typeorm/schema-builder/options/TableColumnOptions.js.map +1 -1
- package/lib/typeorm/schema-builder/options/TableExclusionOptions.js.map +1 -1
- package/lib/typeorm/schema-builder/options/TableForeignKeyOptions.js.map +1 -1
- package/lib/typeorm/schema-builder/options/TableIndexOptions.js.map +1 -1
- package/lib/typeorm/schema-builder/options/TableOptions.js.map +1 -1
- package/lib/typeorm/schema-builder/options/TableUniqueOptions.js.map +1 -1
- package/lib/typeorm/schema-builder/options/ViewOptions.js.map +1 -1
- package/lib/typeorm/schema-builder/table/Table.js.map +1 -1
- package/lib/typeorm/schema-builder/table/TableCheck.js.map +1 -1
- package/lib/typeorm/schema-builder/table/TableColumn.js.map +1 -1
- package/lib/typeorm/schema-builder/table/TableExclusion.js.map +1 -1
- package/lib/typeorm/schema-builder/table/TableForeignKey.js.map +1 -1
- package/lib/typeorm/schema-builder/table/TableIndex.js.map +1 -1
- package/lib/typeorm/schema-builder/table/TableUnique.js.map +1 -1
- package/lib/typeorm/schema-builder/util/TableUtils.js.map +1 -1
- package/lib/typeorm/schema-builder/util/ViewUtils.js.map +1 -1
- package/lib/typeorm/schema-builder/view/View.js.map +1 -1
- package/lib/typeorm/subscriber/Broadcaster.js.map +1 -1
- package/lib/typeorm/subscriber/BroadcasterResult.js.map +1 -1
- package/lib/typeorm/subscriber/EntitySubscriberInterface.js.map +1 -1
- package/lib/typeorm/subscriber/event/InsertEvent.js.map +1 -1
- package/lib/typeorm/subscriber/event/LoadEvent.js.map +1 -1
- package/lib/typeorm/subscriber/event/RecoverEvent.js.map +1 -1
- package/lib/typeorm/subscriber/event/RemoveEvent.js.map +1 -1
- package/lib/typeorm/subscriber/event/SoftRemoveEvent.js.map +1 -1
- package/lib/typeorm/subscriber/event/TransactionCommitEvent.js.map +1 -1
- package/lib/typeorm/subscriber/event/TransactionRollbackEvent.js.map +1 -1
- package/lib/typeorm/subscriber/event/TransactionStartEvent.js.map +1 -1
- package/lib/typeorm/subscriber/event/UpdateEvent.js.map +1 -1
- package/lib/typeorm/util/ApplyValueTransformers.js.map +1 -1
- package/lib/typeorm/util/DateUtils.js.map +1 -1
- package/lib/typeorm/util/DepGraph.js.map +1 -1
- package/lib/typeorm/util/DirectoryExportedClassesLoader.js.map +1 -1
- package/lib/typeorm/util/ImportUtils.js.map +1 -1
- package/lib/typeorm/util/InstanceChecker.js.map +1 -1
- package/lib/typeorm/util/ObjectUtils.js.map +1 -1
- package/lib/typeorm/util/OrmUtils.js.map +1 -1
- package/lib/typeorm/util/PathUtils.js.map +1 -1
- package/lib/typeorm/util/RandomGenerator.js.map +1 -1
- package/lib/typeorm/util/StringUtils.js.map +1 -1
- package/lib/typeorm/util/TreeRepositoryUtils.js.map +1 -1
- package/lib/typeorm/util/VersionUtils.js.map +1 -1
- package/lib/typeorm/util/escapeRegExp.js.map +1 -1
- package/migrations/index.js.map +1 -1
- package/migrations/migrations_index._auto-generated_.js.map +1 -1
- package/package.json +1 -1
- package/tmp-environment.json +3 -3
- package/websql/README.md +24 -24
- package/browser/esm2022/lib/index.mjs +0 -4
- package/browser/esm2022/lib/typeorm/cache/DbQueryResultCache.mjs +0 -251
- package/browser/esm2022/lib/typeorm/cache/QueryResultCache.mjs +0 -4
- package/browser/esm2022/lib/typeorm/cache/QueryResultCacheFactory.mjs +0 -33
- package/browser/esm2022/lib/typeorm/cache/QueryResultCacheOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/cache/RedisQueryResultCache.mjs +0 -185
- package/browser/esm2022/lib/typeorm/common/DeepPartial.mjs +0 -3
- package/browser/esm2022/lib/typeorm/common/EntityTarget.mjs +0 -3
- package/browser/esm2022/lib/typeorm/common/MixedList.mjs +0 -3
- package/browser/esm2022/lib/typeorm/common/ObjectLiteral.mjs +0 -4
- package/browser/esm2022/lib/typeorm/common/ObjectType.mjs +0 -3
- package/browser/esm2022/lib/typeorm/common/RelationType.mjs +0 -3
- package/browser/esm2022/lib/typeorm/connection/Connection.mjs +0 -13
- package/browser/esm2022/lib/typeorm/connection/ConnectionManager.mjs +0 -57
- package/browser/esm2022/lib/typeorm/connection/ConnectionMetadataBuilder.mjs +0 -63
- package/browser/esm2022/lib/typeorm/connection/ConnectionOptions.mjs +0 -3
- package/browser/esm2022/lib/typeorm/connection/ConnectionOptionsReader.mjs +0 -237
- package/browser/esm2022/lib/typeorm/constants.mjs +0 -4
- package/browser/esm2022/lib/typeorm/container.mjs +0 -57
- package/browser/esm2022/lib/typeorm/data-source/BaseDataSourceOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/data-source/DataSource.mjs +0 -458
- package/browser/esm2022/lib/typeorm/data-source/DataSourceOptions.mjs +0 -11
- package/browser/esm2022/lib/typeorm/data-source/index.mjs +0 -4
- package/browser/esm2022/lib/typeorm/decorator/Check.mjs +0 -25
- package/browser/esm2022/lib/typeorm/decorator/EntityRepository.mjs +0 -19
- package/browser/esm2022/lib/typeorm/decorator/Exclusion.mjs +0 -25
- package/browser/esm2022/lib/typeorm/decorator/Generated.mjs +0 -22
- package/browser/esm2022/lib/typeorm/decorator/Index.mjs +0 -52
- package/browser/esm2022/lib/typeorm/decorator/Unique.mjs +0 -48
- package/browser/esm2022/lib/typeorm/decorator/columns/Column.mjs +0 -67
- package/browser/esm2022/lib/typeorm/decorator/columns/CreateDateColumn.mjs +0 -19
- package/browser/esm2022/lib/typeorm/decorator/columns/DeleteDateColumn.mjs +0 -18
- package/browser/esm2022/lib/typeorm/decorator/columns/ObjectIdColumn.mjs +0 -23
- package/browser/esm2022/lib/typeorm/decorator/columns/PrimaryColumn.mjs +0 -54
- package/browser/esm2022/lib/typeorm/decorator/columns/PrimaryGeneratedColumn.mjs +0 -52
- package/browser/esm2022/lib/typeorm/decorator/columns/UpdateDateColumn.mjs +0 -18
- package/browser/esm2022/lib/typeorm/decorator/columns/VersionColumn.mjs +0 -19
- package/browser/esm2022/lib/typeorm/decorator/columns/ViewColumn.mjs +0 -17
- package/browser/esm2022/lib/typeorm/decorator/columns/VirtualColumn.mjs +0 -41
- package/browser/esm2022/lib/typeorm/decorator/entity/ChildEntity.mjs +0 -21
- package/browser/esm2022/lib/typeorm/decorator/entity/Entity.mjs +0 -28
- package/browser/esm2022/lib/typeorm/decorator/entity/TableInheritance.mjs +0 -20
- package/browser/esm2022/lib/typeorm/decorator/entity-view/ViewEntity.mjs +0 -30
- package/browser/esm2022/lib/typeorm/decorator/listeners/AfterInsert.mjs +0 -17
- package/browser/esm2022/lib/typeorm/decorator/listeners/AfterLoad.mjs +0 -17
- package/browser/esm2022/lib/typeorm/decorator/listeners/AfterRecover.mjs +0 -17
- package/browser/esm2022/lib/typeorm/decorator/listeners/AfterRemove.mjs +0 -17
- package/browser/esm2022/lib/typeorm/decorator/listeners/AfterSoftRemove.mjs +0 -17
- package/browser/esm2022/lib/typeorm/decorator/listeners/AfterUpdate.mjs +0 -17
- package/browser/esm2022/lib/typeorm/decorator/listeners/BeforeInsert.mjs +0 -17
- package/browser/esm2022/lib/typeorm/decorator/listeners/BeforeRecover.mjs +0 -17
- package/browser/esm2022/lib/typeorm/decorator/listeners/BeforeRemove.mjs +0 -17
- package/browser/esm2022/lib/typeorm/decorator/listeners/BeforeSoftRemove.mjs +0 -17
- package/browser/esm2022/lib/typeorm/decorator/listeners/BeforeUpdate.mjs +0 -17
- package/browser/esm2022/lib/typeorm/decorator/listeners/EventSubscriber.mjs +0 -15
- package/browser/esm2022/lib/typeorm/decorator/options/ColumnCommonOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/decorator/options/ColumnEmbeddedOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/decorator/options/ColumnEnumOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/decorator/options/ColumnHstoreOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/decorator/options/ColumnNumericOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/decorator/options/ColumnOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/decorator/options/ColumnWithLengthOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/decorator/options/ColumnWithWidthOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/decorator/options/EntityOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/decorator/options/IndexOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/decorator/options/JoinColumnOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/decorator/options/JoinTableMultipleColumnsOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/decorator/options/JoinTableOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/decorator/options/PrimaryGeneratedColumnIdentityOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/decorator/options/PrimaryGeneratedColumnNumericOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/decorator/options/PrimaryGeneratedColumnUUIDOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/decorator/options/RelationOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/decorator/options/SpatialColumnOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/decorator/options/UniqueOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/decorator/options/ValueTransformer.mjs +0 -4
- package/browser/esm2022/lib/typeorm/decorator/options/ViewColumnOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/decorator/options/ViewEntityOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/decorator/options/VirtualColumnOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/decorator/relations/JoinColumn.mjs +0 -25
- package/browser/esm2022/lib/typeorm/decorator/relations/JoinTable.mjs +0 -31
- package/browser/esm2022/lib/typeorm/decorator/relations/ManyToMany.mjs +0 -40
- package/browser/esm2022/lib/typeorm/decorator/relations/ManyToOne.mjs +0 -40
- package/browser/esm2022/lib/typeorm/decorator/relations/OneToMany.mjs +0 -32
- package/browser/esm2022/lib/typeorm/decorator/relations/OneToOne.mjs +0 -39
- package/browser/esm2022/lib/typeorm/decorator/relations/RelationCount.mjs +0 -20
- package/browser/esm2022/lib/typeorm/decorator/relations/RelationId.mjs +0 -20
- package/browser/esm2022/lib/typeorm/decorator/tree/Tree.mjs +0 -19
- package/browser/esm2022/lib/typeorm/decorator/tree/TreeChildren.mjs +0 -34
- package/browser/esm2022/lib/typeorm/decorator/tree/TreeLevelColumn.mjs +0 -17
- package/browser/esm2022/lib/typeorm/decorator/tree/TreeParent.mjs +0 -34
- package/browser/esm2022/lib/typeorm/driver/Driver.mjs +0 -4
- package/browser/esm2022/lib/typeorm/driver/DriverFactory.mjs +0 -99
- package/browser/esm2022/lib/typeorm/driver/DriverUtils.mjs +0 -213
- package/browser/esm2022/lib/typeorm/driver/Query.mjs +0 -13
- package/browser/esm2022/lib/typeorm/driver/SqlInMemory.mjs +0 -12
- package/browser/esm2022/lib/typeorm/driver/cordova/CordovaConnectionOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/driver/cordova/CordovaDriver.mjs +0 -63
- package/browser/esm2022/lib/typeorm/driver/cordova/CordovaQueryRunner.mjs +0 -152
- package/browser/esm2022/lib/typeorm/driver/mongodb/typings.mjs +0 -6516
- package/browser/esm2022/lib/typeorm/driver/nativescript/NativescriptConnectionOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/driver/nativescript/NativescriptDriver.mjs +0 -82
- package/browser/esm2022/lib/typeorm/driver/nativescript/NativescriptQueryRunner.mjs +0 -82
- package/browser/esm2022/lib/typeorm/driver/react-native/ReactNativeConnectionOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/driver/react-native/ReactNativeDriver.mjs +0 -69
- package/browser/esm2022/lib/typeorm/driver/react-native/ReactNativeQueryRunner.mjs +0 -81
- package/browser/esm2022/lib/typeorm/driver/sqlite-abstract/AbstractSqliteDriver.mjs +0 -582
- package/browser/esm2022/lib/typeorm/driver/sqlite-abstract/AbstractSqliteQueryRunner.mjs +0 -1421
- package/browser/esm2022/lib/typeorm/driver/sqljs/SqljsConnectionOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/driver/sqljs/SqljsDriver.mjs +0 -249
- package/browser/esm2022/lib/typeorm/driver/sqljs/SqljsQueryRunner.mjs +0 -107
- package/browser/esm2022/lib/typeorm/driver/types/ColumnTypes.mjs +0 -3
- package/browser/esm2022/lib/typeorm/driver/types/CteCapabilities.mjs +0 -4
- package/browser/esm2022/lib/typeorm/driver/types/DataTypeDefaults.mjs +0 -4
- package/browser/esm2022/lib/typeorm/driver/types/DatabaseType.mjs +0 -3
- package/browser/esm2022/lib/typeorm/driver/types/IsolationLevel.mjs +0 -3
- package/browser/esm2022/lib/typeorm/driver/types/MappedColumnTypes.mjs +0 -4
- package/browser/esm2022/lib/typeorm/driver/types/MetadataTableType.mjs +0 -9
- package/browser/esm2022/lib/typeorm/driver/types/ReplicationMode.mjs +0 -3
- package/browser/esm2022/lib/typeorm/driver/types/UpsertType.mjs +0 -3
- package/browser/esm2022/lib/typeorm/entity-manager/EntityManager.mjs +0 -743
- package/browser/esm2022/lib/typeorm/entity-manager/EntityManagerFactory.mjs +0 -23
- package/browser/esm2022/lib/typeorm/entity-manager/SqljsEntityManager.mjs +0 -35
- package/browser/esm2022/lib/typeorm/entity-schema/EntitySchema.mjs +0 -12
- package/browser/esm2022/lib/typeorm/entity-schema/EntitySchemaCheckOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/entity-schema/EntitySchemaColumnOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/entity-schema/EntitySchemaEmbeddedColumnOptions.mjs +0 -5
- package/browser/esm2022/lib/typeorm/entity-schema/EntitySchemaEmbeddedError.mjs +0 -15
- package/browser/esm2022/lib/typeorm/entity-schema/EntitySchemaExclusionOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/entity-schema/EntitySchemaIndexOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/entity-schema/EntitySchemaOptions.mjs +0 -8
- package/browser/esm2022/lib/typeorm/entity-schema/EntitySchemaRelationIdOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/entity-schema/EntitySchemaRelationOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/entity-schema/EntitySchemaTransformer.mjs +0 -268
- package/browser/esm2022/lib/typeorm/entity-schema/EntitySchemaUniqueOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/error/AlreadyHasActiveConnectionError.mjs +0 -13
- package/browser/esm2022/lib/typeorm/error/CannotAttachTreeChildrenEntityError.mjs +0 -13
- package/browser/esm2022/lib/typeorm/error/CannotConnectAlreadyConnectedError.mjs +0 -12
- package/browser/esm2022/lib/typeorm/error/CannotCreateEntityIdMapError.mjs +0 -18
- package/browser/esm2022/lib/typeorm/error/CannotDetermineEntityError.mjs +0 -13
- package/browser/esm2022/lib/typeorm/error/CannotExecuteNotConnectedError.mjs +0 -12
- package/browser/esm2022/lib/typeorm/error/CannotGetEntityManagerNotConnectedError.mjs +0 -12
- package/browser/esm2022/lib/typeorm/error/CannotReflectMethodParameterTypeError.mjs +0 -15
- package/browser/esm2022/lib/typeorm/error/CircularRelationsError.mjs +0 -13
- package/browser/esm2022/lib/typeorm/error/ColumnTypeUndefinedError.mjs +0 -16
- package/browser/esm2022/lib/typeorm/error/ConnectionIsNotSetError.mjs +0 -12
- package/browser/esm2022/lib/typeorm/error/ConnectionNotFoundError.mjs +0 -12
- package/browser/esm2022/lib/typeorm/error/CustomRepositoryCannotInheritRepositoryError.mjs +0 -15
- package/browser/esm2022/lib/typeorm/error/CustomRepositoryDoesNotHaveEntityError.mjs +0 -15
- package/browser/esm2022/lib/typeorm/error/CustomRepositoryNotFoundError.mjs +0 -15
- package/browser/esm2022/lib/typeorm/error/DataTypeNotSupportedError.mjs +0 -11
- package/browser/esm2022/lib/typeorm/error/DriverOptionNotSetError.mjs +0 -13
- package/browser/esm2022/lib/typeorm/error/DriverPackageNotInstalledError.mjs +0 -13
- package/browser/esm2022/lib/typeorm/error/EntityMetadataNotFoundError.mjs +0 -26
- package/browser/esm2022/lib/typeorm/error/EntityNotFoundError.mjs +0 -37
- package/browser/esm2022/lib/typeorm/error/EntityPropertyNotFoundError.mjs +0 -14
- package/browser/esm2022/lib/typeorm/error/FindRelationsNotFoundError.mjs +0 -20
- package/browser/esm2022/lib/typeorm/error/InitializedRelationError.mjs +0 -17
- package/browser/esm2022/lib/typeorm/error/InsertValuesMissingError.mjs +0 -13
- package/browser/esm2022/lib/typeorm/error/LimitOnUpdateNotSupportedError.mjs +0 -12
- package/browser/esm2022/lib/typeorm/error/LockNotSupportedOnGivenDriverError.mjs +0 -12
- package/browser/esm2022/lib/typeorm/error/MetadataAlreadyExistsError.mjs +0 -15
- package/browser/esm2022/lib/typeorm/error/MetadataWithSuchNameAlreadyExistsError.mjs +0 -13
- package/browser/esm2022/lib/typeorm/error/MissingDeleteDateColumnError.mjs +0 -9
- package/browser/esm2022/lib/typeorm/error/MissingDriverError.mjs +0 -13
- package/browser/esm2022/lib/typeorm/error/MissingJoinColumnError.mjs +0 -20
- package/browser/esm2022/lib/typeorm/error/MissingJoinTableError.mjs +0 -20
- package/browser/esm2022/lib/typeorm/error/MissingPrimaryColumnError.mjs +0 -10
- package/browser/esm2022/lib/typeorm/error/MustBeEntityError.mjs +0 -12
- package/browser/esm2022/lib/typeorm/error/NamingStrategyNotFoundError.mjs +0 -18
- package/browser/esm2022/lib/typeorm/error/NestedSetMultipleRootError.mjs +0 -9
- package/browser/esm2022/lib/typeorm/error/NoConnectionForRepositoryError.mjs +0 -13
- package/browser/esm2022/lib/typeorm/error/NoConnectionOptionError.mjs +0 -13
- package/browser/esm2022/lib/typeorm/error/NoNeedToReleaseEntityManagerError.mjs +0 -14
- package/browser/esm2022/lib/typeorm/error/NoVersionOrUpdateDateColumnError.mjs +0 -12
- package/browser/esm2022/lib/typeorm/error/OffsetWithoutLimitNotSupportedError.mjs +0 -14
- package/browser/esm2022/lib/typeorm/error/OptimisticLockCanNotBeUsedError.mjs +0 -12
- package/browser/esm2022/lib/typeorm/error/OptimisticLockVersionMismatchError.mjs +0 -12
- package/browser/esm2022/lib/typeorm/error/PersistedEntityNotFoundError.mjs +0 -12
- package/browser/esm2022/lib/typeorm/error/PessimisticLockTransactionRequiredError.mjs +0 -12
- package/browser/esm2022/lib/typeorm/error/PrimaryColumnCannotBeNullableError.mjs +0 -10
- package/browser/esm2022/lib/typeorm/error/QueryFailedError.mjs +0 -27
- package/browser/esm2022/lib/typeorm/error/QueryRunnerAlreadyReleasedError.mjs +0 -9
- package/browser/esm2022/lib/typeorm/error/QueryRunnerProviderAlreadyReleasedError.mjs +0 -13
- package/browser/esm2022/lib/typeorm/error/RepositoryNotTreeError.mjs +0 -29
- package/browser/esm2022/lib/typeorm/error/ReturningStatementNotSupportedError.mjs +0 -13
- package/browser/esm2022/lib/typeorm/error/SubjectRemovedAndUpdatedError.mjs +0 -13
- package/browser/esm2022/lib/typeorm/error/SubjectWithoutIdentifierError.mjs +0 -14
- package/browser/esm2022/lib/typeorm/error/TransactionAlreadyStartedError.mjs +0 -12
- package/browser/esm2022/lib/typeorm/error/TransactionNotStartedError.mjs +0 -12
- package/browser/esm2022/lib/typeorm/error/TreeRepositoryNotSupportedError.mjs +0 -9
- package/browser/esm2022/lib/typeorm/error/TypeORMError.mjs +0 -18
- package/browser/esm2022/lib/typeorm/error/UpdateValuesMissingError.mjs +0 -9
- package/browser/esm2022/lib/typeorm/error/UsingJoinColumnIsNotAllowedError.mjs +0 -10
- package/browser/esm2022/lib/typeorm/error/UsingJoinColumnOnlyOnOneSideAllowedError.mjs +0 -11
- package/browser/esm2022/lib/typeorm/error/UsingJoinTableIsNotAllowedError.mjs +0 -11
- package/browser/esm2022/lib/typeorm/error/UsingJoinTableOnlyOnOneSideAllowedError.mjs +0 -11
- package/browser/esm2022/lib/typeorm/error/index.mjs +0 -63
- package/browser/esm2022/lib/typeorm/find-options/EqualOperator.mjs +0 -10
- package/browser/esm2022/lib/typeorm/find-options/FindManyOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/find-options/FindOneOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/find-options/FindOperator.mjs +0 -74
- package/browser/esm2022/lib/typeorm/find-options/FindOperatorType.mjs +0 -3
- package/browser/esm2022/lib/typeorm/find-options/FindOptionsOrder.mjs +0 -3
- package/browser/esm2022/lib/typeorm/find-options/FindOptionsRelations.mjs +0 -3
- package/browser/esm2022/lib/typeorm/find-options/FindOptionsSelect.mjs +0 -5
- package/browser/esm2022/lib/typeorm/find-options/FindOptionsUtils.mjs +0 -293
- package/browser/esm2022/lib/typeorm/find-options/FindOptionsWhere.mjs +0 -3
- package/browser/esm2022/lib/typeorm/find-options/FindTreeOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/find-options/JoinOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/find-options/OrderByCondition.mjs +0 -3
- package/browser/esm2022/lib/typeorm/find-options/operator/Any.mjs +0 -11
- package/browser/esm2022/lib/typeorm/find-options/operator/ArrayContainedBy.mjs +0 -11
- package/browser/esm2022/lib/typeorm/find-options/operator/ArrayContains.mjs +0 -11
- package/browser/esm2022/lib/typeorm/find-options/operator/ArrayOverlap.mjs +0 -11
- package/browser/esm2022/lib/typeorm/find-options/operator/Between.mjs +0 -11
- package/browser/esm2022/lib/typeorm/find-options/operator/Equal.mjs +0 -15
- package/browser/esm2022/lib/typeorm/find-options/operator/ILike.mjs +0 -11
- package/browser/esm2022/lib/typeorm/find-options/operator/In.mjs +0 -11
- package/browser/esm2022/lib/typeorm/find-options/operator/IsNull.mjs +0 -11
- package/browser/esm2022/lib/typeorm/find-options/operator/LessThan.mjs +0 -11
- package/browser/esm2022/lib/typeorm/find-options/operator/LessThanOrEqual.mjs +0 -11
- package/browser/esm2022/lib/typeorm/find-options/operator/Like.mjs +0 -11
- package/browser/esm2022/lib/typeorm/find-options/operator/MoreThan.mjs +0 -11
- package/browser/esm2022/lib/typeorm/find-options/operator/MoreThanOrEqual.mjs +0 -11
- package/browser/esm2022/lib/typeorm/find-options/operator/Not.mjs +0 -12
- package/browser/esm2022/lib/typeorm/find-options/operator/Raw.mjs +0 -10
- package/browser/esm2022/lib/typeorm/globals.mjs +0 -165
- package/browser/esm2022/lib/typeorm/index.mjs +0 -157
- package/browser/esm2022/lib/typeorm/logger/AdvancedConsoleLogger.mjs +0 -109
- package/browser/esm2022/lib/typeorm/logger/DebugLogger.mjs +0 -94
- package/browser/esm2022/lib/typeorm/logger/Logger.mjs +0 -4
- package/browser/esm2022/lib/typeorm/logger/LoggerFactory.mjs +0 -36
- package/browser/esm2022/lib/typeorm/logger/LoggerOptions.mjs +0 -3
- package/browser/esm2022/lib/typeorm/logger/SimpleConsoleLogger.mjs +0 -108
- package/browser/esm2022/lib/typeorm/metadata/CheckMetadata.mjs +0 -26
- package/browser/esm2022/lib/typeorm/metadata/ColumnMetadata.mjs +0 -553
- package/browser/esm2022/lib/typeorm/metadata/EmbeddedMetadata.mjs +0 -206
- package/browser/esm2022/lib/typeorm/metadata/EntityListenerMetadata.mjs +0 -52
- package/browser/esm2022/lib/typeorm/metadata/EntityMetadata.mjs +0 -636
- package/browser/esm2022/lib/typeorm/metadata/ExclusionMetadata.mjs +0 -26
- package/browser/esm2022/lib/typeorm/metadata/ForeignKeyMetadata.mjs +0 -48
- package/browser/esm2022/lib/typeorm/metadata/IndexMetadata.mjs +0 -131
- package/browser/esm2022/lib/typeorm/metadata/RelationCountMetadata.mjs +0 -30
- package/browser/esm2022/lib/typeorm/metadata/RelationIdMetadata.mjs +0 -50
- package/browser/esm2022/lib/typeorm/metadata/RelationMetadata.mjs +0 -398
- package/browser/esm2022/lib/typeorm/metadata/UniqueMetadata.mjs +0 -90
- package/browser/esm2022/lib/typeorm/metadata/types/ClosureTreeOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/metadata/types/DeferrableType.mjs +0 -3
- package/browser/esm2022/lib/typeorm/metadata/types/EventListenerTypes.mjs +0 -19
- package/browser/esm2022/lib/typeorm/metadata/types/OnDeleteType.mjs +0 -3
- package/browser/esm2022/lib/typeorm/metadata/types/OnUpdateType.mjs +0 -3
- package/browser/esm2022/lib/typeorm/metadata/types/PropertyTypeInFunction.mjs +0 -3
- package/browser/esm2022/lib/typeorm/metadata/types/RelationTypeInFunction.mjs +0 -3
- package/browser/esm2022/lib/typeorm/metadata/types/RelationTypes.mjs +0 -3
- package/browser/esm2022/lib/typeorm/metadata/types/TableTypes.mjs +0 -3
- package/browser/esm2022/lib/typeorm/metadata/types/TreeTypes.mjs +0 -3
- package/browser/esm2022/lib/typeorm/metadata-args/CheckMetadataArgs.mjs +0 -4
- package/browser/esm2022/lib/typeorm/metadata-args/ColumnMetadataArgs.mjs +0 -4
- package/browser/esm2022/lib/typeorm/metadata-args/DiscriminatorValueMetadataArgs.mjs +0 -4
- package/browser/esm2022/lib/typeorm/metadata-args/EmbeddedMetadataArgs.mjs +0 -4
- package/browser/esm2022/lib/typeorm/metadata-args/EntityListenerMetadataArgs.mjs +0 -4
- package/browser/esm2022/lib/typeorm/metadata-args/EntityRepositoryMetadataArgs.mjs +0 -4
- package/browser/esm2022/lib/typeorm/metadata-args/EntitySubscriberMetadataArgs.mjs +0 -4
- package/browser/esm2022/lib/typeorm/metadata-args/ExclusionMetadataArgs.mjs +0 -4
- package/browser/esm2022/lib/typeorm/metadata-args/GeneratedMetadataArgs.mjs +0 -4
- package/browser/esm2022/lib/typeorm/metadata-args/IndexMetadataArgs.mjs +0 -4
- package/browser/esm2022/lib/typeorm/metadata-args/InheritanceMetadataArgs.mjs +0 -4
- package/browser/esm2022/lib/typeorm/metadata-args/JoinColumnMetadataArgs.mjs +0 -4
- package/browser/esm2022/lib/typeorm/metadata-args/JoinTableMetadataArgs.mjs +0 -4
- package/browser/esm2022/lib/typeorm/metadata-args/MetadataArgsStorage.mjs +0 -217
- package/browser/esm2022/lib/typeorm/metadata-args/NamingStrategyMetadataArgs.mjs +0 -4
- package/browser/esm2022/lib/typeorm/metadata-args/RelationCountMetadataArgs.mjs +0 -4
- package/browser/esm2022/lib/typeorm/metadata-args/RelationIdMetadataArgs.mjs +0 -4
- package/browser/esm2022/lib/typeorm/metadata-args/RelationMetadataArgs.mjs +0 -4
- package/browser/esm2022/lib/typeorm/metadata-args/TableMetadataArgs.mjs +0 -4
- package/browser/esm2022/lib/typeorm/metadata-args/TransactionEntityMetadataArgs.mjs +0 -4
- package/browser/esm2022/lib/typeorm/metadata-args/TransactionRepositoryMetadataArgs.mjs +0 -4
- package/browser/esm2022/lib/typeorm/metadata-args/TreeMetadataArgs.mjs +0 -4
- package/browser/esm2022/lib/typeorm/metadata-args/UniqueMetadataArgs.mjs +0 -4
- package/browser/esm2022/lib/typeorm/metadata-args/types/ColumnMode.mjs +0 -3
- package/browser/esm2022/lib/typeorm/metadata-builder/ClosureJunctionEntityMetadataBuilder.mjs +0 -131
- package/browser/esm2022/lib/typeorm/metadata-builder/EntityMetadataBuilder.mjs +0 -678
- package/browser/esm2022/lib/typeorm/metadata-builder/EntityMetadataValidator.mjs +0 -183
- package/browser/esm2022/lib/typeorm/metadata-builder/JunctionEntityMetadataBuilder.mjs +0 -262
- package/browser/esm2022/lib/typeorm/metadata-builder/MetadataUtils.mjs +0 -41
- package/browser/esm2022/lib/typeorm/metadata-builder/RelationJoinColumnBuilder.mjs +0 -167
- package/browser/esm2022/lib/typeorm/migration/Migration.mjs +0 -14
- package/browser/esm2022/lib/typeorm/migration/MigrationExecutor.mjs +0 -454
- package/browser/esm2022/lib/typeorm/migration/MigrationInterface.mjs +0 -4
- package/browser/esm2022/lib/typeorm/naming-strategy/DefaultNamingStrategy.mjs +0 -140
- package/browser/esm2022/lib/typeorm/naming-strategy/NamingStrategyInterface.mjs +0 -4
- package/browser/esm2022/lib/typeorm/persistence/EntityPersistExecutor.mjs +0 -125
- package/browser/esm2022/lib/typeorm/persistence/Subject.mjs +0 -212
- package/browser/esm2022/lib/typeorm/persistence/SubjectChangeMap.mjs +0 -4
- package/browser/esm2022/lib/typeorm/persistence/SubjectChangedColumnsComputer.mjs +0 -164
- package/browser/esm2022/lib/typeorm/persistence/SubjectDatabaseEntityLoader.mjs +0 -125
- package/browser/esm2022/lib/typeorm/persistence/SubjectExecutor.mjs +0 -721
- package/browser/esm2022/lib/typeorm/persistence/SubjectTopoligicalSorter.mjs +0 -151
- package/browser/esm2022/lib/typeorm/persistence/subject-builder/CascadesSubjectBuilder.mjs +0 -84
- package/browser/esm2022/lib/typeorm/persistence/subject-builder/ManyToManySubjectBuilder.mjs +0 -153
- package/browser/esm2022/lib/typeorm/persistence/subject-builder/OneToManySubjectBuilder.mjs +0 -117
- package/browser/esm2022/lib/typeorm/persistence/subject-builder/OneToOneInverseSideSubjectBuilder.mjs +0 -95
- package/browser/esm2022/lib/typeorm/persistence/tree/ClosureSubjectExecutor.mjs +0 -220
- package/browser/esm2022/lib/typeorm/persistence/tree/MaterializedPathSubjectExecutor.mjs +0 -97
- package/browser/esm2022/lib/typeorm/persistence/tree/NestedSetSubjectExecutor.mjs +0 -250
- package/browser/esm2022/lib/typeorm/platform/PlatformTools.mjs +0 -346
- package/browser/esm2022/lib/typeorm/query-builder/Alias.mjs +0 -26
- package/browser/esm2022/lib/typeorm/query-builder/Brackets.mjs +0 -16
- package/browser/esm2022/lib/typeorm/query-builder/DeleteQueryBuilder.mjs +0 -181
- package/browser/esm2022/lib/typeorm/query-builder/InsertOrUpdateOptions.mjs +0 -3
- package/browser/esm2022/lib/typeorm/query-builder/InsertQueryBuilder.mjs +0 -651
- package/browser/esm2022/lib/typeorm/query-builder/JoinAttribute.mjs +0 -153
- package/browser/esm2022/lib/typeorm/query-builder/NotBrackets.mjs +0 -14
- package/browser/esm2022/lib/typeorm/query-builder/QueryBuilder.mjs +0 -967
- package/browser/esm2022/lib/typeorm/query-builder/QueryBuilderCte.mjs +0 -4
- package/browser/esm2022/lib/typeorm/query-builder/QueryBuilderUtils.mjs +0 -22
- package/browser/esm2022/lib/typeorm/query-builder/QueryExpressionMap.mjs +0 -309
- package/browser/esm2022/lib/typeorm/query-builder/QueryPartialEntity.mjs +0 -3
- package/browser/esm2022/lib/typeorm/query-builder/RelationIdLoader.mjs +0 -452
- package/browser/esm2022/lib/typeorm/query-builder/RelationLoader.mjs +0 -262
- package/browser/esm2022/lib/typeorm/query-builder/RelationQueryBuilder.mjs +0 -147
- package/browser/esm2022/lib/typeorm/query-builder/RelationRemover.mjs +0 -130
- package/browser/esm2022/lib/typeorm/query-builder/RelationUpdater.mjs +0 -141
- package/browser/esm2022/lib/typeorm/query-builder/ReturningResultsEntityUpdator.mjs +0 -141
- package/browser/esm2022/lib/typeorm/query-builder/SelectQuery.mjs +0 -4
- package/browser/esm2022/lib/typeorm/query-builder/SelectQueryBuilder.mjs +0 -2278
- package/browser/esm2022/lib/typeorm/query-builder/SelectQueryBuilderOption.mjs +0 -3
- package/browser/esm2022/lib/typeorm/query-builder/SoftDeleteQueryBuilder.mjs +0 -348
- package/browser/esm2022/lib/typeorm/query-builder/UpdateQueryBuilder.mjs +0 -510
- package/browser/esm2022/lib/typeorm/query-builder/WhereClause.mjs +0 -3
- package/browser/esm2022/lib/typeorm/query-builder/WhereExpressionBuilder.mjs +0 -4
- package/browser/esm2022/lib/typeorm/query-builder/relation-count/RelationCountAttribute.mjs +0 -71
- package/browser/esm2022/lib/typeorm/query-builder/relation-count/RelationCountLoadResult.mjs +0 -4
- package/browser/esm2022/lib/typeorm/query-builder/relation-count/RelationCountLoader.mjs +0 -142
- package/browser/esm2022/lib/typeorm/query-builder/relation-count/RelationCountMetadataToAttributeTransformer.mjs +0 -33
- package/browser/esm2022/lib/typeorm/query-builder/relation-id/RelationIdAttribute.mjs +0 -79
- package/browser/esm2022/lib/typeorm/query-builder/relation-id/RelationIdLoadResult.mjs +0 -4
- package/browser/esm2022/lib/typeorm/query-builder/relation-id/RelationIdLoader.mjs +0 -247
- package/browser/esm2022/lib/typeorm/query-builder/relation-id/RelationIdMetadataToAttributeTransformer.mjs +0 -33
- package/browser/esm2022/lib/typeorm/query-builder/result/DeleteResult.mjs +0 -14
- package/browser/esm2022/lib/typeorm/query-builder/result/InsertResult.mjs +0 -25
- package/browser/esm2022/lib/typeorm/query-builder/result/UpdateResult.mjs +0 -25
- package/browser/esm2022/lib/typeorm/query-builder/transformer/PlainObjectToDatabaseEntityTransformer.mjs +0 -101
- package/browser/esm2022/lib/typeorm/query-builder/transformer/PlainObjectToNewEntityTransformer.mjs +0 -67
- package/browser/esm2022/lib/typeorm/query-builder/transformer/RawSqlResultsToEntityTransformer.mjs +0 -366
- package/browser/esm2022/lib/typeorm/query-runner/BaseQueryRunner.mjs +0 -392
- package/browser/esm2022/lib/typeorm/query-runner/QueryResult.mjs +0 -14
- package/browser/esm2022/lib/typeorm/query-runner/QueryRunner.mjs +0 -4
- package/browser/esm2022/lib/typeorm/repository/AbstractRepository.mjs +0 -80
- package/browser/esm2022/lib/typeorm/repository/BaseEntity.mjs +0 -283
- package/browser/esm2022/lib/typeorm/repository/FindTreesOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/repository/RemoveOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/repository/Repository.mjs +0 -275
- package/browser/esm2022/lib/typeorm/repository/SaveOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/repository/TreeRepository.mjs +0 -254
- package/browser/esm2022/lib/typeorm/repository/UpsertOptions.mjs +0 -7
- package/browser/esm2022/lib/typeorm/schema-builder/RdbmsSchemaBuilder.mjs +0 -770
- package/browser/esm2022/lib/typeorm/schema-builder/SchemaBuilder.mjs +0 -4
- package/browser/esm2022/lib/typeorm/schema-builder/options/TableCheckOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/schema-builder/options/TableColumnOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/schema-builder/options/TableExclusionOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/schema-builder/options/TableForeignKeyOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/schema-builder/options/TableIndexOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/schema-builder/options/TableOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/schema-builder/options/TableUniqueOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/schema-builder/options/ViewOptions.mjs +0 -4
- package/browser/esm2022/lib/typeorm/schema-builder/table/Table.mjs +0 -274
- package/browser/esm2022/lib/typeorm/schema-builder/table/TableCheck.mjs +0 -37
- package/browser/esm2022/lib/typeorm/schema-builder/table/TableColumn.mjs +0 -108
- package/browser/esm2022/lib/typeorm/schema-builder/table/TableExclusion.mjs +0 -31
- package/browser/esm2022/lib/typeorm/schema-builder/table/TableForeignKey.mjs +0 -60
- package/browser/esm2022/lib/typeorm/schema-builder/table/TableIndex.mjs +0 -53
- package/browser/esm2022/lib/typeorm/schema-builder/table/TableUnique.mjs +0 -38
- package/browser/esm2022/lib/typeorm/schema-builder/util/TableUtils.mjs +0 -38
- package/browser/esm2022/lib/typeorm/schema-builder/util/ViewUtils.mjs +0 -24
- package/browser/esm2022/lib/typeorm/schema-builder/view/View.mjs +0 -43
- package/browser/esm2022/lib/typeorm/subscriber/Broadcaster.mjs +0 -596
- package/browser/esm2022/lib/typeorm/subscriber/BroadcasterResult.mjs +0 -27
- package/browser/esm2022/lib/typeorm/subscriber/EntitySubscriberInterface.mjs +0 -4
- package/browser/esm2022/lib/typeorm/subscriber/event/InsertEvent.mjs +0 -4
- package/browser/esm2022/lib/typeorm/subscriber/event/LoadEvent.mjs +0 -4
- package/browser/esm2022/lib/typeorm/subscriber/event/RecoverEvent.mjs +0 -4
- package/browser/esm2022/lib/typeorm/subscriber/event/RemoveEvent.mjs +0 -4
- package/browser/esm2022/lib/typeorm/subscriber/event/SoftRemoveEvent.mjs +0 -4
- package/browser/esm2022/lib/typeorm/subscriber/event/TransactionCommitEvent.mjs +0 -4
- package/browser/esm2022/lib/typeorm/subscriber/event/TransactionRollbackEvent.mjs +0 -4
- package/browser/esm2022/lib/typeorm/subscriber/event/TransactionStartEvent.mjs +0 -4
- package/browser/esm2022/lib/typeorm/subscriber/event/UpdateEvent.mjs +0 -4
- package/browser/esm2022/lib/typeorm/util/ApplyValueTransformers.mjs +0 -22
- package/browser/esm2022/lib/typeorm/util/DateUtils.mjs +0 -216
- package/browser/esm2022/lib/typeorm/util/DepGraph.mjs +0 -222
- package/browser/esm2022/lib/typeorm/util/DirectoryExportedClassesLoader.mjs +0 -76
- package/browser/esm2022/lib/typeorm/util/ImportUtils.mjs +0 -86
- package/browser/esm2022/lib/typeorm/util/InstanceChecker.mjs +0 -114
- package/browser/esm2022/lib/typeorm/util/ObjectUtils.mjs +0 -38
- package/browser/esm2022/lib/typeorm/util/OrmUtils.mjs +0 -310
- package/browser/esm2022/lib/typeorm/util/PathUtils.mjs +0 -38
- package/browser/esm2022/lib/typeorm/util/RandomGenerator.mjs +0 -150
- package/browser/esm2022/lib/typeorm/util/StringUtils.mjs +0 -108
- package/browser/esm2022/lib/typeorm/util/TreeRepositoryUtils.mjs +0 -53
- package/browser/esm2022/lib/typeorm/util/VersionUtils.mjs +0 -17
- package/browser/esm2022/lib/typeorm/util/escapeRegExp.mjs +0 -4
- package/browser/esm2022/public-api.mjs +0 -2
- package/browser/esm2022/taon-typeorm.mjs +0 -5
- package/client/esm2022/lib/index.mjs +0 -4
- package/client/esm2022/lib/typeorm/cache/DbQueryResultCache.mjs +0 -251
- package/client/esm2022/lib/typeorm/cache/QueryResultCache.mjs +0 -4
- package/client/esm2022/lib/typeorm/cache/QueryResultCacheFactory.mjs +0 -33
- package/client/esm2022/lib/typeorm/cache/QueryResultCacheOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/cache/RedisQueryResultCache.mjs +0 -185
- package/client/esm2022/lib/typeorm/common/DeepPartial.mjs +0 -3
- package/client/esm2022/lib/typeorm/common/EntityTarget.mjs +0 -3
- package/client/esm2022/lib/typeorm/common/MixedList.mjs +0 -3
- package/client/esm2022/lib/typeorm/common/ObjectLiteral.mjs +0 -4
- package/client/esm2022/lib/typeorm/common/ObjectType.mjs +0 -3
- package/client/esm2022/lib/typeorm/common/RelationType.mjs +0 -3
- package/client/esm2022/lib/typeorm/connection/Connection.mjs +0 -13
- package/client/esm2022/lib/typeorm/connection/ConnectionManager.mjs +0 -57
- package/client/esm2022/lib/typeorm/connection/ConnectionMetadataBuilder.mjs +0 -63
- package/client/esm2022/lib/typeorm/connection/ConnectionOptions.mjs +0 -3
- package/client/esm2022/lib/typeorm/connection/ConnectionOptionsReader.mjs +0 -237
- package/client/esm2022/lib/typeorm/constants.mjs +0 -4
- package/client/esm2022/lib/typeorm/container.mjs +0 -57
- package/client/esm2022/lib/typeorm/data-source/BaseDataSourceOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/data-source/DataSource.mjs +0 -458
- package/client/esm2022/lib/typeorm/data-source/DataSourceOptions.mjs +0 -11
- package/client/esm2022/lib/typeorm/data-source/index.mjs +0 -4
- package/client/esm2022/lib/typeorm/decorator/Check.mjs +0 -25
- package/client/esm2022/lib/typeorm/decorator/EntityRepository.mjs +0 -19
- package/client/esm2022/lib/typeorm/decorator/Exclusion.mjs +0 -25
- package/client/esm2022/lib/typeorm/decorator/Generated.mjs +0 -22
- package/client/esm2022/lib/typeorm/decorator/Index.mjs +0 -52
- package/client/esm2022/lib/typeorm/decorator/Unique.mjs +0 -48
- package/client/esm2022/lib/typeorm/decorator/columns/Column.mjs +0 -67
- package/client/esm2022/lib/typeorm/decorator/columns/CreateDateColumn.mjs +0 -19
- package/client/esm2022/lib/typeorm/decorator/columns/DeleteDateColumn.mjs +0 -18
- package/client/esm2022/lib/typeorm/decorator/columns/ObjectIdColumn.mjs +0 -23
- package/client/esm2022/lib/typeorm/decorator/columns/PrimaryColumn.mjs +0 -54
- package/client/esm2022/lib/typeorm/decorator/columns/PrimaryGeneratedColumn.mjs +0 -52
- package/client/esm2022/lib/typeorm/decorator/columns/UpdateDateColumn.mjs +0 -18
- package/client/esm2022/lib/typeorm/decorator/columns/VersionColumn.mjs +0 -19
- package/client/esm2022/lib/typeorm/decorator/columns/ViewColumn.mjs +0 -17
- package/client/esm2022/lib/typeorm/decorator/columns/VirtualColumn.mjs +0 -41
- package/client/esm2022/lib/typeorm/decorator/entity/ChildEntity.mjs +0 -21
- package/client/esm2022/lib/typeorm/decorator/entity/Entity.mjs +0 -28
- package/client/esm2022/lib/typeorm/decorator/entity/TableInheritance.mjs +0 -20
- package/client/esm2022/lib/typeorm/decorator/entity-view/ViewEntity.mjs +0 -30
- package/client/esm2022/lib/typeorm/decorator/listeners/AfterInsert.mjs +0 -17
- package/client/esm2022/lib/typeorm/decorator/listeners/AfterLoad.mjs +0 -17
- package/client/esm2022/lib/typeorm/decorator/listeners/AfterRecover.mjs +0 -17
- package/client/esm2022/lib/typeorm/decorator/listeners/AfterRemove.mjs +0 -17
- package/client/esm2022/lib/typeorm/decorator/listeners/AfterSoftRemove.mjs +0 -17
- package/client/esm2022/lib/typeorm/decorator/listeners/AfterUpdate.mjs +0 -17
- package/client/esm2022/lib/typeorm/decorator/listeners/BeforeInsert.mjs +0 -17
- package/client/esm2022/lib/typeorm/decorator/listeners/BeforeRecover.mjs +0 -17
- package/client/esm2022/lib/typeorm/decorator/listeners/BeforeRemove.mjs +0 -17
- package/client/esm2022/lib/typeorm/decorator/listeners/BeforeSoftRemove.mjs +0 -17
- package/client/esm2022/lib/typeorm/decorator/listeners/BeforeUpdate.mjs +0 -17
- package/client/esm2022/lib/typeorm/decorator/listeners/EventSubscriber.mjs +0 -15
- package/client/esm2022/lib/typeorm/decorator/options/ColumnCommonOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/decorator/options/ColumnEmbeddedOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/decorator/options/ColumnEnumOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/decorator/options/ColumnHstoreOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/decorator/options/ColumnNumericOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/decorator/options/ColumnOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/decorator/options/ColumnWithLengthOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/decorator/options/ColumnWithWidthOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/decorator/options/EntityOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/decorator/options/IndexOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/decorator/options/JoinColumnOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/decorator/options/JoinTableMultipleColumnsOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/decorator/options/JoinTableOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/decorator/options/PrimaryGeneratedColumnIdentityOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/decorator/options/PrimaryGeneratedColumnNumericOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/decorator/options/PrimaryGeneratedColumnUUIDOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/decorator/options/RelationOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/decorator/options/SpatialColumnOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/decorator/options/UniqueOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/decorator/options/ValueTransformer.mjs +0 -4
- package/client/esm2022/lib/typeorm/decorator/options/ViewColumnOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/decorator/options/ViewEntityOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/decorator/options/VirtualColumnOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/decorator/relations/JoinColumn.mjs +0 -25
- package/client/esm2022/lib/typeorm/decorator/relations/JoinTable.mjs +0 -31
- package/client/esm2022/lib/typeorm/decorator/relations/ManyToMany.mjs +0 -40
- package/client/esm2022/lib/typeorm/decorator/relations/ManyToOne.mjs +0 -40
- package/client/esm2022/lib/typeorm/decorator/relations/OneToMany.mjs +0 -32
- package/client/esm2022/lib/typeorm/decorator/relations/OneToOne.mjs +0 -39
- package/client/esm2022/lib/typeorm/decorator/relations/RelationCount.mjs +0 -20
- package/client/esm2022/lib/typeorm/decorator/relations/RelationId.mjs +0 -20
- package/client/esm2022/lib/typeorm/decorator/tree/Tree.mjs +0 -19
- package/client/esm2022/lib/typeorm/decorator/tree/TreeChildren.mjs +0 -34
- package/client/esm2022/lib/typeorm/decorator/tree/TreeLevelColumn.mjs +0 -17
- package/client/esm2022/lib/typeorm/decorator/tree/TreeParent.mjs +0 -34
- package/client/esm2022/lib/typeorm/driver/Driver.mjs +0 -4
- package/client/esm2022/lib/typeorm/driver/DriverFactory.mjs +0 -99
- package/client/esm2022/lib/typeorm/driver/DriverUtils.mjs +0 -213
- package/client/esm2022/lib/typeorm/driver/Query.mjs +0 -13
- package/client/esm2022/lib/typeorm/driver/SqlInMemory.mjs +0 -12
- package/client/esm2022/lib/typeorm/driver/cordova/CordovaConnectionOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/driver/cordova/CordovaDriver.mjs +0 -63
- package/client/esm2022/lib/typeorm/driver/cordova/CordovaQueryRunner.mjs +0 -152
- package/client/esm2022/lib/typeorm/driver/mongodb/typings.mjs +0 -6516
- package/client/esm2022/lib/typeorm/driver/nativescript/NativescriptConnectionOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/driver/nativescript/NativescriptDriver.mjs +0 -82
- package/client/esm2022/lib/typeorm/driver/nativescript/NativescriptQueryRunner.mjs +0 -82
- package/client/esm2022/lib/typeorm/driver/react-native/ReactNativeConnectionOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/driver/react-native/ReactNativeDriver.mjs +0 -69
- package/client/esm2022/lib/typeorm/driver/react-native/ReactNativeQueryRunner.mjs +0 -81
- package/client/esm2022/lib/typeorm/driver/sqlite-abstract/AbstractSqliteDriver.mjs +0 -582
- package/client/esm2022/lib/typeorm/driver/sqlite-abstract/AbstractSqliteQueryRunner.mjs +0 -1421
- package/client/esm2022/lib/typeorm/driver/sqljs/SqljsConnectionOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/driver/sqljs/SqljsDriver.mjs +0 -249
- package/client/esm2022/lib/typeorm/driver/sqljs/SqljsQueryRunner.mjs +0 -107
- package/client/esm2022/lib/typeorm/driver/types/ColumnTypes.mjs +0 -3
- package/client/esm2022/lib/typeorm/driver/types/CteCapabilities.mjs +0 -4
- package/client/esm2022/lib/typeorm/driver/types/DataTypeDefaults.mjs +0 -4
- package/client/esm2022/lib/typeorm/driver/types/DatabaseType.mjs +0 -3
- package/client/esm2022/lib/typeorm/driver/types/IsolationLevel.mjs +0 -3
- package/client/esm2022/lib/typeorm/driver/types/MappedColumnTypes.mjs +0 -4
- package/client/esm2022/lib/typeorm/driver/types/MetadataTableType.mjs +0 -9
- package/client/esm2022/lib/typeorm/driver/types/ReplicationMode.mjs +0 -3
- package/client/esm2022/lib/typeorm/driver/types/UpsertType.mjs +0 -3
- package/client/esm2022/lib/typeorm/entity-manager/EntityManager.mjs +0 -743
- package/client/esm2022/lib/typeorm/entity-manager/EntityManagerFactory.mjs +0 -23
- package/client/esm2022/lib/typeorm/entity-manager/SqljsEntityManager.mjs +0 -35
- package/client/esm2022/lib/typeorm/entity-schema/EntitySchema.mjs +0 -12
- package/client/esm2022/lib/typeorm/entity-schema/EntitySchemaCheckOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/entity-schema/EntitySchemaColumnOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/entity-schema/EntitySchemaEmbeddedColumnOptions.mjs +0 -5
- package/client/esm2022/lib/typeorm/entity-schema/EntitySchemaEmbeddedError.mjs +0 -15
- package/client/esm2022/lib/typeorm/entity-schema/EntitySchemaExclusionOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/entity-schema/EntitySchemaIndexOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/entity-schema/EntitySchemaOptions.mjs +0 -8
- package/client/esm2022/lib/typeorm/entity-schema/EntitySchemaRelationIdOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/entity-schema/EntitySchemaRelationOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/entity-schema/EntitySchemaTransformer.mjs +0 -268
- package/client/esm2022/lib/typeorm/entity-schema/EntitySchemaUniqueOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/error/AlreadyHasActiveConnectionError.mjs +0 -13
- package/client/esm2022/lib/typeorm/error/CannotAttachTreeChildrenEntityError.mjs +0 -13
- package/client/esm2022/lib/typeorm/error/CannotConnectAlreadyConnectedError.mjs +0 -12
- package/client/esm2022/lib/typeorm/error/CannotCreateEntityIdMapError.mjs +0 -18
- package/client/esm2022/lib/typeorm/error/CannotDetermineEntityError.mjs +0 -13
- package/client/esm2022/lib/typeorm/error/CannotExecuteNotConnectedError.mjs +0 -12
- package/client/esm2022/lib/typeorm/error/CannotGetEntityManagerNotConnectedError.mjs +0 -12
- package/client/esm2022/lib/typeorm/error/CannotReflectMethodParameterTypeError.mjs +0 -15
- package/client/esm2022/lib/typeorm/error/CircularRelationsError.mjs +0 -13
- package/client/esm2022/lib/typeorm/error/ColumnTypeUndefinedError.mjs +0 -16
- package/client/esm2022/lib/typeorm/error/ConnectionIsNotSetError.mjs +0 -12
- package/client/esm2022/lib/typeorm/error/ConnectionNotFoundError.mjs +0 -12
- package/client/esm2022/lib/typeorm/error/CustomRepositoryCannotInheritRepositoryError.mjs +0 -15
- package/client/esm2022/lib/typeorm/error/CustomRepositoryDoesNotHaveEntityError.mjs +0 -15
- package/client/esm2022/lib/typeorm/error/CustomRepositoryNotFoundError.mjs +0 -15
- package/client/esm2022/lib/typeorm/error/DataTypeNotSupportedError.mjs +0 -11
- package/client/esm2022/lib/typeorm/error/DriverOptionNotSetError.mjs +0 -13
- package/client/esm2022/lib/typeorm/error/DriverPackageNotInstalledError.mjs +0 -13
- package/client/esm2022/lib/typeorm/error/EntityMetadataNotFoundError.mjs +0 -26
- package/client/esm2022/lib/typeorm/error/EntityNotFoundError.mjs +0 -37
- package/client/esm2022/lib/typeorm/error/EntityPropertyNotFoundError.mjs +0 -14
- package/client/esm2022/lib/typeorm/error/FindRelationsNotFoundError.mjs +0 -20
- package/client/esm2022/lib/typeorm/error/InitializedRelationError.mjs +0 -17
- package/client/esm2022/lib/typeorm/error/InsertValuesMissingError.mjs +0 -13
- package/client/esm2022/lib/typeorm/error/LimitOnUpdateNotSupportedError.mjs +0 -12
- package/client/esm2022/lib/typeorm/error/LockNotSupportedOnGivenDriverError.mjs +0 -12
- package/client/esm2022/lib/typeorm/error/MetadataAlreadyExistsError.mjs +0 -15
- package/client/esm2022/lib/typeorm/error/MetadataWithSuchNameAlreadyExistsError.mjs +0 -13
- package/client/esm2022/lib/typeorm/error/MissingDeleteDateColumnError.mjs +0 -9
- package/client/esm2022/lib/typeorm/error/MissingDriverError.mjs +0 -13
- package/client/esm2022/lib/typeorm/error/MissingJoinColumnError.mjs +0 -20
- package/client/esm2022/lib/typeorm/error/MissingJoinTableError.mjs +0 -20
- package/client/esm2022/lib/typeorm/error/MissingPrimaryColumnError.mjs +0 -10
- package/client/esm2022/lib/typeorm/error/MustBeEntityError.mjs +0 -12
- package/client/esm2022/lib/typeorm/error/NamingStrategyNotFoundError.mjs +0 -18
- package/client/esm2022/lib/typeorm/error/NestedSetMultipleRootError.mjs +0 -9
- package/client/esm2022/lib/typeorm/error/NoConnectionForRepositoryError.mjs +0 -13
- package/client/esm2022/lib/typeorm/error/NoConnectionOptionError.mjs +0 -13
- package/client/esm2022/lib/typeorm/error/NoNeedToReleaseEntityManagerError.mjs +0 -14
- package/client/esm2022/lib/typeorm/error/NoVersionOrUpdateDateColumnError.mjs +0 -12
- package/client/esm2022/lib/typeorm/error/OffsetWithoutLimitNotSupportedError.mjs +0 -14
- package/client/esm2022/lib/typeorm/error/OptimisticLockCanNotBeUsedError.mjs +0 -12
- package/client/esm2022/lib/typeorm/error/OptimisticLockVersionMismatchError.mjs +0 -12
- package/client/esm2022/lib/typeorm/error/PersistedEntityNotFoundError.mjs +0 -12
- package/client/esm2022/lib/typeorm/error/PessimisticLockTransactionRequiredError.mjs +0 -12
- package/client/esm2022/lib/typeorm/error/PrimaryColumnCannotBeNullableError.mjs +0 -10
- package/client/esm2022/lib/typeorm/error/QueryFailedError.mjs +0 -27
- package/client/esm2022/lib/typeorm/error/QueryRunnerAlreadyReleasedError.mjs +0 -9
- package/client/esm2022/lib/typeorm/error/QueryRunnerProviderAlreadyReleasedError.mjs +0 -13
- package/client/esm2022/lib/typeorm/error/RepositoryNotTreeError.mjs +0 -29
- package/client/esm2022/lib/typeorm/error/ReturningStatementNotSupportedError.mjs +0 -13
- package/client/esm2022/lib/typeorm/error/SubjectRemovedAndUpdatedError.mjs +0 -13
- package/client/esm2022/lib/typeorm/error/SubjectWithoutIdentifierError.mjs +0 -14
- package/client/esm2022/lib/typeorm/error/TransactionAlreadyStartedError.mjs +0 -12
- package/client/esm2022/lib/typeorm/error/TransactionNotStartedError.mjs +0 -12
- package/client/esm2022/lib/typeorm/error/TreeRepositoryNotSupportedError.mjs +0 -9
- package/client/esm2022/lib/typeorm/error/TypeORMError.mjs +0 -18
- package/client/esm2022/lib/typeorm/error/UpdateValuesMissingError.mjs +0 -9
- package/client/esm2022/lib/typeorm/error/UsingJoinColumnIsNotAllowedError.mjs +0 -10
- package/client/esm2022/lib/typeorm/error/UsingJoinColumnOnlyOnOneSideAllowedError.mjs +0 -11
- package/client/esm2022/lib/typeorm/error/UsingJoinTableIsNotAllowedError.mjs +0 -11
- package/client/esm2022/lib/typeorm/error/UsingJoinTableOnlyOnOneSideAllowedError.mjs +0 -11
- package/client/esm2022/lib/typeorm/error/index.mjs +0 -63
- package/client/esm2022/lib/typeorm/find-options/EqualOperator.mjs +0 -10
- package/client/esm2022/lib/typeorm/find-options/FindManyOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/find-options/FindOneOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/find-options/FindOperator.mjs +0 -74
- package/client/esm2022/lib/typeorm/find-options/FindOperatorType.mjs +0 -3
- package/client/esm2022/lib/typeorm/find-options/FindOptionsOrder.mjs +0 -3
- package/client/esm2022/lib/typeorm/find-options/FindOptionsRelations.mjs +0 -3
- package/client/esm2022/lib/typeorm/find-options/FindOptionsSelect.mjs +0 -5
- package/client/esm2022/lib/typeorm/find-options/FindOptionsUtils.mjs +0 -293
- package/client/esm2022/lib/typeorm/find-options/FindOptionsWhere.mjs +0 -3
- package/client/esm2022/lib/typeorm/find-options/FindTreeOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/find-options/JoinOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/find-options/OrderByCondition.mjs +0 -3
- package/client/esm2022/lib/typeorm/find-options/operator/Any.mjs +0 -11
- package/client/esm2022/lib/typeorm/find-options/operator/ArrayContainedBy.mjs +0 -11
- package/client/esm2022/lib/typeorm/find-options/operator/ArrayContains.mjs +0 -11
- package/client/esm2022/lib/typeorm/find-options/operator/ArrayOverlap.mjs +0 -11
- package/client/esm2022/lib/typeorm/find-options/operator/Between.mjs +0 -11
- package/client/esm2022/lib/typeorm/find-options/operator/Equal.mjs +0 -15
- package/client/esm2022/lib/typeorm/find-options/operator/ILike.mjs +0 -11
- package/client/esm2022/lib/typeorm/find-options/operator/In.mjs +0 -11
- package/client/esm2022/lib/typeorm/find-options/operator/IsNull.mjs +0 -11
- package/client/esm2022/lib/typeorm/find-options/operator/LessThan.mjs +0 -11
- package/client/esm2022/lib/typeorm/find-options/operator/LessThanOrEqual.mjs +0 -11
- package/client/esm2022/lib/typeorm/find-options/operator/Like.mjs +0 -11
- package/client/esm2022/lib/typeorm/find-options/operator/MoreThan.mjs +0 -11
- package/client/esm2022/lib/typeorm/find-options/operator/MoreThanOrEqual.mjs +0 -11
- package/client/esm2022/lib/typeorm/find-options/operator/Not.mjs +0 -12
- package/client/esm2022/lib/typeorm/find-options/operator/Raw.mjs +0 -10
- package/client/esm2022/lib/typeorm/globals.mjs +0 -165
- package/client/esm2022/lib/typeorm/index.mjs +0 -157
- package/client/esm2022/lib/typeorm/logger/AdvancedConsoleLogger.mjs +0 -109
- package/client/esm2022/lib/typeorm/logger/DebugLogger.mjs +0 -94
- package/client/esm2022/lib/typeorm/logger/Logger.mjs +0 -4
- package/client/esm2022/lib/typeorm/logger/LoggerFactory.mjs +0 -36
- package/client/esm2022/lib/typeorm/logger/LoggerOptions.mjs +0 -3
- package/client/esm2022/lib/typeorm/logger/SimpleConsoleLogger.mjs +0 -108
- package/client/esm2022/lib/typeorm/metadata/CheckMetadata.mjs +0 -26
- package/client/esm2022/lib/typeorm/metadata/ColumnMetadata.mjs +0 -553
- package/client/esm2022/lib/typeorm/metadata/EmbeddedMetadata.mjs +0 -206
- package/client/esm2022/lib/typeorm/metadata/EntityListenerMetadata.mjs +0 -52
- package/client/esm2022/lib/typeorm/metadata/EntityMetadata.mjs +0 -636
- package/client/esm2022/lib/typeorm/metadata/ExclusionMetadata.mjs +0 -26
- package/client/esm2022/lib/typeorm/metadata/ForeignKeyMetadata.mjs +0 -48
- package/client/esm2022/lib/typeorm/metadata/IndexMetadata.mjs +0 -131
- package/client/esm2022/lib/typeorm/metadata/RelationCountMetadata.mjs +0 -30
- package/client/esm2022/lib/typeorm/metadata/RelationIdMetadata.mjs +0 -50
- package/client/esm2022/lib/typeorm/metadata/RelationMetadata.mjs +0 -398
- package/client/esm2022/lib/typeorm/metadata/UniqueMetadata.mjs +0 -90
- package/client/esm2022/lib/typeorm/metadata/types/ClosureTreeOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/metadata/types/DeferrableType.mjs +0 -3
- package/client/esm2022/lib/typeorm/metadata/types/EventListenerTypes.mjs +0 -19
- package/client/esm2022/lib/typeorm/metadata/types/OnDeleteType.mjs +0 -3
- package/client/esm2022/lib/typeorm/metadata/types/OnUpdateType.mjs +0 -3
- package/client/esm2022/lib/typeorm/metadata/types/PropertyTypeInFunction.mjs +0 -3
- package/client/esm2022/lib/typeorm/metadata/types/RelationTypeInFunction.mjs +0 -3
- package/client/esm2022/lib/typeorm/metadata/types/RelationTypes.mjs +0 -3
- package/client/esm2022/lib/typeorm/metadata/types/TableTypes.mjs +0 -3
- package/client/esm2022/lib/typeorm/metadata/types/TreeTypes.mjs +0 -3
- package/client/esm2022/lib/typeorm/metadata-args/CheckMetadataArgs.mjs +0 -4
- package/client/esm2022/lib/typeorm/metadata-args/ColumnMetadataArgs.mjs +0 -4
- package/client/esm2022/lib/typeorm/metadata-args/DiscriminatorValueMetadataArgs.mjs +0 -4
- package/client/esm2022/lib/typeorm/metadata-args/EmbeddedMetadataArgs.mjs +0 -4
- package/client/esm2022/lib/typeorm/metadata-args/EntityListenerMetadataArgs.mjs +0 -4
- package/client/esm2022/lib/typeorm/metadata-args/EntityRepositoryMetadataArgs.mjs +0 -4
- package/client/esm2022/lib/typeorm/metadata-args/EntitySubscriberMetadataArgs.mjs +0 -4
- package/client/esm2022/lib/typeorm/metadata-args/ExclusionMetadataArgs.mjs +0 -4
- package/client/esm2022/lib/typeorm/metadata-args/GeneratedMetadataArgs.mjs +0 -4
- package/client/esm2022/lib/typeorm/metadata-args/IndexMetadataArgs.mjs +0 -4
- package/client/esm2022/lib/typeorm/metadata-args/InheritanceMetadataArgs.mjs +0 -4
- package/client/esm2022/lib/typeorm/metadata-args/JoinColumnMetadataArgs.mjs +0 -4
- package/client/esm2022/lib/typeorm/metadata-args/JoinTableMetadataArgs.mjs +0 -4
- package/client/esm2022/lib/typeorm/metadata-args/MetadataArgsStorage.mjs +0 -217
- package/client/esm2022/lib/typeorm/metadata-args/NamingStrategyMetadataArgs.mjs +0 -4
- package/client/esm2022/lib/typeorm/metadata-args/RelationCountMetadataArgs.mjs +0 -4
- package/client/esm2022/lib/typeorm/metadata-args/RelationIdMetadataArgs.mjs +0 -4
- package/client/esm2022/lib/typeorm/metadata-args/RelationMetadataArgs.mjs +0 -4
- package/client/esm2022/lib/typeorm/metadata-args/TableMetadataArgs.mjs +0 -4
- package/client/esm2022/lib/typeorm/metadata-args/TransactionEntityMetadataArgs.mjs +0 -4
- package/client/esm2022/lib/typeorm/metadata-args/TransactionRepositoryMetadataArgs.mjs +0 -4
- package/client/esm2022/lib/typeorm/metadata-args/TreeMetadataArgs.mjs +0 -4
- package/client/esm2022/lib/typeorm/metadata-args/UniqueMetadataArgs.mjs +0 -4
- package/client/esm2022/lib/typeorm/metadata-args/types/ColumnMode.mjs +0 -3
- package/client/esm2022/lib/typeorm/metadata-builder/ClosureJunctionEntityMetadataBuilder.mjs +0 -131
- package/client/esm2022/lib/typeorm/metadata-builder/EntityMetadataBuilder.mjs +0 -678
- package/client/esm2022/lib/typeorm/metadata-builder/EntityMetadataValidator.mjs +0 -183
- package/client/esm2022/lib/typeorm/metadata-builder/JunctionEntityMetadataBuilder.mjs +0 -262
- package/client/esm2022/lib/typeorm/metadata-builder/MetadataUtils.mjs +0 -41
- package/client/esm2022/lib/typeorm/metadata-builder/RelationJoinColumnBuilder.mjs +0 -167
- package/client/esm2022/lib/typeorm/migration/Migration.mjs +0 -14
- package/client/esm2022/lib/typeorm/migration/MigrationExecutor.mjs +0 -454
- package/client/esm2022/lib/typeorm/migration/MigrationInterface.mjs +0 -4
- package/client/esm2022/lib/typeorm/naming-strategy/DefaultNamingStrategy.mjs +0 -140
- package/client/esm2022/lib/typeorm/naming-strategy/NamingStrategyInterface.mjs +0 -4
- package/client/esm2022/lib/typeorm/persistence/EntityPersistExecutor.mjs +0 -125
- package/client/esm2022/lib/typeorm/persistence/Subject.mjs +0 -212
- package/client/esm2022/lib/typeorm/persistence/SubjectChangeMap.mjs +0 -4
- package/client/esm2022/lib/typeorm/persistence/SubjectChangedColumnsComputer.mjs +0 -164
- package/client/esm2022/lib/typeorm/persistence/SubjectDatabaseEntityLoader.mjs +0 -125
- package/client/esm2022/lib/typeorm/persistence/SubjectExecutor.mjs +0 -721
- package/client/esm2022/lib/typeorm/persistence/SubjectTopoligicalSorter.mjs +0 -151
- package/client/esm2022/lib/typeorm/persistence/subject-builder/CascadesSubjectBuilder.mjs +0 -84
- package/client/esm2022/lib/typeorm/persistence/subject-builder/ManyToManySubjectBuilder.mjs +0 -153
- package/client/esm2022/lib/typeorm/persistence/subject-builder/OneToManySubjectBuilder.mjs +0 -117
- package/client/esm2022/lib/typeorm/persistence/subject-builder/OneToOneInverseSideSubjectBuilder.mjs +0 -95
- package/client/esm2022/lib/typeorm/persistence/tree/ClosureSubjectExecutor.mjs +0 -220
- package/client/esm2022/lib/typeorm/persistence/tree/MaterializedPathSubjectExecutor.mjs +0 -97
- package/client/esm2022/lib/typeorm/persistence/tree/NestedSetSubjectExecutor.mjs +0 -250
- package/client/esm2022/lib/typeorm/platform/PlatformTools.mjs +0 -346
- package/client/esm2022/lib/typeorm/query-builder/Alias.mjs +0 -26
- package/client/esm2022/lib/typeorm/query-builder/Brackets.mjs +0 -16
- package/client/esm2022/lib/typeorm/query-builder/DeleteQueryBuilder.mjs +0 -181
- package/client/esm2022/lib/typeorm/query-builder/InsertOrUpdateOptions.mjs +0 -3
- package/client/esm2022/lib/typeorm/query-builder/InsertQueryBuilder.mjs +0 -651
- package/client/esm2022/lib/typeorm/query-builder/JoinAttribute.mjs +0 -153
- package/client/esm2022/lib/typeorm/query-builder/NotBrackets.mjs +0 -14
- package/client/esm2022/lib/typeorm/query-builder/QueryBuilder.mjs +0 -967
- package/client/esm2022/lib/typeorm/query-builder/QueryBuilderCte.mjs +0 -4
- package/client/esm2022/lib/typeorm/query-builder/QueryBuilderUtils.mjs +0 -22
- package/client/esm2022/lib/typeorm/query-builder/QueryExpressionMap.mjs +0 -309
- package/client/esm2022/lib/typeorm/query-builder/QueryPartialEntity.mjs +0 -3
- package/client/esm2022/lib/typeorm/query-builder/RelationIdLoader.mjs +0 -452
- package/client/esm2022/lib/typeorm/query-builder/RelationLoader.mjs +0 -262
- package/client/esm2022/lib/typeorm/query-builder/RelationQueryBuilder.mjs +0 -147
- package/client/esm2022/lib/typeorm/query-builder/RelationRemover.mjs +0 -130
- package/client/esm2022/lib/typeorm/query-builder/RelationUpdater.mjs +0 -141
- package/client/esm2022/lib/typeorm/query-builder/ReturningResultsEntityUpdator.mjs +0 -141
- package/client/esm2022/lib/typeorm/query-builder/SelectQuery.mjs +0 -4
- package/client/esm2022/lib/typeorm/query-builder/SelectQueryBuilder.mjs +0 -2278
- package/client/esm2022/lib/typeorm/query-builder/SelectQueryBuilderOption.mjs +0 -3
- package/client/esm2022/lib/typeorm/query-builder/SoftDeleteQueryBuilder.mjs +0 -348
- package/client/esm2022/lib/typeorm/query-builder/UpdateQueryBuilder.mjs +0 -510
- package/client/esm2022/lib/typeorm/query-builder/WhereClause.mjs +0 -3
- package/client/esm2022/lib/typeorm/query-builder/WhereExpressionBuilder.mjs +0 -4
- package/client/esm2022/lib/typeorm/query-builder/relation-count/RelationCountAttribute.mjs +0 -71
- package/client/esm2022/lib/typeorm/query-builder/relation-count/RelationCountLoadResult.mjs +0 -4
- package/client/esm2022/lib/typeorm/query-builder/relation-count/RelationCountLoader.mjs +0 -142
- package/client/esm2022/lib/typeorm/query-builder/relation-count/RelationCountMetadataToAttributeTransformer.mjs +0 -33
- package/client/esm2022/lib/typeorm/query-builder/relation-id/RelationIdAttribute.mjs +0 -79
- package/client/esm2022/lib/typeorm/query-builder/relation-id/RelationIdLoadResult.mjs +0 -4
- package/client/esm2022/lib/typeorm/query-builder/relation-id/RelationIdLoader.mjs +0 -247
- package/client/esm2022/lib/typeorm/query-builder/relation-id/RelationIdMetadataToAttributeTransformer.mjs +0 -33
- package/client/esm2022/lib/typeorm/query-builder/result/DeleteResult.mjs +0 -14
- package/client/esm2022/lib/typeorm/query-builder/result/InsertResult.mjs +0 -25
- package/client/esm2022/lib/typeorm/query-builder/result/UpdateResult.mjs +0 -25
- package/client/esm2022/lib/typeorm/query-builder/transformer/PlainObjectToDatabaseEntityTransformer.mjs +0 -101
- package/client/esm2022/lib/typeorm/query-builder/transformer/PlainObjectToNewEntityTransformer.mjs +0 -67
- package/client/esm2022/lib/typeorm/query-builder/transformer/RawSqlResultsToEntityTransformer.mjs +0 -366
- package/client/esm2022/lib/typeorm/query-runner/BaseQueryRunner.mjs +0 -392
- package/client/esm2022/lib/typeorm/query-runner/QueryResult.mjs +0 -14
- package/client/esm2022/lib/typeorm/query-runner/QueryRunner.mjs +0 -4
- package/client/esm2022/lib/typeorm/repository/AbstractRepository.mjs +0 -80
- package/client/esm2022/lib/typeorm/repository/BaseEntity.mjs +0 -283
- package/client/esm2022/lib/typeorm/repository/FindTreesOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/repository/RemoveOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/repository/Repository.mjs +0 -275
- package/client/esm2022/lib/typeorm/repository/SaveOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/repository/TreeRepository.mjs +0 -254
- package/client/esm2022/lib/typeorm/repository/UpsertOptions.mjs +0 -7
- package/client/esm2022/lib/typeorm/schema-builder/RdbmsSchemaBuilder.mjs +0 -770
- package/client/esm2022/lib/typeorm/schema-builder/SchemaBuilder.mjs +0 -4
- package/client/esm2022/lib/typeorm/schema-builder/options/TableCheckOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/schema-builder/options/TableColumnOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/schema-builder/options/TableExclusionOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/schema-builder/options/TableForeignKeyOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/schema-builder/options/TableIndexOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/schema-builder/options/TableOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/schema-builder/options/TableUniqueOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/schema-builder/options/ViewOptions.mjs +0 -4
- package/client/esm2022/lib/typeorm/schema-builder/table/Table.mjs +0 -274
- package/client/esm2022/lib/typeorm/schema-builder/table/TableCheck.mjs +0 -37
- package/client/esm2022/lib/typeorm/schema-builder/table/TableColumn.mjs +0 -108
- package/client/esm2022/lib/typeorm/schema-builder/table/TableExclusion.mjs +0 -31
- package/client/esm2022/lib/typeorm/schema-builder/table/TableForeignKey.mjs +0 -60
- package/client/esm2022/lib/typeorm/schema-builder/table/TableIndex.mjs +0 -53
- package/client/esm2022/lib/typeorm/schema-builder/table/TableUnique.mjs +0 -38
- package/client/esm2022/lib/typeorm/schema-builder/util/TableUtils.mjs +0 -38
- package/client/esm2022/lib/typeorm/schema-builder/util/ViewUtils.mjs +0 -24
- package/client/esm2022/lib/typeorm/schema-builder/view/View.mjs +0 -43
- package/client/esm2022/lib/typeorm/subscriber/Broadcaster.mjs +0 -596
- package/client/esm2022/lib/typeorm/subscriber/BroadcasterResult.mjs +0 -27
- package/client/esm2022/lib/typeorm/subscriber/EntitySubscriberInterface.mjs +0 -4
- package/client/esm2022/lib/typeorm/subscriber/event/InsertEvent.mjs +0 -4
- package/client/esm2022/lib/typeorm/subscriber/event/LoadEvent.mjs +0 -4
- package/client/esm2022/lib/typeorm/subscriber/event/RecoverEvent.mjs +0 -4
- package/client/esm2022/lib/typeorm/subscriber/event/RemoveEvent.mjs +0 -4
- package/client/esm2022/lib/typeorm/subscriber/event/SoftRemoveEvent.mjs +0 -4
- package/client/esm2022/lib/typeorm/subscriber/event/TransactionCommitEvent.mjs +0 -4
- package/client/esm2022/lib/typeorm/subscriber/event/TransactionRollbackEvent.mjs +0 -4
- package/client/esm2022/lib/typeorm/subscriber/event/TransactionStartEvent.mjs +0 -4
- package/client/esm2022/lib/typeorm/subscriber/event/UpdateEvent.mjs +0 -4
- package/client/esm2022/lib/typeorm/util/ApplyValueTransformers.mjs +0 -22
- package/client/esm2022/lib/typeorm/util/DateUtils.mjs +0 -216
- package/client/esm2022/lib/typeorm/util/DepGraph.mjs +0 -222
- package/client/esm2022/lib/typeorm/util/DirectoryExportedClassesLoader.mjs +0 -76
- package/client/esm2022/lib/typeorm/util/ImportUtils.mjs +0 -86
- package/client/esm2022/lib/typeorm/util/InstanceChecker.mjs +0 -114
- package/client/esm2022/lib/typeorm/util/ObjectUtils.mjs +0 -38
- package/client/esm2022/lib/typeorm/util/OrmUtils.mjs +0 -310
- package/client/esm2022/lib/typeorm/util/PathUtils.mjs +0 -38
- package/client/esm2022/lib/typeorm/util/RandomGenerator.mjs +0 -150
- package/client/esm2022/lib/typeorm/util/StringUtils.mjs +0 -108
- package/client/esm2022/lib/typeorm/util/TreeRepositoryUtils.mjs +0 -53
- package/client/esm2022/lib/typeorm/util/VersionUtils.mjs +0 -17
- package/client/esm2022/lib/typeorm/util/escapeRegExp.mjs +0 -4
- package/client/esm2022/public-api.mjs +0 -2
- package/client/esm2022/taon-typeorm.mjs +0 -5
- package/taon.jsonc +0 -10
- package/websql/esm2022/lib/index.mjs +0 -4
- package/websql/esm2022/lib/typeorm/cache/DbQueryResultCache.mjs +0 -251
- package/websql/esm2022/lib/typeorm/cache/QueryResultCache.mjs +0 -4
- package/websql/esm2022/lib/typeorm/cache/QueryResultCacheFactory.mjs +0 -33
- package/websql/esm2022/lib/typeorm/cache/QueryResultCacheOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/cache/RedisQueryResultCache.mjs +0 -185
- package/websql/esm2022/lib/typeorm/common/DeepPartial.mjs +0 -3
- package/websql/esm2022/lib/typeorm/common/EntityTarget.mjs +0 -3
- package/websql/esm2022/lib/typeorm/common/MixedList.mjs +0 -3
- package/websql/esm2022/lib/typeorm/common/ObjectLiteral.mjs +0 -4
- package/websql/esm2022/lib/typeorm/common/ObjectType.mjs +0 -3
- package/websql/esm2022/lib/typeorm/common/RelationType.mjs +0 -3
- package/websql/esm2022/lib/typeorm/connection/Connection.mjs +0 -13
- package/websql/esm2022/lib/typeorm/connection/ConnectionManager.mjs +0 -57
- package/websql/esm2022/lib/typeorm/connection/ConnectionMetadataBuilder.mjs +0 -63
- package/websql/esm2022/lib/typeorm/connection/ConnectionOptions.mjs +0 -3
- package/websql/esm2022/lib/typeorm/connection/ConnectionOptionsReader.mjs +0 -237
- package/websql/esm2022/lib/typeorm/constants.mjs +0 -4
- package/websql/esm2022/lib/typeorm/container.mjs +0 -57
- package/websql/esm2022/lib/typeorm/data-source/BaseDataSourceOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/data-source/DataSource.mjs +0 -458
- package/websql/esm2022/lib/typeorm/data-source/DataSourceOptions.mjs +0 -11
- package/websql/esm2022/lib/typeorm/data-source/index.mjs +0 -4
- package/websql/esm2022/lib/typeorm/decorator/Check.mjs +0 -25
- package/websql/esm2022/lib/typeorm/decorator/EntityRepository.mjs +0 -19
- package/websql/esm2022/lib/typeorm/decorator/Exclusion.mjs +0 -25
- package/websql/esm2022/lib/typeorm/decorator/Generated.mjs +0 -22
- package/websql/esm2022/lib/typeorm/decorator/Index.mjs +0 -52
- package/websql/esm2022/lib/typeorm/decorator/Unique.mjs +0 -48
- package/websql/esm2022/lib/typeorm/decorator/columns/Column.mjs +0 -67
- package/websql/esm2022/lib/typeorm/decorator/columns/CreateDateColumn.mjs +0 -19
- package/websql/esm2022/lib/typeorm/decorator/columns/DeleteDateColumn.mjs +0 -18
- package/websql/esm2022/lib/typeorm/decorator/columns/ObjectIdColumn.mjs +0 -23
- package/websql/esm2022/lib/typeorm/decorator/columns/PrimaryColumn.mjs +0 -54
- package/websql/esm2022/lib/typeorm/decorator/columns/PrimaryGeneratedColumn.mjs +0 -52
- package/websql/esm2022/lib/typeorm/decorator/columns/UpdateDateColumn.mjs +0 -18
- package/websql/esm2022/lib/typeorm/decorator/columns/VersionColumn.mjs +0 -19
- package/websql/esm2022/lib/typeorm/decorator/columns/ViewColumn.mjs +0 -17
- package/websql/esm2022/lib/typeorm/decorator/columns/VirtualColumn.mjs +0 -41
- package/websql/esm2022/lib/typeorm/decorator/entity/ChildEntity.mjs +0 -21
- package/websql/esm2022/lib/typeorm/decorator/entity/Entity.mjs +0 -28
- package/websql/esm2022/lib/typeorm/decorator/entity/TableInheritance.mjs +0 -20
- package/websql/esm2022/lib/typeorm/decorator/entity-view/ViewEntity.mjs +0 -30
- package/websql/esm2022/lib/typeorm/decorator/listeners/AfterInsert.mjs +0 -17
- package/websql/esm2022/lib/typeorm/decorator/listeners/AfterLoad.mjs +0 -17
- package/websql/esm2022/lib/typeorm/decorator/listeners/AfterRecover.mjs +0 -17
- package/websql/esm2022/lib/typeorm/decorator/listeners/AfterRemove.mjs +0 -17
- package/websql/esm2022/lib/typeorm/decorator/listeners/AfterSoftRemove.mjs +0 -17
- package/websql/esm2022/lib/typeorm/decorator/listeners/AfterUpdate.mjs +0 -17
- package/websql/esm2022/lib/typeorm/decorator/listeners/BeforeInsert.mjs +0 -17
- package/websql/esm2022/lib/typeorm/decorator/listeners/BeforeRecover.mjs +0 -17
- package/websql/esm2022/lib/typeorm/decorator/listeners/BeforeRemove.mjs +0 -17
- package/websql/esm2022/lib/typeorm/decorator/listeners/BeforeSoftRemove.mjs +0 -17
- package/websql/esm2022/lib/typeorm/decorator/listeners/BeforeUpdate.mjs +0 -17
- package/websql/esm2022/lib/typeorm/decorator/listeners/EventSubscriber.mjs +0 -15
- package/websql/esm2022/lib/typeorm/decorator/options/ColumnCommonOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/decorator/options/ColumnEmbeddedOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/decorator/options/ColumnEnumOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/decorator/options/ColumnHstoreOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/decorator/options/ColumnNumericOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/decorator/options/ColumnOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/decorator/options/ColumnWithLengthOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/decorator/options/ColumnWithWidthOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/decorator/options/EntityOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/decorator/options/IndexOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/decorator/options/JoinColumnOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/decorator/options/JoinTableMultipleColumnsOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/decorator/options/JoinTableOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/decorator/options/PrimaryGeneratedColumnIdentityOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/decorator/options/PrimaryGeneratedColumnNumericOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/decorator/options/PrimaryGeneratedColumnUUIDOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/decorator/options/RelationOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/decorator/options/SpatialColumnOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/decorator/options/UniqueOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/decorator/options/ValueTransformer.mjs +0 -4
- package/websql/esm2022/lib/typeorm/decorator/options/ViewColumnOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/decorator/options/ViewEntityOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/decorator/options/VirtualColumnOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/decorator/relations/JoinColumn.mjs +0 -25
- package/websql/esm2022/lib/typeorm/decorator/relations/JoinTable.mjs +0 -31
- package/websql/esm2022/lib/typeorm/decorator/relations/ManyToMany.mjs +0 -40
- package/websql/esm2022/lib/typeorm/decorator/relations/ManyToOne.mjs +0 -40
- package/websql/esm2022/lib/typeorm/decorator/relations/OneToMany.mjs +0 -32
- package/websql/esm2022/lib/typeorm/decorator/relations/OneToOne.mjs +0 -39
- package/websql/esm2022/lib/typeorm/decorator/relations/RelationCount.mjs +0 -20
- package/websql/esm2022/lib/typeorm/decorator/relations/RelationId.mjs +0 -20
- package/websql/esm2022/lib/typeorm/decorator/tree/Tree.mjs +0 -19
- package/websql/esm2022/lib/typeorm/decorator/tree/TreeChildren.mjs +0 -34
- package/websql/esm2022/lib/typeorm/decorator/tree/TreeLevelColumn.mjs +0 -17
- package/websql/esm2022/lib/typeorm/decorator/tree/TreeParent.mjs +0 -34
- package/websql/esm2022/lib/typeorm/driver/Driver.mjs +0 -4
- package/websql/esm2022/lib/typeorm/driver/DriverFactory.mjs +0 -99
- package/websql/esm2022/lib/typeorm/driver/DriverUtils.mjs +0 -213
- package/websql/esm2022/lib/typeorm/driver/Query.mjs +0 -13
- package/websql/esm2022/lib/typeorm/driver/SqlInMemory.mjs +0 -12
- package/websql/esm2022/lib/typeorm/driver/cordova/CordovaConnectionOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/driver/cordova/CordovaDriver.mjs +0 -63
- package/websql/esm2022/lib/typeorm/driver/cordova/CordovaQueryRunner.mjs +0 -152
- package/websql/esm2022/lib/typeorm/driver/mongodb/typings.mjs +0 -6516
- package/websql/esm2022/lib/typeorm/driver/nativescript/NativescriptConnectionOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/driver/nativescript/NativescriptDriver.mjs +0 -82
- package/websql/esm2022/lib/typeorm/driver/nativescript/NativescriptQueryRunner.mjs +0 -82
- package/websql/esm2022/lib/typeorm/driver/react-native/ReactNativeConnectionOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/driver/react-native/ReactNativeDriver.mjs +0 -69
- package/websql/esm2022/lib/typeorm/driver/react-native/ReactNativeQueryRunner.mjs +0 -81
- package/websql/esm2022/lib/typeorm/driver/sqlite-abstract/AbstractSqliteDriver.mjs +0 -582
- package/websql/esm2022/lib/typeorm/driver/sqlite-abstract/AbstractSqliteQueryRunner.mjs +0 -1421
- package/websql/esm2022/lib/typeorm/driver/sqljs/SqljsConnectionOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/driver/sqljs/SqljsDriver.mjs +0 -249
- package/websql/esm2022/lib/typeorm/driver/sqljs/SqljsQueryRunner.mjs +0 -107
- package/websql/esm2022/lib/typeorm/driver/types/ColumnTypes.mjs +0 -3
- package/websql/esm2022/lib/typeorm/driver/types/CteCapabilities.mjs +0 -4
- package/websql/esm2022/lib/typeorm/driver/types/DataTypeDefaults.mjs +0 -4
- package/websql/esm2022/lib/typeorm/driver/types/DatabaseType.mjs +0 -3
- package/websql/esm2022/lib/typeorm/driver/types/IsolationLevel.mjs +0 -3
- package/websql/esm2022/lib/typeorm/driver/types/MappedColumnTypes.mjs +0 -4
- package/websql/esm2022/lib/typeorm/driver/types/MetadataTableType.mjs +0 -9
- package/websql/esm2022/lib/typeorm/driver/types/ReplicationMode.mjs +0 -3
- package/websql/esm2022/lib/typeorm/driver/types/UpsertType.mjs +0 -3
- package/websql/esm2022/lib/typeorm/entity-manager/EntityManager.mjs +0 -743
- package/websql/esm2022/lib/typeorm/entity-manager/EntityManagerFactory.mjs +0 -23
- package/websql/esm2022/lib/typeorm/entity-manager/SqljsEntityManager.mjs +0 -35
- package/websql/esm2022/lib/typeorm/entity-schema/EntitySchema.mjs +0 -12
- package/websql/esm2022/lib/typeorm/entity-schema/EntitySchemaCheckOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/entity-schema/EntitySchemaColumnOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/entity-schema/EntitySchemaEmbeddedColumnOptions.mjs +0 -5
- package/websql/esm2022/lib/typeorm/entity-schema/EntitySchemaEmbeddedError.mjs +0 -15
- package/websql/esm2022/lib/typeorm/entity-schema/EntitySchemaExclusionOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/entity-schema/EntitySchemaIndexOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/entity-schema/EntitySchemaOptions.mjs +0 -8
- package/websql/esm2022/lib/typeorm/entity-schema/EntitySchemaRelationIdOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/entity-schema/EntitySchemaRelationOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/entity-schema/EntitySchemaTransformer.mjs +0 -268
- package/websql/esm2022/lib/typeorm/entity-schema/EntitySchemaUniqueOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/error/AlreadyHasActiveConnectionError.mjs +0 -13
- package/websql/esm2022/lib/typeorm/error/CannotAttachTreeChildrenEntityError.mjs +0 -13
- package/websql/esm2022/lib/typeorm/error/CannotConnectAlreadyConnectedError.mjs +0 -12
- package/websql/esm2022/lib/typeorm/error/CannotCreateEntityIdMapError.mjs +0 -18
- package/websql/esm2022/lib/typeorm/error/CannotDetermineEntityError.mjs +0 -13
- package/websql/esm2022/lib/typeorm/error/CannotExecuteNotConnectedError.mjs +0 -12
- package/websql/esm2022/lib/typeorm/error/CannotGetEntityManagerNotConnectedError.mjs +0 -12
- package/websql/esm2022/lib/typeorm/error/CannotReflectMethodParameterTypeError.mjs +0 -15
- package/websql/esm2022/lib/typeorm/error/CircularRelationsError.mjs +0 -13
- package/websql/esm2022/lib/typeorm/error/ColumnTypeUndefinedError.mjs +0 -16
- package/websql/esm2022/lib/typeorm/error/ConnectionIsNotSetError.mjs +0 -12
- package/websql/esm2022/lib/typeorm/error/ConnectionNotFoundError.mjs +0 -12
- package/websql/esm2022/lib/typeorm/error/CustomRepositoryCannotInheritRepositoryError.mjs +0 -15
- package/websql/esm2022/lib/typeorm/error/CustomRepositoryDoesNotHaveEntityError.mjs +0 -15
- package/websql/esm2022/lib/typeorm/error/CustomRepositoryNotFoundError.mjs +0 -15
- package/websql/esm2022/lib/typeorm/error/DataTypeNotSupportedError.mjs +0 -11
- package/websql/esm2022/lib/typeorm/error/DriverOptionNotSetError.mjs +0 -13
- package/websql/esm2022/lib/typeorm/error/DriverPackageNotInstalledError.mjs +0 -13
- package/websql/esm2022/lib/typeorm/error/EntityMetadataNotFoundError.mjs +0 -26
- package/websql/esm2022/lib/typeorm/error/EntityNotFoundError.mjs +0 -37
- package/websql/esm2022/lib/typeorm/error/EntityPropertyNotFoundError.mjs +0 -14
- package/websql/esm2022/lib/typeorm/error/FindRelationsNotFoundError.mjs +0 -20
- package/websql/esm2022/lib/typeorm/error/InitializedRelationError.mjs +0 -17
- package/websql/esm2022/lib/typeorm/error/InsertValuesMissingError.mjs +0 -13
- package/websql/esm2022/lib/typeorm/error/LimitOnUpdateNotSupportedError.mjs +0 -12
- package/websql/esm2022/lib/typeorm/error/LockNotSupportedOnGivenDriverError.mjs +0 -12
- package/websql/esm2022/lib/typeorm/error/MetadataAlreadyExistsError.mjs +0 -15
- package/websql/esm2022/lib/typeorm/error/MetadataWithSuchNameAlreadyExistsError.mjs +0 -13
- package/websql/esm2022/lib/typeorm/error/MissingDeleteDateColumnError.mjs +0 -9
- package/websql/esm2022/lib/typeorm/error/MissingDriverError.mjs +0 -13
- package/websql/esm2022/lib/typeorm/error/MissingJoinColumnError.mjs +0 -20
- package/websql/esm2022/lib/typeorm/error/MissingJoinTableError.mjs +0 -20
- package/websql/esm2022/lib/typeorm/error/MissingPrimaryColumnError.mjs +0 -10
- package/websql/esm2022/lib/typeorm/error/MustBeEntityError.mjs +0 -12
- package/websql/esm2022/lib/typeorm/error/NamingStrategyNotFoundError.mjs +0 -18
- package/websql/esm2022/lib/typeorm/error/NestedSetMultipleRootError.mjs +0 -9
- package/websql/esm2022/lib/typeorm/error/NoConnectionForRepositoryError.mjs +0 -13
- package/websql/esm2022/lib/typeorm/error/NoConnectionOptionError.mjs +0 -13
- package/websql/esm2022/lib/typeorm/error/NoNeedToReleaseEntityManagerError.mjs +0 -14
- package/websql/esm2022/lib/typeorm/error/NoVersionOrUpdateDateColumnError.mjs +0 -12
- package/websql/esm2022/lib/typeorm/error/OffsetWithoutLimitNotSupportedError.mjs +0 -14
- package/websql/esm2022/lib/typeorm/error/OptimisticLockCanNotBeUsedError.mjs +0 -12
- package/websql/esm2022/lib/typeorm/error/OptimisticLockVersionMismatchError.mjs +0 -12
- package/websql/esm2022/lib/typeorm/error/PersistedEntityNotFoundError.mjs +0 -12
- package/websql/esm2022/lib/typeorm/error/PessimisticLockTransactionRequiredError.mjs +0 -12
- package/websql/esm2022/lib/typeorm/error/PrimaryColumnCannotBeNullableError.mjs +0 -10
- package/websql/esm2022/lib/typeorm/error/QueryFailedError.mjs +0 -27
- package/websql/esm2022/lib/typeorm/error/QueryRunnerAlreadyReleasedError.mjs +0 -9
- package/websql/esm2022/lib/typeorm/error/QueryRunnerProviderAlreadyReleasedError.mjs +0 -13
- package/websql/esm2022/lib/typeorm/error/RepositoryNotTreeError.mjs +0 -29
- package/websql/esm2022/lib/typeorm/error/ReturningStatementNotSupportedError.mjs +0 -13
- package/websql/esm2022/lib/typeorm/error/SubjectRemovedAndUpdatedError.mjs +0 -13
- package/websql/esm2022/lib/typeorm/error/SubjectWithoutIdentifierError.mjs +0 -14
- package/websql/esm2022/lib/typeorm/error/TransactionAlreadyStartedError.mjs +0 -12
- package/websql/esm2022/lib/typeorm/error/TransactionNotStartedError.mjs +0 -12
- package/websql/esm2022/lib/typeorm/error/TreeRepositoryNotSupportedError.mjs +0 -9
- package/websql/esm2022/lib/typeorm/error/TypeORMError.mjs +0 -18
- package/websql/esm2022/lib/typeorm/error/UpdateValuesMissingError.mjs +0 -9
- package/websql/esm2022/lib/typeorm/error/UsingJoinColumnIsNotAllowedError.mjs +0 -10
- package/websql/esm2022/lib/typeorm/error/UsingJoinColumnOnlyOnOneSideAllowedError.mjs +0 -11
- package/websql/esm2022/lib/typeorm/error/UsingJoinTableIsNotAllowedError.mjs +0 -11
- package/websql/esm2022/lib/typeorm/error/UsingJoinTableOnlyOnOneSideAllowedError.mjs +0 -11
- package/websql/esm2022/lib/typeorm/error/index.mjs +0 -63
- package/websql/esm2022/lib/typeorm/find-options/EqualOperator.mjs +0 -10
- package/websql/esm2022/lib/typeorm/find-options/FindManyOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/find-options/FindOneOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/find-options/FindOperator.mjs +0 -74
- package/websql/esm2022/lib/typeorm/find-options/FindOperatorType.mjs +0 -3
- package/websql/esm2022/lib/typeorm/find-options/FindOptionsOrder.mjs +0 -3
- package/websql/esm2022/lib/typeorm/find-options/FindOptionsRelations.mjs +0 -3
- package/websql/esm2022/lib/typeorm/find-options/FindOptionsSelect.mjs +0 -5
- package/websql/esm2022/lib/typeorm/find-options/FindOptionsUtils.mjs +0 -293
- package/websql/esm2022/lib/typeorm/find-options/FindOptionsWhere.mjs +0 -3
- package/websql/esm2022/lib/typeorm/find-options/FindTreeOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/find-options/JoinOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/find-options/OrderByCondition.mjs +0 -3
- package/websql/esm2022/lib/typeorm/find-options/operator/Any.mjs +0 -11
- package/websql/esm2022/lib/typeorm/find-options/operator/ArrayContainedBy.mjs +0 -11
- package/websql/esm2022/lib/typeorm/find-options/operator/ArrayContains.mjs +0 -11
- package/websql/esm2022/lib/typeorm/find-options/operator/ArrayOverlap.mjs +0 -11
- package/websql/esm2022/lib/typeorm/find-options/operator/Between.mjs +0 -11
- package/websql/esm2022/lib/typeorm/find-options/operator/Equal.mjs +0 -15
- package/websql/esm2022/lib/typeorm/find-options/operator/ILike.mjs +0 -11
- package/websql/esm2022/lib/typeorm/find-options/operator/In.mjs +0 -11
- package/websql/esm2022/lib/typeorm/find-options/operator/IsNull.mjs +0 -11
- package/websql/esm2022/lib/typeorm/find-options/operator/LessThan.mjs +0 -11
- package/websql/esm2022/lib/typeorm/find-options/operator/LessThanOrEqual.mjs +0 -11
- package/websql/esm2022/lib/typeorm/find-options/operator/Like.mjs +0 -11
- package/websql/esm2022/lib/typeorm/find-options/operator/MoreThan.mjs +0 -11
- package/websql/esm2022/lib/typeorm/find-options/operator/MoreThanOrEqual.mjs +0 -11
- package/websql/esm2022/lib/typeorm/find-options/operator/Not.mjs +0 -12
- package/websql/esm2022/lib/typeorm/find-options/operator/Raw.mjs +0 -10
- package/websql/esm2022/lib/typeorm/globals.mjs +0 -165
- package/websql/esm2022/lib/typeorm/index.mjs +0 -157
- package/websql/esm2022/lib/typeorm/logger/AdvancedConsoleLogger.mjs +0 -109
- package/websql/esm2022/lib/typeorm/logger/DebugLogger.mjs +0 -94
- package/websql/esm2022/lib/typeorm/logger/Logger.mjs +0 -4
- package/websql/esm2022/lib/typeorm/logger/LoggerFactory.mjs +0 -36
- package/websql/esm2022/lib/typeorm/logger/LoggerOptions.mjs +0 -3
- package/websql/esm2022/lib/typeorm/logger/SimpleConsoleLogger.mjs +0 -108
- package/websql/esm2022/lib/typeorm/metadata/CheckMetadata.mjs +0 -26
- package/websql/esm2022/lib/typeorm/metadata/ColumnMetadata.mjs +0 -553
- package/websql/esm2022/lib/typeorm/metadata/EmbeddedMetadata.mjs +0 -206
- package/websql/esm2022/lib/typeorm/metadata/EntityListenerMetadata.mjs +0 -52
- package/websql/esm2022/lib/typeorm/metadata/EntityMetadata.mjs +0 -636
- package/websql/esm2022/lib/typeorm/metadata/ExclusionMetadata.mjs +0 -26
- package/websql/esm2022/lib/typeorm/metadata/ForeignKeyMetadata.mjs +0 -48
- package/websql/esm2022/lib/typeorm/metadata/IndexMetadata.mjs +0 -131
- package/websql/esm2022/lib/typeorm/metadata/RelationCountMetadata.mjs +0 -30
- package/websql/esm2022/lib/typeorm/metadata/RelationIdMetadata.mjs +0 -50
- package/websql/esm2022/lib/typeorm/metadata/RelationMetadata.mjs +0 -398
- package/websql/esm2022/lib/typeorm/metadata/UniqueMetadata.mjs +0 -90
- package/websql/esm2022/lib/typeorm/metadata/types/ClosureTreeOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/metadata/types/DeferrableType.mjs +0 -3
- package/websql/esm2022/lib/typeorm/metadata/types/EventListenerTypes.mjs +0 -19
- package/websql/esm2022/lib/typeorm/metadata/types/OnDeleteType.mjs +0 -3
- package/websql/esm2022/lib/typeorm/metadata/types/OnUpdateType.mjs +0 -3
- package/websql/esm2022/lib/typeorm/metadata/types/PropertyTypeInFunction.mjs +0 -3
- package/websql/esm2022/lib/typeorm/metadata/types/RelationTypeInFunction.mjs +0 -3
- package/websql/esm2022/lib/typeorm/metadata/types/RelationTypes.mjs +0 -3
- package/websql/esm2022/lib/typeorm/metadata/types/TableTypes.mjs +0 -3
- package/websql/esm2022/lib/typeorm/metadata/types/TreeTypes.mjs +0 -3
- package/websql/esm2022/lib/typeorm/metadata-args/CheckMetadataArgs.mjs +0 -4
- package/websql/esm2022/lib/typeorm/metadata-args/ColumnMetadataArgs.mjs +0 -4
- package/websql/esm2022/lib/typeorm/metadata-args/DiscriminatorValueMetadataArgs.mjs +0 -4
- package/websql/esm2022/lib/typeorm/metadata-args/EmbeddedMetadataArgs.mjs +0 -4
- package/websql/esm2022/lib/typeorm/metadata-args/EntityListenerMetadataArgs.mjs +0 -4
- package/websql/esm2022/lib/typeorm/metadata-args/EntityRepositoryMetadataArgs.mjs +0 -4
- package/websql/esm2022/lib/typeorm/metadata-args/EntitySubscriberMetadataArgs.mjs +0 -4
- package/websql/esm2022/lib/typeorm/metadata-args/ExclusionMetadataArgs.mjs +0 -4
- package/websql/esm2022/lib/typeorm/metadata-args/GeneratedMetadataArgs.mjs +0 -4
- package/websql/esm2022/lib/typeorm/metadata-args/IndexMetadataArgs.mjs +0 -4
- package/websql/esm2022/lib/typeorm/metadata-args/InheritanceMetadataArgs.mjs +0 -4
- package/websql/esm2022/lib/typeorm/metadata-args/JoinColumnMetadataArgs.mjs +0 -4
- package/websql/esm2022/lib/typeorm/metadata-args/JoinTableMetadataArgs.mjs +0 -4
- package/websql/esm2022/lib/typeorm/metadata-args/MetadataArgsStorage.mjs +0 -217
- package/websql/esm2022/lib/typeorm/metadata-args/NamingStrategyMetadataArgs.mjs +0 -4
- package/websql/esm2022/lib/typeorm/metadata-args/RelationCountMetadataArgs.mjs +0 -4
- package/websql/esm2022/lib/typeorm/metadata-args/RelationIdMetadataArgs.mjs +0 -4
- package/websql/esm2022/lib/typeorm/metadata-args/RelationMetadataArgs.mjs +0 -4
- package/websql/esm2022/lib/typeorm/metadata-args/TableMetadataArgs.mjs +0 -4
- package/websql/esm2022/lib/typeorm/metadata-args/TransactionEntityMetadataArgs.mjs +0 -4
- package/websql/esm2022/lib/typeorm/metadata-args/TransactionRepositoryMetadataArgs.mjs +0 -4
- package/websql/esm2022/lib/typeorm/metadata-args/TreeMetadataArgs.mjs +0 -4
- package/websql/esm2022/lib/typeorm/metadata-args/UniqueMetadataArgs.mjs +0 -4
- package/websql/esm2022/lib/typeorm/metadata-args/types/ColumnMode.mjs +0 -3
- package/websql/esm2022/lib/typeorm/metadata-builder/ClosureJunctionEntityMetadataBuilder.mjs +0 -131
- package/websql/esm2022/lib/typeorm/metadata-builder/EntityMetadataBuilder.mjs +0 -678
- package/websql/esm2022/lib/typeorm/metadata-builder/EntityMetadataValidator.mjs +0 -183
- package/websql/esm2022/lib/typeorm/metadata-builder/JunctionEntityMetadataBuilder.mjs +0 -262
- package/websql/esm2022/lib/typeorm/metadata-builder/MetadataUtils.mjs +0 -41
- package/websql/esm2022/lib/typeorm/metadata-builder/RelationJoinColumnBuilder.mjs +0 -167
- package/websql/esm2022/lib/typeorm/migration/Migration.mjs +0 -14
- package/websql/esm2022/lib/typeorm/migration/MigrationExecutor.mjs +0 -454
- package/websql/esm2022/lib/typeorm/migration/MigrationInterface.mjs +0 -4
- package/websql/esm2022/lib/typeorm/naming-strategy/DefaultNamingStrategy.mjs +0 -140
- package/websql/esm2022/lib/typeorm/naming-strategy/NamingStrategyInterface.mjs +0 -4
- package/websql/esm2022/lib/typeorm/persistence/EntityPersistExecutor.mjs +0 -125
- package/websql/esm2022/lib/typeorm/persistence/Subject.mjs +0 -212
- package/websql/esm2022/lib/typeorm/persistence/SubjectChangeMap.mjs +0 -4
- package/websql/esm2022/lib/typeorm/persistence/SubjectChangedColumnsComputer.mjs +0 -164
- package/websql/esm2022/lib/typeorm/persistence/SubjectDatabaseEntityLoader.mjs +0 -125
- package/websql/esm2022/lib/typeorm/persistence/SubjectExecutor.mjs +0 -721
- package/websql/esm2022/lib/typeorm/persistence/SubjectTopoligicalSorter.mjs +0 -151
- package/websql/esm2022/lib/typeorm/persistence/subject-builder/CascadesSubjectBuilder.mjs +0 -84
- package/websql/esm2022/lib/typeorm/persistence/subject-builder/ManyToManySubjectBuilder.mjs +0 -153
- package/websql/esm2022/lib/typeorm/persistence/subject-builder/OneToManySubjectBuilder.mjs +0 -117
- package/websql/esm2022/lib/typeorm/persistence/subject-builder/OneToOneInverseSideSubjectBuilder.mjs +0 -95
- package/websql/esm2022/lib/typeorm/persistence/tree/ClosureSubjectExecutor.mjs +0 -220
- package/websql/esm2022/lib/typeorm/persistence/tree/MaterializedPathSubjectExecutor.mjs +0 -97
- package/websql/esm2022/lib/typeorm/persistence/tree/NestedSetSubjectExecutor.mjs +0 -250
- package/websql/esm2022/lib/typeorm/platform/PlatformTools.mjs +0 -331
- package/websql/esm2022/lib/typeorm/query-builder/Alias.mjs +0 -26
- package/websql/esm2022/lib/typeorm/query-builder/Brackets.mjs +0 -16
- package/websql/esm2022/lib/typeorm/query-builder/DeleteQueryBuilder.mjs +0 -181
- package/websql/esm2022/lib/typeorm/query-builder/InsertOrUpdateOptions.mjs +0 -3
- package/websql/esm2022/lib/typeorm/query-builder/InsertQueryBuilder.mjs +0 -651
- package/websql/esm2022/lib/typeorm/query-builder/JoinAttribute.mjs +0 -153
- package/websql/esm2022/lib/typeorm/query-builder/NotBrackets.mjs +0 -14
- package/websql/esm2022/lib/typeorm/query-builder/QueryBuilder.mjs +0 -967
- package/websql/esm2022/lib/typeorm/query-builder/QueryBuilderCte.mjs +0 -4
- package/websql/esm2022/lib/typeorm/query-builder/QueryBuilderUtils.mjs +0 -22
- package/websql/esm2022/lib/typeorm/query-builder/QueryExpressionMap.mjs +0 -309
- package/websql/esm2022/lib/typeorm/query-builder/QueryPartialEntity.mjs +0 -3
- package/websql/esm2022/lib/typeorm/query-builder/RelationIdLoader.mjs +0 -452
- package/websql/esm2022/lib/typeorm/query-builder/RelationLoader.mjs +0 -262
- package/websql/esm2022/lib/typeorm/query-builder/RelationQueryBuilder.mjs +0 -147
- package/websql/esm2022/lib/typeorm/query-builder/RelationRemover.mjs +0 -130
- package/websql/esm2022/lib/typeorm/query-builder/RelationUpdater.mjs +0 -141
- package/websql/esm2022/lib/typeorm/query-builder/ReturningResultsEntityUpdator.mjs +0 -141
- package/websql/esm2022/lib/typeorm/query-builder/SelectQuery.mjs +0 -4
- package/websql/esm2022/lib/typeorm/query-builder/SelectQueryBuilder.mjs +0 -2278
- package/websql/esm2022/lib/typeorm/query-builder/SelectQueryBuilderOption.mjs +0 -3
- package/websql/esm2022/lib/typeorm/query-builder/SoftDeleteQueryBuilder.mjs +0 -348
- package/websql/esm2022/lib/typeorm/query-builder/UpdateQueryBuilder.mjs +0 -510
- package/websql/esm2022/lib/typeorm/query-builder/WhereClause.mjs +0 -3
- package/websql/esm2022/lib/typeorm/query-builder/WhereExpressionBuilder.mjs +0 -4
- package/websql/esm2022/lib/typeorm/query-builder/relation-count/RelationCountAttribute.mjs +0 -71
- package/websql/esm2022/lib/typeorm/query-builder/relation-count/RelationCountLoadResult.mjs +0 -4
- package/websql/esm2022/lib/typeorm/query-builder/relation-count/RelationCountLoader.mjs +0 -142
- package/websql/esm2022/lib/typeorm/query-builder/relation-count/RelationCountMetadataToAttributeTransformer.mjs +0 -33
- package/websql/esm2022/lib/typeorm/query-builder/relation-id/RelationIdAttribute.mjs +0 -79
- package/websql/esm2022/lib/typeorm/query-builder/relation-id/RelationIdLoadResult.mjs +0 -4
- package/websql/esm2022/lib/typeorm/query-builder/relation-id/RelationIdLoader.mjs +0 -247
- package/websql/esm2022/lib/typeorm/query-builder/relation-id/RelationIdMetadataToAttributeTransformer.mjs +0 -33
- package/websql/esm2022/lib/typeorm/query-builder/result/DeleteResult.mjs +0 -14
- package/websql/esm2022/lib/typeorm/query-builder/result/InsertResult.mjs +0 -25
- package/websql/esm2022/lib/typeorm/query-builder/result/UpdateResult.mjs +0 -25
- package/websql/esm2022/lib/typeorm/query-builder/transformer/PlainObjectToDatabaseEntityTransformer.mjs +0 -101
- package/websql/esm2022/lib/typeorm/query-builder/transformer/PlainObjectToNewEntityTransformer.mjs +0 -67
- package/websql/esm2022/lib/typeorm/query-builder/transformer/RawSqlResultsToEntityTransformer.mjs +0 -366
- package/websql/esm2022/lib/typeorm/query-runner/BaseQueryRunner.mjs +0 -392
- package/websql/esm2022/lib/typeorm/query-runner/QueryResult.mjs +0 -14
- package/websql/esm2022/lib/typeorm/query-runner/QueryRunner.mjs +0 -4
- package/websql/esm2022/lib/typeorm/repository/AbstractRepository.mjs +0 -80
- package/websql/esm2022/lib/typeorm/repository/BaseEntity.mjs +0 -283
- package/websql/esm2022/lib/typeorm/repository/FindTreesOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/repository/RemoveOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/repository/Repository.mjs +0 -275
- package/websql/esm2022/lib/typeorm/repository/SaveOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/repository/TreeRepository.mjs +0 -254
- package/websql/esm2022/lib/typeorm/repository/UpsertOptions.mjs +0 -7
- package/websql/esm2022/lib/typeorm/schema-builder/RdbmsSchemaBuilder.mjs +0 -770
- package/websql/esm2022/lib/typeorm/schema-builder/SchemaBuilder.mjs +0 -4
- package/websql/esm2022/lib/typeorm/schema-builder/options/TableCheckOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/schema-builder/options/TableColumnOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/schema-builder/options/TableExclusionOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/schema-builder/options/TableForeignKeyOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/schema-builder/options/TableIndexOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/schema-builder/options/TableOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/schema-builder/options/TableUniqueOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/schema-builder/options/ViewOptions.mjs +0 -4
- package/websql/esm2022/lib/typeorm/schema-builder/table/Table.mjs +0 -274
- package/websql/esm2022/lib/typeorm/schema-builder/table/TableCheck.mjs +0 -37
- package/websql/esm2022/lib/typeorm/schema-builder/table/TableColumn.mjs +0 -108
- package/websql/esm2022/lib/typeorm/schema-builder/table/TableExclusion.mjs +0 -31
- package/websql/esm2022/lib/typeorm/schema-builder/table/TableForeignKey.mjs +0 -60
- package/websql/esm2022/lib/typeorm/schema-builder/table/TableIndex.mjs +0 -53
- package/websql/esm2022/lib/typeorm/schema-builder/table/TableUnique.mjs +0 -38
- package/websql/esm2022/lib/typeorm/schema-builder/util/TableUtils.mjs +0 -38
- package/websql/esm2022/lib/typeorm/schema-builder/util/ViewUtils.mjs +0 -24
- package/websql/esm2022/lib/typeorm/schema-builder/view/View.mjs +0 -43
- package/websql/esm2022/lib/typeorm/subscriber/Broadcaster.mjs +0 -596
- package/websql/esm2022/lib/typeorm/subscriber/BroadcasterResult.mjs +0 -27
- package/websql/esm2022/lib/typeorm/subscriber/EntitySubscriberInterface.mjs +0 -4
- package/websql/esm2022/lib/typeorm/subscriber/event/InsertEvent.mjs +0 -4
- package/websql/esm2022/lib/typeorm/subscriber/event/LoadEvent.mjs +0 -4
- package/websql/esm2022/lib/typeorm/subscriber/event/RecoverEvent.mjs +0 -4
- package/websql/esm2022/lib/typeorm/subscriber/event/RemoveEvent.mjs +0 -4
- package/websql/esm2022/lib/typeorm/subscriber/event/SoftRemoveEvent.mjs +0 -4
- package/websql/esm2022/lib/typeorm/subscriber/event/TransactionCommitEvent.mjs +0 -4
- package/websql/esm2022/lib/typeorm/subscriber/event/TransactionRollbackEvent.mjs +0 -4
- package/websql/esm2022/lib/typeorm/subscriber/event/TransactionStartEvent.mjs +0 -4
- package/websql/esm2022/lib/typeorm/subscriber/event/UpdateEvent.mjs +0 -4
- package/websql/esm2022/lib/typeorm/util/ApplyValueTransformers.mjs +0 -22
- package/websql/esm2022/lib/typeorm/util/DateUtils.mjs +0 -216
- package/websql/esm2022/lib/typeorm/util/DepGraph.mjs +0 -222
- package/websql/esm2022/lib/typeorm/util/DirectoryExportedClassesLoader.mjs +0 -76
- package/websql/esm2022/lib/typeorm/util/ImportUtils.mjs +0 -86
- package/websql/esm2022/lib/typeorm/util/InstanceChecker.mjs +0 -114
- package/websql/esm2022/lib/typeorm/util/ObjectUtils.mjs +0 -38
- package/websql/esm2022/lib/typeorm/util/OrmUtils.mjs +0 -310
- package/websql/esm2022/lib/typeorm/util/PathUtils.mjs +0 -38
- package/websql/esm2022/lib/typeorm/util/RandomGenerator.mjs +0 -150
- package/websql/esm2022/lib/typeorm/util/StringUtils.mjs +0 -108
- package/websql/esm2022/lib/typeorm/util/TreeRepositoryUtils.mjs +0 -53
- package/websql/esm2022/lib/typeorm/util/VersionUtils.mjs +0 -17
- package/websql/esm2022/lib/typeorm/util/escapeRegExp.mjs +0 -4
- package/websql/esm2022/public-api.mjs +0 -2
- package/websql/esm2022/taon-typeorm.mjs +0 -5
|
@@ -1,2278 +0,0 @@
|
|
|
1
|
-
var SelectQueryBuilder_1;
|
|
2
|
-
import { __decorate } from "tslib";
|
|
3
|
-
import { RawSqlResultsToEntityTransformer } from "./transformer/RawSqlResultsToEntityTransformer";
|
|
4
|
-
import { PessimisticLockTransactionRequiredError } from "../error/PessimisticLockTransactionRequiredError";
|
|
5
|
-
import { NoVersionOrUpdateDateColumnError } from "../error/NoVersionOrUpdateDateColumnError";
|
|
6
|
-
import { OptimisticLockVersionMismatchError } from "../error/OptimisticLockVersionMismatchError";
|
|
7
|
-
import { OptimisticLockCanNotBeUsedError } from "../error/OptimisticLockCanNotBeUsedError";
|
|
8
|
-
import { JoinAttribute } from "./JoinAttribute";
|
|
9
|
-
import { RelationIdAttribute } from "./relation-id/RelationIdAttribute";
|
|
10
|
-
import { RelationCountAttribute } from "./relation-count/RelationCountAttribute";
|
|
11
|
-
import { RelationIdLoader } from "./relation-id/RelationIdLoader";
|
|
12
|
-
import { RelationIdMetadataToAttributeTransformer } from "./relation-id/RelationIdMetadataToAttributeTransformer";
|
|
13
|
-
import { RelationCountLoader } from "./relation-count/RelationCountLoader";
|
|
14
|
-
import { RelationCountMetadataToAttributeTransformer } from "./relation-count/RelationCountMetadataToAttributeTransformer";
|
|
15
|
-
import { QueryBuilder } from "./QueryBuilder";
|
|
16
|
-
/* */
|
|
17
|
-
/* */
|
|
18
|
-
import { LockNotSupportedOnGivenDriverError } from "../error/LockNotSupportedOnGivenDriverError";
|
|
19
|
-
import { OffsetWithoutLimitNotSupportedError } from "../error/OffsetWithoutLimitNotSupportedError";
|
|
20
|
-
import { ObjectUtils } from "../util/ObjectUtils";
|
|
21
|
-
import { DriverUtils } from "../driver/DriverUtils";
|
|
22
|
-
import { EntityNotFoundError } from "../error/EntityNotFoundError";
|
|
23
|
-
import { TypeORMError } from "../error";
|
|
24
|
-
import { FindOptionsUtils } from "../find-options/FindOptionsUtils";
|
|
25
|
-
import { ApplyValueTransformers } from "../util/ApplyValueTransformers";
|
|
26
|
-
import { OrmUtils } from "../util/OrmUtils";
|
|
27
|
-
import { EntityPropertyNotFoundError } from "../error/EntityPropertyNotFoundError";
|
|
28
|
-
/* */
|
|
29
|
-
/* */
|
|
30
|
-
import { InstanceChecker } from "../util/InstanceChecker";
|
|
31
|
-
import { CLASS } from "typescript-class-helpers/websql";
|
|
32
|
-
/**
|
|
33
|
-
* Allows to build complex sql queries in a fashion way and execute those queries.
|
|
34
|
-
*/
|
|
35
|
-
let SelectQueryBuilder = SelectQueryBuilder_1 = class SelectQueryBuilder extends QueryBuilder {
|
|
36
|
-
constructor() {
|
|
37
|
-
super(...arguments);
|
|
38
|
-
this["@instanceof"] = Symbol.for("SelectQueryBuilder");
|
|
39
|
-
this.findOptions = {};
|
|
40
|
-
this.selects = [];
|
|
41
|
-
this.joins = [];
|
|
42
|
-
this.conditions = "";
|
|
43
|
-
this.orderBys = [];
|
|
44
|
-
this.relationMetadatas = [];
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* Gets generated SQL query without parameters being replaced.
|
|
48
|
-
*/
|
|
49
|
-
getQuery() {
|
|
50
|
-
let sql = this.createComment();
|
|
51
|
-
sql += this.createCteExpression();
|
|
52
|
-
sql += this.createSelectExpression();
|
|
53
|
-
sql += this.createJoinExpression();
|
|
54
|
-
sql += this.createWhereExpression();
|
|
55
|
-
sql += this.createGroupByExpression();
|
|
56
|
-
sql += this.createHavingExpression();
|
|
57
|
-
sql += this.createOrderByExpression();
|
|
58
|
-
sql += this.createLimitOffsetExpression();
|
|
59
|
-
sql += this.createLockExpression();
|
|
60
|
-
sql = sql.trim();
|
|
61
|
-
if (this.expressionMap.subQuery)
|
|
62
|
-
sql = "(" + sql + ")";
|
|
63
|
-
return sql;
|
|
64
|
-
}
|
|
65
|
-
setFindOptions(findOptions) {
|
|
66
|
-
this.findOptions = findOptions;
|
|
67
|
-
this.applyFindOptions();
|
|
68
|
-
return this;
|
|
69
|
-
}
|
|
70
|
-
/**
|
|
71
|
-
* Creates a subquery - query that can be used inside other queries.
|
|
72
|
-
*/
|
|
73
|
-
subQuery() {
|
|
74
|
-
const qb = this.createQueryBuilder();
|
|
75
|
-
qb.expressionMap.subQuery = true;
|
|
76
|
-
qb.parentQueryBuilder = this;
|
|
77
|
-
return qb;
|
|
78
|
-
}
|
|
79
|
-
/**
|
|
80
|
-
* Creates SELECT query and selects given data.
|
|
81
|
-
* Replaces all previous selections if they exist.
|
|
82
|
-
*/
|
|
83
|
-
select(selection, selectionAliasName) {
|
|
84
|
-
this.expressionMap.queryType = "select";
|
|
85
|
-
if (Array.isArray(selection)) {
|
|
86
|
-
this.expressionMap.selects = selection.map((selection) => ({
|
|
87
|
-
selection: selection,
|
|
88
|
-
}));
|
|
89
|
-
}
|
|
90
|
-
else if (typeof selection === "function") {
|
|
91
|
-
const subQueryBuilder = selection(this.subQuery());
|
|
92
|
-
this.setParameters(subQueryBuilder.getParameters());
|
|
93
|
-
this.expressionMap.selects.push({
|
|
94
|
-
selection: subQueryBuilder.getQuery(),
|
|
95
|
-
aliasName: selectionAliasName,
|
|
96
|
-
});
|
|
97
|
-
}
|
|
98
|
-
else if (selection) {
|
|
99
|
-
this.expressionMap.selects = [
|
|
100
|
-
{ selection: selection, aliasName: selectionAliasName },
|
|
101
|
-
];
|
|
102
|
-
}
|
|
103
|
-
return this;
|
|
104
|
-
}
|
|
105
|
-
/**
|
|
106
|
-
* Adds new selection to the SELECT query.
|
|
107
|
-
*/
|
|
108
|
-
addSelect(selection, selectionAliasName) {
|
|
109
|
-
if (!selection)
|
|
110
|
-
return this;
|
|
111
|
-
if (Array.isArray(selection)) {
|
|
112
|
-
this.expressionMap.selects = this.expressionMap.selects.concat(selection.map((selection) => ({ selection: selection })));
|
|
113
|
-
}
|
|
114
|
-
else if (typeof selection === "function") {
|
|
115
|
-
const subQueryBuilder = selection(this.subQuery());
|
|
116
|
-
this.setParameters(subQueryBuilder.getParameters());
|
|
117
|
-
this.expressionMap.selects.push({
|
|
118
|
-
selection: subQueryBuilder.getQuery(),
|
|
119
|
-
aliasName: selectionAliasName,
|
|
120
|
-
});
|
|
121
|
-
}
|
|
122
|
-
else if (selection) {
|
|
123
|
-
this.expressionMap.selects.push({
|
|
124
|
-
selection: selection,
|
|
125
|
-
aliasName: selectionAliasName,
|
|
126
|
-
});
|
|
127
|
-
}
|
|
128
|
-
return this;
|
|
129
|
-
}
|
|
130
|
-
/**
|
|
131
|
-
* Set max execution time.
|
|
132
|
-
* @param milliseconds
|
|
133
|
-
*/
|
|
134
|
-
maxExecutionTime(milliseconds) {
|
|
135
|
-
this.expressionMap.maxExecutionTime = milliseconds;
|
|
136
|
-
return this;
|
|
137
|
-
}
|
|
138
|
-
/**
|
|
139
|
-
* Sets whether the selection is DISTINCT.
|
|
140
|
-
*/
|
|
141
|
-
distinct(distinct = true) {
|
|
142
|
-
this.expressionMap.selectDistinct = distinct;
|
|
143
|
-
return this;
|
|
144
|
-
}
|
|
145
|
-
/**
|
|
146
|
-
* Sets the distinct on clause for Postgres.
|
|
147
|
-
*/
|
|
148
|
-
distinctOn(distinctOn) {
|
|
149
|
-
this.expressionMap.selectDistinctOn = distinctOn;
|
|
150
|
-
return this;
|
|
151
|
-
}
|
|
152
|
-
/**
|
|
153
|
-
* Specifies FROM which entity's table select/update/delete will be executed.
|
|
154
|
-
* Also sets a main string alias of the selection data.
|
|
155
|
-
* Removes all previously set from-s.
|
|
156
|
-
*/
|
|
157
|
-
from(entityTarget, aliasName) {
|
|
158
|
-
const mainAlias = this.createFromAlias(entityTarget, aliasName);
|
|
159
|
-
this.expressionMap.setMainAlias(mainAlias);
|
|
160
|
-
return this;
|
|
161
|
-
}
|
|
162
|
-
/**
|
|
163
|
-
* Specifies FROM which entity's table select/update/delete will be executed.
|
|
164
|
-
* Also sets a main string alias of the selection data.
|
|
165
|
-
*/
|
|
166
|
-
addFrom(entityTarget, aliasName) {
|
|
167
|
-
const alias = this.createFromAlias(entityTarget, aliasName);
|
|
168
|
-
if (!this.expressionMap.mainAlias)
|
|
169
|
-
this.expressionMap.setMainAlias(alias);
|
|
170
|
-
return this;
|
|
171
|
-
}
|
|
172
|
-
/**
|
|
173
|
-
* INNER JOINs (without selection).
|
|
174
|
-
* You also need to specify an alias of the joined data.
|
|
175
|
-
* Optionally, you can add condition and parameters used in condition.
|
|
176
|
-
*/
|
|
177
|
-
innerJoin(entityOrProperty, alias, condition, parameters) {
|
|
178
|
-
this.join("INNER", entityOrProperty, alias, condition, parameters);
|
|
179
|
-
return this;
|
|
180
|
-
}
|
|
181
|
-
/**
|
|
182
|
-
* LEFT JOINs (without selection).
|
|
183
|
-
* You also need to specify an alias of the joined data.
|
|
184
|
-
* Optionally, you can add condition and parameters used in condition.
|
|
185
|
-
*/
|
|
186
|
-
leftJoin(entityOrProperty, alias, condition, parameters) {
|
|
187
|
-
this.join("LEFT", entityOrProperty, alias, condition, parameters);
|
|
188
|
-
return this;
|
|
189
|
-
}
|
|
190
|
-
/**
|
|
191
|
-
* INNER JOINs and adds all selection properties to SELECT.
|
|
192
|
-
* You also need to specify an alias of the joined data.
|
|
193
|
-
* Optionally, you can add condition and parameters used in condition.
|
|
194
|
-
*/
|
|
195
|
-
innerJoinAndSelect(entityOrProperty, alias, condition, parameters) {
|
|
196
|
-
this.addSelect(alias);
|
|
197
|
-
this.innerJoin(entityOrProperty, alias, condition, parameters);
|
|
198
|
-
return this;
|
|
199
|
-
}
|
|
200
|
-
/**
|
|
201
|
-
* LEFT JOINs and adds all selection properties to SELECT.
|
|
202
|
-
* You also need to specify an alias of the joined data.
|
|
203
|
-
* Optionally, you can add condition and parameters used in condition.
|
|
204
|
-
*/
|
|
205
|
-
leftJoinAndSelect(entityOrProperty, alias, condition, parameters) {
|
|
206
|
-
this.addSelect(alias);
|
|
207
|
-
this.leftJoin(entityOrProperty, alias, condition, parameters);
|
|
208
|
-
return this;
|
|
209
|
-
}
|
|
210
|
-
/**
|
|
211
|
-
* INNER JOINs, SELECTs the data returned by a join and MAPs all that data to some entity's property.
|
|
212
|
-
* This is extremely useful when you want to select some data and map it to some virtual property.
|
|
213
|
-
* It will assume that there are multiple rows of selecting data, and mapped result will be an array.
|
|
214
|
-
* You also need to specify an alias of the joined data.
|
|
215
|
-
* Optionally, you can add condition and parameters used in condition.
|
|
216
|
-
*/
|
|
217
|
-
innerJoinAndMapMany(mapToProperty, entityOrProperty, alias, condition, parameters) {
|
|
218
|
-
this.addSelect(alias);
|
|
219
|
-
this.join("INNER", entityOrProperty, alias, condition, parameters, mapToProperty, true);
|
|
220
|
-
return this;
|
|
221
|
-
}
|
|
222
|
-
/**
|
|
223
|
-
* INNER JOINs, SELECTs the data returned by a join and MAPs all that data to some entity's property.
|
|
224
|
-
* This is extremely useful when you want to select some data and map it to some virtual property.
|
|
225
|
-
* It will assume that there is a single row of selecting data, and mapped result will be a single selected value.
|
|
226
|
-
* You also need to specify an alias of the joined data.
|
|
227
|
-
* Optionally, you can add condition and parameters used in condition.
|
|
228
|
-
*/
|
|
229
|
-
innerJoinAndMapOne(mapToProperty, entityOrProperty, alias, condition, parameters) {
|
|
230
|
-
this.addSelect(alias);
|
|
231
|
-
this.join("INNER", entityOrProperty, alias, condition, parameters, mapToProperty, false);
|
|
232
|
-
return this;
|
|
233
|
-
}
|
|
234
|
-
/**
|
|
235
|
-
* LEFT JOINs, SELECTs the data returned by a join and MAPs all that data to some entity's property.
|
|
236
|
-
* This is extremely useful when you want to select some data and map it to some virtual property.
|
|
237
|
-
* It will assume that there are multiple rows of selecting data, and mapped result will be an array.
|
|
238
|
-
* You also need to specify an alias of the joined data.
|
|
239
|
-
* Optionally, you can add condition and parameters used in condition.
|
|
240
|
-
*/
|
|
241
|
-
leftJoinAndMapMany(mapToProperty, entityOrProperty, alias, condition, parameters) {
|
|
242
|
-
this.addSelect(alias);
|
|
243
|
-
this.join("LEFT", entityOrProperty, alias, condition, parameters, mapToProperty, true);
|
|
244
|
-
return this;
|
|
245
|
-
}
|
|
246
|
-
/**
|
|
247
|
-
* LEFT JOINs, SELECTs the data returned by a join and MAPs all that data to some entity's property.
|
|
248
|
-
* This is extremely useful when you want to select some data and map it to some virtual property.
|
|
249
|
-
* It will assume that there is a single row of selecting data, and mapped result will be a single selected value.
|
|
250
|
-
* You also need to specify an alias of the joined data.
|
|
251
|
-
* Optionally, you can add condition and parameters used in condition.
|
|
252
|
-
*/
|
|
253
|
-
leftJoinAndMapOne(mapToProperty, entityOrProperty, alias, condition, parameters) {
|
|
254
|
-
this.addSelect(alias);
|
|
255
|
-
this.join("LEFT", entityOrProperty, alias, condition, parameters, mapToProperty, false);
|
|
256
|
-
return this;
|
|
257
|
-
}
|
|
258
|
-
/**
|
|
259
|
-
* LEFT JOINs relation id and maps it into some entity's property.
|
|
260
|
-
* Optionally, you can add condition and parameters used in condition.
|
|
261
|
-
*/
|
|
262
|
-
loadRelationIdAndMap(mapToProperty, relationName, aliasNameOrOptions, queryBuilderFactory) {
|
|
263
|
-
const relationIdAttribute = new RelationIdAttribute(this.expressionMap);
|
|
264
|
-
relationIdAttribute.mapToProperty = mapToProperty;
|
|
265
|
-
relationIdAttribute.relationName = relationName;
|
|
266
|
-
if (typeof aliasNameOrOptions === "string")
|
|
267
|
-
relationIdAttribute.alias = aliasNameOrOptions;
|
|
268
|
-
if (typeof aliasNameOrOptions === "object" &&
|
|
269
|
-
aliasNameOrOptions.disableMixedMap)
|
|
270
|
-
relationIdAttribute.disableMixedMap = true;
|
|
271
|
-
relationIdAttribute.queryBuilderFactory = queryBuilderFactory;
|
|
272
|
-
this.expressionMap.relationIdAttributes.push(relationIdAttribute);
|
|
273
|
-
if (relationIdAttribute.relation.junctionEntityMetadata) {
|
|
274
|
-
this.expressionMap.createAlias({
|
|
275
|
-
type: "other",
|
|
276
|
-
name: relationIdAttribute.junctionAlias,
|
|
277
|
-
metadata: relationIdAttribute.relation.junctionEntityMetadata,
|
|
278
|
-
});
|
|
279
|
-
}
|
|
280
|
-
return this;
|
|
281
|
-
}
|
|
282
|
-
/**
|
|
283
|
-
* Counts number of entities of entity's relation and maps the value into some entity's property.
|
|
284
|
-
* Optionally, you can add condition and parameters used in condition.
|
|
285
|
-
*/
|
|
286
|
-
loadRelationCountAndMap(mapToProperty, relationName, aliasName, queryBuilderFactory) {
|
|
287
|
-
const relationCountAttribute = new RelationCountAttribute(this.expressionMap);
|
|
288
|
-
relationCountAttribute.mapToProperty = mapToProperty;
|
|
289
|
-
relationCountAttribute.relationName = relationName;
|
|
290
|
-
relationCountAttribute.alias = aliasName;
|
|
291
|
-
relationCountAttribute.queryBuilderFactory = queryBuilderFactory;
|
|
292
|
-
this.expressionMap.relationCountAttributes.push(relationCountAttribute);
|
|
293
|
-
this.expressionMap.createAlias({
|
|
294
|
-
type: "other",
|
|
295
|
-
name: relationCountAttribute.junctionAlias,
|
|
296
|
-
});
|
|
297
|
-
if (relationCountAttribute.relation.junctionEntityMetadata) {
|
|
298
|
-
this.expressionMap.createAlias({
|
|
299
|
-
type: "other",
|
|
300
|
-
name: relationCountAttribute.junctionAlias,
|
|
301
|
-
metadata: relationCountAttribute.relation.junctionEntityMetadata,
|
|
302
|
-
});
|
|
303
|
-
}
|
|
304
|
-
return this;
|
|
305
|
-
}
|
|
306
|
-
/**
|
|
307
|
-
* Loads all relation ids for all relations of the selected entity.
|
|
308
|
-
* All relation ids will be mapped to relation property themself.
|
|
309
|
-
* If array of strings is given then loads only relation ids of the given properties.
|
|
310
|
-
*/
|
|
311
|
-
loadAllRelationIds(options) {
|
|
312
|
-
this.expressionMap.mainAlias.metadata.relations.forEach((relation) => {
|
|
313
|
-
if (options !== undefined &&
|
|
314
|
-
options.relations !== undefined &&
|
|
315
|
-
options.relations.indexOf(relation.propertyPath) === -1)
|
|
316
|
-
return;
|
|
317
|
-
this.loadRelationIdAndMap(this.expressionMap.mainAlias.name +
|
|
318
|
-
"." +
|
|
319
|
-
relation.propertyPath, this.expressionMap.mainAlias.name +
|
|
320
|
-
"." +
|
|
321
|
-
relation.propertyPath, options);
|
|
322
|
-
});
|
|
323
|
-
return this;
|
|
324
|
-
}
|
|
325
|
-
/**
|
|
326
|
-
* Sets WHERE condition in the query builder.
|
|
327
|
-
* If you had previously WHERE expression defined,
|
|
328
|
-
* calling this function will override previously set WHERE conditions.
|
|
329
|
-
* Additionally you can add parameters used in where expression.
|
|
330
|
-
*/
|
|
331
|
-
where(where, parameters) {
|
|
332
|
-
this.expressionMap.wheres = []; // don't move this block below since computeWhereParameter can add where expressions
|
|
333
|
-
const condition = this.getWhereCondition(where);
|
|
334
|
-
if (condition)
|
|
335
|
-
this.expressionMap.wheres = [
|
|
336
|
-
{ type: "simple", condition: condition },
|
|
337
|
-
];
|
|
338
|
-
if (parameters)
|
|
339
|
-
this.setParameters(parameters);
|
|
340
|
-
return this;
|
|
341
|
-
}
|
|
342
|
-
/**
|
|
343
|
-
* Adds new AND WHERE condition in the query builder.
|
|
344
|
-
* Additionally you can add parameters used in where expression.
|
|
345
|
-
*/
|
|
346
|
-
andWhere(where, parameters) {
|
|
347
|
-
this.expressionMap.wheres.push({
|
|
348
|
-
type: "and",
|
|
349
|
-
condition: this.getWhereCondition(where),
|
|
350
|
-
});
|
|
351
|
-
if (parameters)
|
|
352
|
-
this.setParameters(parameters);
|
|
353
|
-
return this;
|
|
354
|
-
}
|
|
355
|
-
/**
|
|
356
|
-
* Adds new OR WHERE condition in the query builder.
|
|
357
|
-
* Additionally you can add parameters used in where expression.
|
|
358
|
-
*/
|
|
359
|
-
orWhere(where, parameters) {
|
|
360
|
-
this.expressionMap.wheres.push({
|
|
361
|
-
type: "or",
|
|
362
|
-
condition: this.getWhereCondition(where),
|
|
363
|
-
});
|
|
364
|
-
if (parameters)
|
|
365
|
-
this.setParameters(parameters);
|
|
366
|
-
return this;
|
|
367
|
-
}
|
|
368
|
-
/**
|
|
369
|
-
* Adds new AND WHERE with conditions for the given ids.
|
|
370
|
-
*
|
|
371
|
-
* Ids are mixed.
|
|
372
|
-
* It means if you have single primary key you can pass a simple id values, for example [1, 2, 3].
|
|
373
|
-
* If you have multiple primary keys you need to pass object with property names and values specified,
|
|
374
|
-
* for example [{ firstId: 1, secondId: 2 }, { firstId: 2, secondId: 3 }, ...]
|
|
375
|
-
*/
|
|
376
|
-
whereInIds(ids) {
|
|
377
|
-
return this.where(this.getWhereInIdsCondition(ids));
|
|
378
|
-
}
|
|
379
|
-
/**
|
|
380
|
-
* Adds new AND WHERE with conditions for the given ids.
|
|
381
|
-
*
|
|
382
|
-
* Ids are mixed.
|
|
383
|
-
* It means if you have single primary key you can pass a simple id values, for example [1, 2, 3].
|
|
384
|
-
* If you have multiple primary keys you need to pass object with property names and values specified,
|
|
385
|
-
* for example [{ firstId: 1, secondId: 2 }, { firstId: 2, secondId: 3 }, ...]
|
|
386
|
-
*/
|
|
387
|
-
andWhereInIds(ids) {
|
|
388
|
-
return this.andWhere(this.getWhereInIdsCondition(ids));
|
|
389
|
-
}
|
|
390
|
-
/**
|
|
391
|
-
* Adds new OR WHERE with conditions for the given ids.
|
|
392
|
-
*
|
|
393
|
-
* Ids are mixed.
|
|
394
|
-
* It means if you have single primary key you can pass a simple id values, for example [1, 2, 3].
|
|
395
|
-
* If you have multiple primary keys you need to pass object with property names and values specified,
|
|
396
|
-
* for example [{ firstId: 1, secondId: 2 }, { firstId: 2, secondId: 3 }, ...]
|
|
397
|
-
*/
|
|
398
|
-
orWhereInIds(ids) {
|
|
399
|
-
return this.orWhere(this.getWhereInIdsCondition(ids));
|
|
400
|
-
}
|
|
401
|
-
/**
|
|
402
|
-
* Sets HAVING condition in the query builder.
|
|
403
|
-
* If you had previously HAVING expression defined,
|
|
404
|
-
* calling this function will override previously set HAVING conditions.
|
|
405
|
-
* Additionally you can add parameters used in where expression.
|
|
406
|
-
*/
|
|
407
|
-
having(having, parameters) {
|
|
408
|
-
this.expressionMap.havings.push({ type: "simple", condition: having });
|
|
409
|
-
if (parameters)
|
|
410
|
-
this.setParameters(parameters);
|
|
411
|
-
return this;
|
|
412
|
-
}
|
|
413
|
-
/**
|
|
414
|
-
* Adds new AND HAVING condition in the query builder.
|
|
415
|
-
* Additionally you can add parameters used in where expression.
|
|
416
|
-
*/
|
|
417
|
-
andHaving(having, parameters) {
|
|
418
|
-
this.expressionMap.havings.push({ type: "and", condition: having });
|
|
419
|
-
if (parameters)
|
|
420
|
-
this.setParameters(parameters);
|
|
421
|
-
return this;
|
|
422
|
-
}
|
|
423
|
-
/**
|
|
424
|
-
* Adds new OR HAVING condition in the query builder.
|
|
425
|
-
* Additionally you can add parameters used in where expression.
|
|
426
|
-
*/
|
|
427
|
-
orHaving(having, parameters) {
|
|
428
|
-
this.expressionMap.havings.push({ type: "or", condition: having });
|
|
429
|
-
if (parameters)
|
|
430
|
-
this.setParameters(parameters);
|
|
431
|
-
return this;
|
|
432
|
-
}
|
|
433
|
-
/**
|
|
434
|
-
* Sets GROUP BY condition in the query builder.
|
|
435
|
-
* If you had previously GROUP BY expression defined,
|
|
436
|
-
* calling this function will override previously set GROUP BY conditions.
|
|
437
|
-
*/
|
|
438
|
-
groupBy(groupBy) {
|
|
439
|
-
if (groupBy) {
|
|
440
|
-
this.expressionMap.groupBys = [groupBy];
|
|
441
|
-
}
|
|
442
|
-
else {
|
|
443
|
-
this.expressionMap.groupBys = [];
|
|
444
|
-
}
|
|
445
|
-
return this;
|
|
446
|
-
}
|
|
447
|
-
/**
|
|
448
|
-
* Adds GROUP BY condition in the query builder.
|
|
449
|
-
*/
|
|
450
|
-
addGroupBy(groupBy) {
|
|
451
|
-
this.expressionMap.groupBys.push(groupBy);
|
|
452
|
-
return this;
|
|
453
|
-
}
|
|
454
|
-
/**
|
|
455
|
-
* Sets ORDER BY condition in the query builder.
|
|
456
|
-
* If you had previously ORDER BY expression defined,
|
|
457
|
-
* calling this function will override previously set ORDER BY conditions.
|
|
458
|
-
*/
|
|
459
|
-
orderBy(sort, order = "ASC", nulls) {
|
|
460
|
-
if (order !== undefined && order !== "ASC" && order !== "DESC")
|
|
461
|
-
throw new TypeORMError(`SelectQueryBuilder.addOrderBy "order" can accept only "ASC" and "DESC" values.`);
|
|
462
|
-
if (nulls !== undefined &&
|
|
463
|
-
nulls !== "NULLS FIRST" &&
|
|
464
|
-
nulls !== "NULLS LAST")
|
|
465
|
-
throw new TypeORMError(`SelectQueryBuilder.addOrderBy "nulls" can accept only "NULLS FIRST" and "NULLS LAST" values.`);
|
|
466
|
-
if (sort) {
|
|
467
|
-
if (typeof sort === "object") {
|
|
468
|
-
this.expressionMap.orderBys = sort;
|
|
469
|
-
}
|
|
470
|
-
else {
|
|
471
|
-
if (nulls) {
|
|
472
|
-
this.expressionMap.orderBys = {
|
|
473
|
-
[sort]: { order, nulls },
|
|
474
|
-
};
|
|
475
|
-
}
|
|
476
|
-
else {
|
|
477
|
-
this.expressionMap.orderBys = { [sort]: order };
|
|
478
|
-
}
|
|
479
|
-
}
|
|
480
|
-
}
|
|
481
|
-
else {
|
|
482
|
-
this.expressionMap.orderBys = {};
|
|
483
|
-
}
|
|
484
|
-
return this;
|
|
485
|
-
}
|
|
486
|
-
/**
|
|
487
|
-
* Adds ORDER BY condition in the query builder.
|
|
488
|
-
*/
|
|
489
|
-
addOrderBy(sort, order = "ASC", nulls) {
|
|
490
|
-
if (order !== undefined && order !== "ASC" && order !== "DESC")
|
|
491
|
-
throw new TypeORMError(`SelectQueryBuilder.addOrderBy "order" can accept only "ASC" and "DESC" values.`);
|
|
492
|
-
if (nulls !== undefined &&
|
|
493
|
-
nulls !== "NULLS FIRST" &&
|
|
494
|
-
nulls !== "NULLS LAST")
|
|
495
|
-
throw new TypeORMError(`SelectQueryBuilder.addOrderBy "nulls" can accept only "NULLS FIRST" and "NULLS LAST" values.`);
|
|
496
|
-
if (nulls) {
|
|
497
|
-
this.expressionMap.orderBys[sort] = { order, nulls };
|
|
498
|
-
}
|
|
499
|
-
else {
|
|
500
|
-
this.expressionMap.orderBys[sort] = order;
|
|
501
|
-
}
|
|
502
|
-
return this;
|
|
503
|
-
}
|
|
504
|
-
/**
|
|
505
|
-
* Set's LIMIT - maximum number of rows to be selected.
|
|
506
|
-
* NOTE that it may not work as you expect if you are using joins.
|
|
507
|
-
* If you want to implement pagination, and you are having join in your query,
|
|
508
|
-
* then use instead take method instead.
|
|
509
|
-
*/
|
|
510
|
-
limit(limit) {
|
|
511
|
-
this.expressionMap.limit = this.normalizeNumber(limit);
|
|
512
|
-
if (this.expressionMap.limit !== undefined &&
|
|
513
|
-
isNaN(this.expressionMap.limit))
|
|
514
|
-
throw new TypeORMError(`Provided "limit" value is not a number. Please provide a numeric value.`);
|
|
515
|
-
return this;
|
|
516
|
-
}
|
|
517
|
-
/**
|
|
518
|
-
* Set's OFFSET - selection offset.
|
|
519
|
-
* NOTE that it may not work as you expect if you are using joins.
|
|
520
|
-
* If you want to implement pagination, and you are having join in your query,
|
|
521
|
-
* then use instead skip method instead.
|
|
522
|
-
*/
|
|
523
|
-
offset(offset) {
|
|
524
|
-
this.expressionMap.offset = this.normalizeNumber(offset);
|
|
525
|
-
if (this.expressionMap.offset !== undefined &&
|
|
526
|
-
isNaN(this.expressionMap.offset))
|
|
527
|
-
throw new TypeORMError(`Provided "offset" value is not a number. Please provide a numeric value.`);
|
|
528
|
-
return this;
|
|
529
|
-
}
|
|
530
|
-
/**
|
|
531
|
-
* Sets maximal number of entities to take.
|
|
532
|
-
*/
|
|
533
|
-
take(take) {
|
|
534
|
-
this.expressionMap.take = this.normalizeNumber(take);
|
|
535
|
-
if (this.expressionMap.take !== undefined &&
|
|
536
|
-
isNaN(this.expressionMap.take))
|
|
537
|
-
throw new TypeORMError(`Provided "take" value is not a number. Please provide a numeric value.`);
|
|
538
|
-
return this;
|
|
539
|
-
}
|
|
540
|
-
/**
|
|
541
|
-
* Sets number of entities to skip.
|
|
542
|
-
*/
|
|
543
|
-
skip(skip) {
|
|
544
|
-
this.expressionMap.skip = this.normalizeNumber(skip);
|
|
545
|
-
if (this.expressionMap.skip !== undefined &&
|
|
546
|
-
isNaN(this.expressionMap.skip))
|
|
547
|
-
throw new TypeORMError(`Provided "skip" value is not a number. Please provide a numeric value.`);
|
|
548
|
-
return this;
|
|
549
|
-
}
|
|
550
|
-
/**
|
|
551
|
-
* Set certain index to be used by the query.
|
|
552
|
-
*
|
|
553
|
-
* @param index Name of index to be used.
|
|
554
|
-
*/
|
|
555
|
-
useIndex(index) {
|
|
556
|
-
this.expressionMap.useIndex = index;
|
|
557
|
-
return this;
|
|
558
|
-
}
|
|
559
|
-
/**
|
|
560
|
-
* Sets locking mode.
|
|
561
|
-
*/
|
|
562
|
-
setLock(lockMode, lockVersion, lockTables) {
|
|
563
|
-
this.expressionMap.lockMode = lockMode;
|
|
564
|
-
this.expressionMap.lockVersion = lockVersion;
|
|
565
|
-
this.expressionMap.lockTables = lockTables;
|
|
566
|
-
return this;
|
|
567
|
-
}
|
|
568
|
-
/**
|
|
569
|
-
* Sets lock handling by adding NO WAIT or SKIP LOCKED.
|
|
570
|
-
*/
|
|
571
|
-
setOnLocked(onLocked) {
|
|
572
|
-
this.expressionMap.onLocked = onLocked;
|
|
573
|
-
return this;
|
|
574
|
-
}
|
|
575
|
-
/**
|
|
576
|
-
* Disables the global condition of "non-deleted" for the entity with delete date columns.
|
|
577
|
-
*/
|
|
578
|
-
withDeleted() {
|
|
579
|
-
this.expressionMap.withDeleted = true;
|
|
580
|
-
return this;
|
|
581
|
-
}
|
|
582
|
-
/**
|
|
583
|
-
* Gets first raw result returned by execution of generated query builder sql.
|
|
584
|
-
*/
|
|
585
|
-
async getRawOne() {
|
|
586
|
-
return (await this.getRawMany())[0];
|
|
587
|
-
}
|
|
588
|
-
/**
|
|
589
|
-
* Gets all raw results returned by execution of generated query builder sql.
|
|
590
|
-
*/
|
|
591
|
-
async getRawMany() {
|
|
592
|
-
if (this.expressionMap.lockMode === "optimistic")
|
|
593
|
-
throw new OptimisticLockCanNotBeUsedError();
|
|
594
|
-
this.expressionMap.queryEntity = false;
|
|
595
|
-
const queryRunner = this.obtainQueryRunner();
|
|
596
|
-
let transactionStartedByUs = false;
|
|
597
|
-
try {
|
|
598
|
-
if (this.expressionMap.useTransaction === true &&
|
|
599
|
-
queryRunner.isTransactionActive === false) {
|
|
600
|
-
await queryRunner.startTransaction();
|
|
601
|
-
transactionStartedByUs = true;
|
|
602
|
-
}
|
|
603
|
-
const results = await this.loadRawResults(queryRunner);
|
|
604
|
-
if (transactionStartedByUs) {
|
|
605
|
-
await queryRunner.commitTransaction();
|
|
606
|
-
}
|
|
607
|
-
return results;
|
|
608
|
-
}
|
|
609
|
-
catch (error) {
|
|
610
|
-
if (transactionStartedByUs) {
|
|
611
|
-
try {
|
|
612
|
-
await queryRunner.rollbackTransaction();
|
|
613
|
-
}
|
|
614
|
-
catch (rollbackError) { }
|
|
615
|
-
}
|
|
616
|
-
throw error;
|
|
617
|
-
}
|
|
618
|
-
finally {
|
|
619
|
-
if (queryRunner !== this.queryRunner) {
|
|
620
|
-
await queryRunner.release();
|
|
621
|
-
}
|
|
622
|
-
}
|
|
623
|
-
}
|
|
624
|
-
/**
|
|
625
|
-
* Executes sql generated by query builder and returns object with raw results and entities created from them.
|
|
626
|
-
*/
|
|
627
|
-
async getRawAndEntities() {
|
|
628
|
-
const queryRunner = this.obtainQueryRunner();
|
|
629
|
-
let transactionStartedByUs = false;
|
|
630
|
-
try {
|
|
631
|
-
if (this.expressionMap.useTransaction === true &&
|
|
632
|
-
queryRunner.isTransactionActive === false) {
|
|
633
|
-
await queryRunner.startTransaction();
|
|
634
|
-
transactionStartedByUs = true;
|
|
635
|
-
}
|
|
636
|
-
this.expressionMap.queryEntity = true;
|
|
637
|
-
const results = await this.executeEntitiesAndRawResults(queryRunner);
|
|
638
|
-
if (transactionStartedByUs) {
|
|
639
|
-
await queryRunner.commitTransaction();
|
|
640
|
-
}
|
|
641
|
-
return results;
|
|
642
|
-
}
|
|
643
|
-
catch (error) {
|
|
644
|
-
if (transactionStartedByUs) {
|
|
645
|
-
try {
|
|
646
|
-
await queryRunner.rollbackTransaction();
|
|
647
|
-
}
|
|
648
|
-
catch (rollbackError) { }
|
|
649
|
-
}
|
|
650
|
-
throw error;
|
|
651
|
-
}
|
|
652
|
-
finally {
|
|
653
|
-
if (queryRunner !== this.queryRunner)
|
|
654
|
-
await queryRunner.release();
|
|
655
|
-
}
|
|
656
|
-
}
|
|
657
|
-
/**
|
|
658
|
-
* Gets single entity returned by execution of generated query builder sql.
|
|
659
|
-
*/
|
|
660
|
-
async getOne() {
|
|
661
|
-
const results = await this.getRawAndEntities();
|
|
662
|
-
const result = results.entities[0];
|
|
663
|
-
if (result &&
|
|
664
|
-
this.expressionMap.lockMode === "optimistic" &&
|
|
665
|
-
this.expressionMap.lockVersion) {
|
|
666
|
-
const metadata = this.expressionMap.mainAlias.metadata;
|
|
667
|
-
if (this.expressionMap.lockVersion instanceof Date) {
|
|
668
|
-
const actualVersion = metadata.updateDateColumn.getEntityValue(result); // what if columns arent set?
|
|
669
|
-
if (actualVersion.getTime() !==
|
|
670
|
-
this.expressionMap.lockVersion.getTime())
|
|
671
|
-
throw new OptimisticLockVersionMismatchError(metadata.name, this.expressionMap.lockVersion, actualVersion);
|
|
672
|
-
}
|
|
673
|
-
else {
|
|
674
|
-
const actualVersion = metadata.versionColumn.getEntityValue(result); // what if columns arent set?
|
|
675
|
-
if (actualVersion !== this.expressionMap.lockVersion)
|
|
676
|
-
throw new OptimisticLockVersionMismatchError(metadata.name, this.expressionMap.lockVersion, actualVersion);
|
|
677
|
-
}
|
|
678
|
-
}
|
|
679
|
-
if (result === undefined) {
|
|
680
|
-
return null;
|
|
681
|
-
}
|
|
682
|
-
return result;
|
|
683
|
-
}
|
|
684
|
-
/**
|
|
685
|
-
* Gets the first entity returned by execution of generated query builder sql or rejects the returned promise on error.
|
|
686
|
-
*/
|
|
687
|
-
async getOneOrFail() {
|
|
688
|
-
const entity = await this.getOne();
|
|
689
|
-
if (!entity) {
|
|
690
|
-
throw new EntityNotFoundError(this.expressionMap.mainAlias.target, this);
|
|
691
|
-
}
|
|
692
|
-
return entity;
|
|
693
|
-
}
|
|
694
|
-
/**
|
|
695
|
-
* Gets entities returned by execution of generated query builder sql.
|
|
696
|
-
*/
|
|
697
|
-
async getMany() {
|
|
698
|
-
if (this.expressionMap.lockMode === "optimistic")
|
|
699
|
-
throw new OptimisticLockCanNotBeUsedError();
|
|
700
|
-
const results = await this.getRawAndEntities();
|
|
701
|
-
return results.entities;
|
|
702
|
-
}
|
|
703
|
-
/**
|
|
704
|
-
* Gets count - number of entities selected by sql generated by this query builder.
|
|
705
|
-
* Count excludes all limitations set by setFirstResult and setMaxResults methods call.
|
|
706
|
-
*/
|
|
707
|
-
async getCount() {
|
|
708
|
-
if (this.expressionMap.lockMode === "optimistic")
|
|
709
|
-
throw new OptimisticLockCanNotBeUsedError();
|
|
710
|
-
const queryRunner = this.obtainQueryRunner();
|
|
711
|
-
let transactionStartedByUs = false;
|
|
712
|
-
try {
|
|
713
|
-
if (this.expressionMap.useTransaction === true &&
|
|
714
|
-
queryRunner.isTransactionActive === false) {
|
|
715
|
-
await queryRunner.startTransaction();
|
|
716
|
-
transactionStartedByUs = true;
|
|
717
|
-
}
|
|
718
|
-
this.expressionMap.queryEntity = false;
|
|
719
|
-
const results = await this.executeCountQuery(queryRunner);
|
|
720
|
-
if (transactionStartedByUs) {
|
|
721
|
-
await queryRunner.commitTransaction();
|
|
722
|
-
}
|
|
723
|
-
return results;
|
|
724
|
-
}
|
|
725
|
-
catch (error) {
|
|
726
|
-
if (transactionStartedByUs) {
|
|
727
|
-
try {
|
|
728
|
-
await queryRunner.rollbackTransaction();
|
|
729
|
-
}
|
|
730
|
-
catch (rollbackError) { }
|
|
731
|
-
}
|
|
732
|
-
throw error;
|
|
733
|
-
}
|
|
734
|
-
finally {
|
|
735
|
-
if (queryRunner !== this.queryRunner)
|
|
736
|
-
await queryRunner.release();
|
|
737
|
-
}
|
|
738
|
-
}
|
|
739
|
-
/**
|
|
740
|
-
* Executes built SQL query and returns entities and overall entities count (without limitation).
|
|
741
|
-
* This method is useful to build pagination.
|
|
742
|
-
*/
|
|
743
|
-
async getManyAndCount() {
|
|
744
|
-
if (this.expressionMap.lockMode === "optimistic")
|
|
745
|
-
throw new OptimisticLockCanNotBeUsedError();
|
|
746
|
-
const queryRunner = this.obtainQueryRunner();
|
|
747
|
-
let transactionStartedByUs = false;
|
|
748
|
-
try {
|
|
749
|
-
if (this.expressionMap.useTransaction === true &&
|
|
750
|
-
queryRunner.isTransactionActive === false) {
|
|
751
|
-
await queryRunner.startTransaction();
|
|
752
|
-
transactionStartedByUs = true;
|
|
753
|
-
}
|
|
754
|
-
this.expressionMap.queryEntity = true;
|
|
755
|
-
const entitiesAndRaw = await this.executeEntitiesAndRawResults(queryRunner);
|
|
756
|
-
this.expressionMap.queryEntity = false;
|
|
757
|
-
const cacheId = this.expressionMap.cacheId;
|
|
758
|
-
this.expressionMap.cacheId = cacheId ? `${cacheId}-count` : cacheId;
|
|
759
|
-
const count = await this.executeCountQuery(queryRunner);
|
|
760
|
-
const results = [entitiesAndRaw.entities, count];
|
|
761
|
-
if (transactionStartedByUs) {
|
|
762
|
-
await queryRunner.commitTransaction();
|
|
763
|
-
}
|
|
764
|
-
return results;
|
|
765
|
-
}
|
|
766
|
-
catch (error) {
|
|
767
|
-
if (transactionStartedByUs) {
|
|
768
|
-
try {
|
|
769
|
-
await queryRunner.rollbackTransaction();
|
|
770
|
-
}
|
|
771
|
-
catch (rollbackError) { }
|
|
772
|
-
}
|
|
773
|
-
throw error;
|
|
774
|
-
}
|
|
775
|
-
finally {
|
|
776
|
-
if (queryRunner !== this.queryRunner)
|
|
777
|
-
await queryRunner.release();
|
|
778
|
-
}
|
|
779
|
-
}
|
|
780
|
-
/**
|
|
781
|
-
* Enables or disables query result caching.
|
|
782
|
-
*/
|
|
783
|
-
cache(enabledOrMillisecondsOrId, maybeMilliseconds) {
|
|
784
|
-
if (typeof enabledOrMillisecondsOrId === "boolean") {
|
|
785
|
-
this.expressionMap.cache = enabledOrMillisecondsOrId;
|
|
786
|
-
}
|
|
787
|
-
else if (typeof enabledOrMillisecondsOrId === "number") {
|
|
788
|
-
this.expressionMap.cache = true;
|
|
789
|
-
this.expressionMap.cacheDuration = enabledOrMillisecondsOrId;
|
|
790
|
-
}
|
|
791
|
-
else if (typeof enabledOrMillisecondsOrId === "string" ||
|
|
792
|
-
typeof enabledOrMillisecondsOrId === "number") {
|
|
793
|
-
this.expressionMap.cache = true;
|
|
794
|
-
this.expressionMap.cacheId = enabledOrMillisecondsOrId;
|
|
795
|
-
}
|
|
796
|
-
if (maybeMilliseconds) {
|
|
797
|
-
this.expressionMap.cacheDuration = maybeMilliseconds;
|
|
798
|
-
}
|
|
799
|
-
return this;
|
|
800
|
-
}
|
|
801
|
-
/**
|
|
802
|
-
* Sets extra options that can be used to configure how query builder works.
|
|
803
|
-
*/
|
|
804
|
-
setOption(option) {
|
|
805
|
-
this.expressionMap.options.push(option);
|
|
806
|
-
return this;
|
|
807
|
-
}
|
|
808
|
-
join(direction, entityOrProperty, aliasName, condition, parameters, mapToProperty, isMappingMany) {
|
|
809
|
-
this.setParameters(parameters || {});
|
|
810
|
-
const joinAttribute = new JoinAttribute(this.connection, this.expressionMap);
|
|
811
|
-
joinAttribute.direction = direction;
|
|
812
|
-
joinAttribute.mapToProperty = mapToProperty;
|
|
813
|
-
joinAttribute.isMappingMany = isMappingMany;
|
|
814
|
-
joinAttribute.entityOrProperty = entityOrProperty; // relationName
|
|
815
|
-
joinAttribute.condition = condition ? condition : undefined; // joinInverseSideCondition
|
|
816
|
-
this.expressionMap.joinAttributes.push(joinAttribute);
|
|
817
|
-
if (joinAttribute.metadata) {
|
|
818
|
-
if (joinAttribute.metadata.deleteDateColumn &&
|
|
819
|
-
!this.expressionMap.withDeleted) {
|
|
820
|
-
const conditionDeleteColumn = `${aliasName}.${joinAttribute.metadata.deleteDateColumn.propertyName} IS NULL`;
|
|
821
|
-
joinAttribute.condition = joinAttribute.condition
|
|
822
|
-
? ` ${joinAttribute.condition} AND ${conditionDeleteColumn}`
|
|
823
|
-
: `${conditionDeleteColumn}`;
|
|
824
|
-
}
|
|
825
|
-
joinAttribute.alias = this.expressionMap.createAlias({
|
|
826
|
-
type: "join",
|
|
827
|
-
name: aliasName,
|
|
828
|
-
metadata: joinAttribute.metadata,
|
|
829
|
-
});
|
|
830
|
-
if (joinAttribute.relation &&
|
|
831
|
-
joinAttribute.relation.junctionEntityMetadata) {
|
|
832
|
-
this.expressionMap.createAlias({
|
|
833
|
-
type: "join",
|
|
834
|
-
name: joinAttribute.junctionAlias,
|
|
835
|
-
metadata: joinAttribute.relation.junctionEntityMetadata,
|
|
836
|
-
});
|
|
837
|
-
}
|
|
838
|
-
}
|
|
839
|
-
else {
|
|
840
|
-
let subQuery = "";
|
|
841
|
-
if (typeof entityOrProperty === "function") {
|
|
842
|
-
const subQueryBuilder = entityOrProperty(this.subQuery());
|
|
843
|
-
this.setParameters(subQueryBuilder.getParameters());
|
|
844
|
-
subQuery = subQueryBuilder.getQuery();
|
|
845
|
-
}
|
|
846
|
-
else {
|
|
847
|
-
subQuery = entityOrProperty;
|
|
848
|
-
}
|
|
849
|
-
const isSubQuery = typeof entityOrProperty === "function" ||
|
|
850
|
-
(entityOrProperty.substr(0, 1) === "(" &&
|
|
851
|
-
entityOrProperty.substr(-1) === ")");
|
|
852
|
-
joinAttribute.alias = this.expressionMap.createAlias({
|
|
853
|
-
type: "join",
|
|
854
|
-
name: aliasName,
|
|
855
|
-
tablePath: isSubQuery === false
|
|
856
|
-
? entityOrProperty
|
|
857
|
-
: undefined,
|
|
858
|
-
subQuery: isSubQuery === true ? subQuery : undefined,
|
|
859
|
-
});
|
|
860
|
-
}
|
|
861
|
-
}
|
|
862
|
-
/**
|
|
863
|
-
* Creates "SELECT FROM" part of SQL query.
|
|
864
|
-
*/
|
|
865
|
-
createSelectExpression() {
|
|
866
|
-
if (!this.expressionMap.mainAlias)
|
|
867
|
-
throw new TypeORMError("Cannot build query because main alias is not set (call qb#from method)");
|
|
868
|
-
const allSelects = [];
|
|
869
|
-
const excludedSelects = [];
|
|
870
|
-
if (this.expressionMap.mainAlias.hasMetadata) {
|
|
871
|
-
const metadata = this.expressionMap.mainAlias.metadata;
|
|
872
|
-
allSelects.push(...this.buildEscapedEntityColumnSelects(this.expressionMap.mainAlias.name, metadata));
|
|
873
|
-
excludedSelects.push(...this.findEntityColumnSelects(this.expressionMap.mainAlias.name, metadata));
|
|
874
|
-
}
|
|
875
|
-
this.expressionMap.joinAttributes.forEach((join) => {
|
|
876
|
-
if (join.metadata) {
|
|
877
|
-
allSelects.push(...this.buildEscapedEntityColumnSelects(join.alias.name, join.metadata));
|
|
878
|
-
excludedSelects.push(...this.findEntityColumnSelects(join.alias.name, join.metadata));
|
|
879
|
-
}
|
|
880
|
-
else {
|
|
881
|
-
const hasMainAlias = this.expressionMap.selects.some((select) => select.selection === join.alias.name);
|
|
882
|
-
if (hasMainAlias) {
|
|
883
|
-
allSelects.push({
|
|
884
|
-
selection: this.escape(join.alias.name) + ".*",
|
|
885
|
-
});
|
|
886
|
-
const excludedSelect = this.expressionMap.selects.find((select) => select.selection === join.alias.name);
|
|
887
|
-
excludedSelects.push(excludedSelect);
|
|
888
|
-
}
|
|
889
|
-
}
|
|
890
|
-
});
|
|
891
|
-
this.expressionMap.selects
|
|
892
|
-
.filter((select) => excludedSelects.indexOf(select) === -1)
|
|
893
|
-
.forEach((select) => allSelects.push({
|
|
894
|
-
selection: this.replacePropertyNames(select.selection),
|
|
895
|
-
aliasName: select.aliasName,
|
|
896
|
-
}));
|
|
897
|
-
if (allSelects.length === 0)
|
|
898
|
-
allSelects.push({ selection: "*" });
|
|
899
|
-
let useIndex = "";
|
|
900
|
-
if (this.expressionMap.useIndex) {
|
|
901
|
-
if (DriverUtils.isMySQLFamily(this.connection.driver)) {
|
|
902
|
-
useIndex = ` USE INDEX (${this.expressionMap.useIndex})`;
|
|
903
|
-
}
|
|
904
|
-
}
|
|
905
|
-
const froms = this.expressionMap.aliases
|
|
906
|
-
.filter((alias) => alias.type === "from" &&
|
|
907
|
-
(alias.tablePath || alias.subQuery))
|
|
908
|
-
.map((alias) => {
|
|
909
|
-
if (alias.subQuery)
|
|
910
|
-
return alias.subQuery + " " + this.escape(alias.name);
|
|
911
|
-
return (this.getTableName(alias.tablePath) +
|
|
912
|
-
" " +
|
|
913
|
-
this.escape(alias.name));
|
|
914
|
-
});
|
|
915
|
-
const select = this.createSelectDistinctExpression();
|
|
916
|
-
const selection = allSelects
|
|
917
|
-
.map((select) => select.selection +
|
|
918
|
-
(select.aliasName
|
|
919
|
-
? " AS " + this.escape(select.aliasName)
|
|
920
|
-
: ""))
|
|
921
|
-
.join(", ");
|
|
922
|
-
return (select +
|
|
923
|
-
selection +
|
|
924
|
-
" FROM " +
|
|
925
|
-
froms.join(", ") +
|
|
926
|
-
this.createTableLockExpression() +
|
|
927
|
-
useIndex);
|
|
928
|
-
}
|
|
929
|
-
/**
|
|
930
|
-
* Creates select | select distinct part of SQL query.
|
|
931
|
-
*/
|
|
932
|
-
createSelectDistinctExpression() {
|
|
933
|
-
const { selectDistinct, selectDistinctOn, maxExecutionTime } = this.expressionMap;
|
|
934
|
-
const { driver } = this.connection;
|
|
935
|
-
let select = "SELECT ";
|
|
936
|
-
if (maxExecutionTime > 0) {
|
|
937
|
-
if (DriverUtils.isMySQLFamily(driver)) {
|
|
938
|
-
select += `/*+ MAX_EXECUTION_TIME(${this.expressionMap.maxExecutionTime}) */ `;
|
|
939
|
-
}
|
|
940
|
-
}
|
|
941
|
-
if (DriverUtils.isPostgresFamily(driver) &&
|
|
942
|
-
selectDistinctOn.length > 0) {
|
|
943
|
-
const selectDistinctOnMap = selectDistinctOn
|
|
944
|
-
.map((on) => this.replacePropertyNames(on))
|
|
945
|
-
.join(", ");
|
|
946
|
-
select = `SELECT DISTINCT ON (${selectDistinctOnMap}) `;
|
|
947
|
-
}
|
|
948
|
-
else if (selectDistinct) {
|
|
949
|
-
select = "SELECT DISTINCT ";
|
|
950
|
-
}
|
|
951
|
-
return select;
|
|
952
|
-
}
|
|
953
|
-
/**
|
|
954
|
-
* Creates "JOIN" part of SQL query.
|
|
955
|
-
*/
|
|
956
|
-
createJoinExpression() {
|
|
957
|
-
const joins = this.expressionMap.joinAttributes.map((joinAttr) => {
|
|
958
|
-
const relation = joinAttr.relation;
|
|
959
|
-
const destinationTableName = joinAttr.tablePath;
|
|
960
|
-
const destinationTableAlias = joinAttr.alias.name;
|
|
961
|
-
let appendedCondition = joinAttr.condition
|
|
962
|
-
? " AND (" + joinAttr.condition + ")"
|
|
963
|
-
: "";
|
|
964
|
-
const parentAlias = joinAttr.parentAlias;
|
|
965
|
-
if (!parentAlias || !relation) {
|
|
966
|
-
const destinationJoin = joinAttr.alias.subQuery
|
|
967
|
-
? joinAttr.alias.subQuery
|
|
968
|
-
: this.getTableName(destinationTableName);
|
|
969
|
-
return (" " +
|
|
970
|
-
joinAttr.direction +
|
|
971
|
-
" JOIN " +
|
|
972
|
-
destinationJoin +
|
|
973
|
-
" " +
|
|
974
|
-
this.escape(destinationTableAlias) +
|
|
975
|
-
this.createTableLockExpression() +
|
|
976
|
-
(joinAttr.condition
|
|
977
|
-
? " ON " + this.replacePropertyNames(joinAttr.condition)
|
|
978
|
-
: ""));
|
|
979
|
-
}
|
|
980
|
-
if (relation.isManyToOne || relation.isOneToOneOwner) {
|
|
981
|
-
const condition = relation.joinColumns
|
|
982
|
-
.map((joinColumn) => {
|
|
983
|
-
return (destinationTableAlias +
|
|
984
|
-
"." +
|
|
985
|
-
joinColumn.referencedColumn.propertyPath +
|
|
986
|
-
"=" +
|
|
987
|
-
parentAlias +
|
|
988
|
-
"." +
|
|
989
|
-
relation.propertyPath +
|
|
990
|
-
"." +
|
|
991
|
-
joinColumn.referencedColumn.propertyPath);
|
|
992
|
-
})
|
|
993
|
-
.join(" AND ");
|
|
994
|
-
return (" " +
|
|
995
|
-
joinAttr.direction +
|
|
996
|
-
" JOIN " +
|
|
997
|
-
this.getTableName(destinationTableName) +
|
|
998
|
-
" " +
|
|
999
|
-
this.escape(destinationTableAlias) +
|
|
1000
|
-
this.createTableLockExpression() +
|
|
1001
|
-
" ON " +
|
|
1002
|
-
this.replacePropertyNames(condition + appendedCondition));
|
|
1003
|
-
}
|
|
1004
|
-
else if (relation.isOneToMany || relation.isOneToOneNotOwner) {
|
|
1005
|
-
const condition = relation
|
|
1006
|
-
.inverseRelation.joinColumns.map((joinColumn) => {
|
|
1007
|
-
if (relation.inverseEntityMetadata.tableType ===
|
|
1008
|
-
"entity-child" &&
|
|
1009
|
-
relation.inverseEntityMetadata.discriminatorColumn) {
|
|
1010
|
-
appendedCondition +=
|
|
1011
|
-
" AND " +
|
|
1012
|
-
destinationTableAlias +
|
|
1013
|
-
"." +
|
|
1014
|
-
relation.inverseEntityMetadata
|
|
1015
|
-
.discriminatorColumn.databaseName +
|
|
1016
|
-
"='" +
|
|
1017
|
-
relation.inverseEntityMetadata
|
|
1018
|
-
.discriminatorValue +
|
|
1019
|
-
"'";
|
|
1020
|
-
}
|
|
1021
|
-
return (destinationTableAlias +
|
|
1022
|
-
"." +
|
|
1023
|
-
relation.inverseRelation.propertyPath +
|
|
1024
|
-
"." +
|
|
1025
|
-
joinColumn.referencedColumn.propertyPath +
|
|
1026
|
-
"=" +
|
|
1027
|
-
parentAlias +
|
|
1028
|
-
"." +
|
|
1029
|
-
joinColumn.referencedColumn.propertyPath);
|
|
1030
|
-
})
|
|
1031
|
-
.join(" AND ");
|
|
1032
|
-
return (" " +
|
|
1033
|
-
joinAttr.direction +
|
|
1034
|
-
" JOIN " +
|
|
1035
|
-
this.getTableName(destinationTableName) +
|
|
1036
|
-
" " +
|
|
1037
|
-
this.escape(destinationTableAlias) +
|
|
1038
|
-
this.createTableLockExpression() +
|
|
1039
|
-
" ON " +
|
|
1040
|
-
this.replacePropertyNames(condition + appendedCondition));
|
|
1041
|
-
}
|
|
1042
|
-
else {
|
|
1043
|
-
const junctionTableName = relation.junctionEntityMetadata.tablePath;
|
|
1044
|
-
const junctionAlias = joinAttr.junctionAlias;
|
|
1045
|
-
let junctionCondition = "", destinationCondition = "";
|
|
1046
|
-
if (relation.isOwning) {
|
|
1047
|
-
junctionCondition = relation.joinColumns
|
|
1048
|
-
.map((joinColumn) => {
|
|
1049
|
-
return (junctionAlias +
|
|
1050
|
-
"." +
|
|
1051
|
-
joinColumn.propertyPath +
|
|
1052
|
-
"=" +
|
|
1053
|
-
parentAlias +
|
|
1054
|
-
"." +
|
|
1055
|
-
joinColumn.referencedColumn.propertyPath);
|
|
1056
|
-
})
|
|
1057
|
-
.join(" AND ");
|
|
1058
|
-
destinationCondition = relation.inverseJoinColumns
|
|
1059
|
-
.map((joinColumn) => {
|
|
1060
|
-
return (destinationTableAlias +
|
|
1061
|
-
"." +
|
|
1062
|
-
joinColumn.referencedColumn.propertyPath +
|
|
1063
|
-
"=" +
|
|
1064
|
-
junctionAlias +
|
|
1065
|
-
"." +
|
|
1066
|
-
joinColumn.propertyPath);
|
|
1067
|
-
})
|
|
1068
|
-
.join(" AND ");
|
|
1069
|
-
}
|
|
1070
|
-
else {
|
|
1071
|
-
junctionCondition = relation
|
|
1072
|
-
.inverseRelation.inverseJoinColumns.map((joinColumn) => {
|
|
1073
|
-
return (junctionAlias +
|
|
1074
|
-
"." +
|
|
1075
|
-
joinColumn.propertyPath +
|
|
1076
|
-
"=" +
|
|
1077
|
-
parentAlias +
|
|
1078
|
-
"." +
|
|
1079
|
-
joinColumn.referencedColumn.propertyPath);
|
|
1080
|
-
})
|
|
1081
|
-
.join(" AND ");
|
|
1082
|
-
destinationCondition = relation
|
|
1083
|
-
.inverseRelation.joinColumns.map((joinColumn) => {
|
|
1084
|
-
return (destinationTableAlias +
|
|
1085
|
-
"." +
|
|
1086
|
-
joinColumn.referencedColumn.propertyPath +
|
|
1087
|
-
"=" +
|
|
1088
|
-
junctionAlias +
|
|
1089
|
-
"." +
|
|
1090
|
-
joinColumn.propertyPath);
|
|
1091
|
-
})
|
|
1092
|
-
.join(" AND ");
|
|
1093
|
-
}
|
|
1094
|
-
return (" " +
|
|
1095
|
-
joinAttr.direction +
|
|
1096
|
-
" JOIN " +
|
|
1097
|
-
this.getTableName(junctionTableName) +
|
|
1098
|
-
" " +
|
|
1099
|
-
this.escape(junctionAlias) +
|
|
1100
|
-
this.createTableLockExpression() +
|
|
1101
|
-
" ON " +
|
|
1102
|
-
this.replacePropertyNames(junctionCondition) +
|
|
1103
|
-
" " +
|
|
1104
|
-
joinAttr.direction +
|
|
1105
|
-
" JOIN " +
|
|
1106
|
-
this.getTableName(destinationTableName) +
|
|
1107
|
-
" " +
|
|
1108
|
-
this.escape(destinationTableAlias) +
|
|
1109
|
-
this.createTableLockExpression() +
|
|
1110
|
-
" ON " +
|
|
1111
|
-
this.replacePropertyNames(destinationCondition + appendedCondition));
|
|
1112
|
-
}
|
|
1113
|
-
});
|
|
1114
|
-
return joins.join(" ");
|
|
1115
|
-
}
|
|
1116
|
-
/**
|
|
1117
|
-
* Creates "GROUP BY" part of SQL query.
|
|
1118
|
-
*/
|
|
1119
|
-
createGroupByExpression() {
|
|
1120
|
-
if (!this.expressionMap.groupBys || !this.expressionMap.groupBys.length)
|
|
1121
|
-
return "";
|
|
1122
|
-
return (" GROUP BY " +
|
|
1123
|
-
this.replacePropertyNames(this.expressionMap.groupBys.join(", ")));
|
|
1124
|
-
}
|
|
1125
|
-
/**
|
|
1126
|
-
* Creates "ORDER BY" part of SQL query.
|
|
1127
|
-
*/
|
|
1128
|
-
createOrderByExpression() {
|
|
1129
|
-
const orderBys = this.expressionMap.allOrderBys;
|
|
1130
|
-
if (Object.keys(orderBys).length > 0)
|
|
1131
|
-
return (" ORDER BY " +
|
|
1132
|
-
Object.keys(orderBys)
|
|
1133
|
-
.map((columnName) => {
|
|
1134
|
-
if (typeof orderBys[columnName] === "string") {
|
|
1135
|
-
return (this.replacePropertyNames(columnName) +
|
|
1136
|
-
" " +
|
|
1137
|
-
orderBys[columnName]);
|
|
1138
|
-
}
|
|
1139
|
-
else {
|
|
1140
|
-
return (this.replacePropertyNames(columnName) +
|
|
1141
|
-
" " +
|
|
1142
|
-
orderBys[columnName].order +
|
|
1143
|
-
" " +
|
|
1144
|
-
orderBys[columnName].nulls);
|
|
1145
|
-
}
|
|
1146
|
-
})
|
|
1147
|
-
.join(", "));
|
|
1148
|
-
return "";
|
|
1149
|
-
}
|
|
1150
|
-
/**
|
|
1151
|
-
* Creates "LIMIT" and "OFFSET" parts of SQL query.
|
|
1152
|
-
*/
|
|
1153
|
-
createLimitOffsetExpression() {
|
|
1154
|
-
let offset = this.expressionMap.offset, limit = this.expressionMap.limit;
|
|
1155
|
-
if (!offset &&
|
|
1156
|
-
!limit &&
|
|
1157
|
-
this.expressionMap.joinAttributes.length === 0) {
|
|
1158
|
-
offset = this.expressionMap.skip;
|
|
1159
|
-
limit = this.expressionMap.take;
|
|
1160
|
-
}
|
|
1161
|
-
if (this.connection.driver.options.type === "mssql") {
|
|
1162
|
-
let prefix = "";
|
|
1163
|
-
if ((limit || offset) &&
|
|
1164
|
-
Object.keys(this.expressionMap.allOrderBys).length <= 0) {
|
|
1165
|
-
prefix = " ORDER BY (SELECT NULL)";
|
|
1166
|
-
}
|
|
1167
|
-
if (limit && offset)
|
|
1168
|
-
return (prefix +
|
|
1169
|
-
" OFFSET " +
|
|
1170
|
-
offset +
|
|
1171
|
-
" ROWS FETCH NEXT " +
|
|
1172
|
-
limit +
|
|
1173
|
-
" ROWS ONLY");
|
|
1174
|
-
if (limit)
|
|
1175
|
-
return (prefix + " OFFSET 0 ROWS FETCH NEXT " + limit + " ROWS ONLY");
|
|
1176
|
-
if (offset)
|
|
1177
|
-
return prefix + " OFFSET " + offset + " ROWS";
|
|
1178
|
-
}
|
|
1179
|
-
else if (DriverUtils.isMySQLFamily(this.connection.driver) ||
|
|
1180
|
-
this.connection.driver.options.type === "aurora-mysql" ||
|
|
1181
|
-
this.connection.driver.options.type === "sap" ||
|
|
1182
|
-
this.connection.driver.options.type === "spanner") {
|
|
1183
|
-
if (limit && offset)
|
|
1184
|
-
return " LIMIT " + limit + " OFFSET " + offset;
|
|
1185
|
-
if (limit)
|
|
1186
|
-
return " LIMIT " + limit;
|
|
1187
|
-
if (offset)
|
|
1188
|
-
throw new OffsetWithoutLimitNotSupportedError();
|
|
1189
|
-
}
|
|
1190
|
-
else if (DriverUtils.isSQLiteFamily(this.connection.driver)) {
|
|
1191
|
-
if (limit && offset)
|
|
1192
|
-
return " LIMIT " + limit + " OFFSET " + offset;
|
|
1193
|
-
if (limit)
|
|
1194
|
-
return " LIMIT " + limit;
|
|
1195
|
-
if (offset)
|
|
1196
|
-
return " LIMIT -1 OFFSET " + offset;
|
|
1197
|
-
}
|
|
1198
|
-
else if (this.connection.driver.options.type === "oracle") {
|
|
1199
|
-
if (limit && offset)
|
|
1200
|
-
return (" OFFSET " +
|
|
1201
|
-
offset +
|
|
1202
|
-
" ROWS FETCH NEXT " +
|
|
1203
|
-
limit +
|
|
1204
|
-
" ROWS ONLY");
|
|
1205
|
-
if (limit)
|
|
1206
|
-
return " FETCH NEXT " + limit + " ROWS ONLY";
|
|
1207
|
-
if (offset)
|
|
1208
|
-
return " OFFSET " + offset + " ROWS";
|
|
1209
|
-
}
|
|
1210
|
-
else {
|
|
1211
|
-
if (limit && offset)
|
|
1212
|
-
return " LIMIT " + limit + " OFFSET " + offset;
|
|
1213
|
-
if (limit)
|
|
1214
|
-
return " LIMIT " + limit;
|
|
1215
|
-
if (offset)
|
|
1216
|
-
return " OFFSET " + offset;
|
|
1217
|
-
}
|
|
1218
|
-
return "";
|
|
1219
|
-
}
|
|
1220
|
-
/**
|
|
1221
|
-
* Creates "LOCK" part of SELECT Query after table Clause
|
|
1222
|
-
* ex.
|
|
1223
|
-
* SELECT 1
|
|
1224
|
-
* FROM USER U WITH (NOLOCK)
|
|
1225
|
-
* JOIN ORDER O WITH (NOLOCK)
|
|
1226
|
-
* ON U.ID=O.OrderID
|
|
1227
|
-
*/
|
|
1228
|
-
createTableLockExpression() {
|
|
1229
|
-
if (this.connection.driver.options.type === "mssql") {
|
|
1230
|
-
switch (this.expressionMap.lockMode) {
|
|
1231
|
-
case "pessimistic_read":
|
|
1232
|
-
return " WITH (HOLDLOCK, ROWLOCK)";
|
|
1233
|
-
case "pessimistic_write":
|
|
1234
|
-
return " WITH (UPDLOCK, ROWLOCK)";
|
|
1235
|
-
case "dirty_read":
|
|
1236
|
-
return " WITH (NOLOCK)";
|
|
1237
|
-
}
|
|
1238
|
-
}
|
|
1239
|
-
return "";
|
|
1240
|
-
}
|
|
1241
|
-
/**
|
|
1242
|
-
* Creates "LOCK" part of SQL query.
|
|
1243
|
-
*/
|
|
1244
|
-
createLockExpression() {
|
|
1245
|
-
const driver = this.connection.driver;
|
|
1246
|
-
let lockTablesClause = "";
|
|
1247
|
-
if (this.expressionMap.lockTables) {
|
|
1248
|
-
if (!(DriverUtils.isPostgresFamily(driver) ||
|
|
1249
|
-
driver.options.type === "cockroachdb")) {
|
|
1250
|
-
throw new TypeORMError("Lock tables not supported in selected driver");
|
|
1251
|
-
}
|
|
1252
|
-
if (this.expressionMap.lockTables.length < 1) {
|
|
1253
|
-
throw new TypeORMError("lockTables cannot be an empty array");
|
|
1254
|
-
}
|
|
1255
|
-
lockTablesClause = " OF " + this.expressionMap.lockTables.join(", ");
|
|
1256
|
-
}
|
|
1257
|
-
let onLockExpression = "";
|
|
1258
|
-
if (this.expressionMap.onLocked === "nowait") {
|
|
1259
|
-
onLockExpression = " NOWAIT";
|
|
1260
|
-
}
|
|
1261
|
-
else if (this.expressionMap.onLocked === "skip_locked") {
|
|
1262
|
-
onLockExpression = " SKIP LOCKED";
|
|
1263
|
-
}
|
|
1264
|
-
switch (this.expressionMap.lockMode) {
|
|
1265
|
-
case "pessimistic_read":
|
|
1266
|
-
if (driver.options.type === "mysql" ||
|
|
1267
|
-
driver.options.type === "aurora-mysql") {
|
|
1268
|
-
if (DriverUtils.isReleaseVersionOrGreater(driver, "8.0.0")) {
|
|
1269
|
-
return (" FOR SHARE" + lockTablesClause + onLockExpression);
|
|
1270
|
-
}
|
|
1271
|
-
else {
|
|
1272
|
-
return " LOCK IN SHARE MODE";
|
|
1273
|
-
}
|
|
1274
|
-
}
|
|
1275
|
-
else if (driver.options.type === "mariadb") {
|
|
1276
|
-
return " LOCK IN SHARE MODE";
|
|
1277
|
-
}
|
|
1278
|
-
else if (DriverUtils.isPostgresFamily(driver)) {
|
|
1279
|
-
return " FOR SHARE" + lockTablesClause + onLockExpression;
|
|
1280
|
-
}
|
|
1281
|
-
else if (driver.options.type === "oracle") {
|
|
1282
|
-
return " FOR UPDATE";
|
|
1283
|
-
}
|
|
1284
|
-
else if (driver.options.type === "mssql") {
|
|
1285
|
-
return "";
|
|
1286
|
-
}
|
|
1287
|
-
else {
|
|
1288
|
-
throw new LockNotSupportedOnGivenDriverError();
|
|
1289
|
-
}
|
|
1290
|
-
case "pessimistic_write":
|
|
1291
|
-
if (DriverUtils.isMySQLFamily(driver) ||
|
|
1292
|
-
driver.options.type === "aurora-mysql" ||
|
|
1293
|
-
driver.options.type === "oracle") {
|
|
1294
|
-
return " FOR UPDATE" + onLockExpression;
|
|
1295
|
-
}
|
|
1296
|
-
else if (DriverUtils.isPostgresFamily(driver) ||
|
|
1297
|
-
driver.options.type === "cockroachdb") {
|
|
1298
|
-
return " FOR UPDATE" + lockTablesClause + onLockExpression;
|
|
1299
|
-
}
|
|
1300
|
-
else if (driver.options.type === "mssql") {
|
|
1301
|
-
return "";
|
|
1302
|
-
}
|
|
1303
|
-
else {
|
|
1304
|
-
throw new LockNotSupportedOnGivenDriverError();
|
|
1305
|
-
}
|
|
1306
|
-
case "pessimistic_partial_write":
|
|
1307
|
-
if (DriverUtils.isPostgresFamily(driver)) {
|
|
1308
|
-
return " FOR UPDATE" + lockTablesClause + " SKIP LOCKED";
|
|
1309
|
-
}
|
|
1310
|
-
else if (DriverUtils.isMySQLFamily(driver)) {
|
|
1311
|
-
return " FOR UPDATE SKIP LOCKED";
|
|
1312
|
-
}
|
|
1313
|
-
else {
|
|
1314
|
-
throw new LockNotSupportedOnGivenDriverError();
|
|
1315
|
-
}
|
|
1316
|
-
case "pessimistic_write_or_fail":
|
|
1317
|
-
if (DriverUtils.isPostgresFamily(driver) ||
|
|
1318
|
-
driver.options.type === "cockroachdb") {
|
|
1319
|
-
return " FOR UPDATE" + lockTablesClause + " NOWAIT";
|
|
1320
|
-
}
|
|
1321
|
-
else if (DriverUtils.isMySQLFamily(driver)) {
|
|
1322
|
-
return " FOR UPDATE NOWAIT";
|
|
1323
|
-
}
|
|
1324
|
-
else {
|
|
1325
|
-
throw new LockNotSupportedOnGivenDriverError();
|
|
1326
|
-
}
|
|
1327
|
-
case "for_no_key_update":
|
|
1328
|
-
if (DriverUtils.isPostgresFamily(driver) ||
|
|
1329
|
-
driver.options.type === "cockroachdb") {
|
|
1330
|
-
return (" FOR NO KEY UPDATE" +
|
|
1331
|
-
lockTablesClause +
|
|
1332
|
-
onLockExpression);
|
|
1333
|
-
}
|
|
1334
|
-
else {
|
|
1335
|
-
throw new LockNotSupportedOnGivenDriverError();
|
|
1336
|
-
}
|
|
1337
|
-
case "for_key_share":
|
|
1338
|
-
if (DriverUtils.isPostgresFamily(driver)) {
|
|
1339
|
-
return (" FOR KEY SHARE" + lockTablesClause + onLockExpression);
|
|
1340
|
-
}
|
|
1341
|
-
else {
|
|
1342
|
-
throw new LockNotSupportedOnGivenDriverError();
|
|
1343
|
-
}
|
|
1344
|
-
default:
|
|
1345
|
-
return "";
|
|
1346
|
-
}
|
|
1347
|
-
}
|
|
1348
|
-
/**
|
|
1349
|
-
* Creates "HAVING" part of SQL query.
|
|
1350
|
-
*/
|
|
1351
|
-
createHavingExpression() {
|
|
1352
|
-
if (!this.expressionMap.havings || !this.expressionMap.havings.length)
|
|
1353
|
-
return "";
|
|
1354
|
-
const conditions = this.expressionMap.havings
|
|
1355
|
-
.map((having, index) => {
|
|
1356
|
-
switch (having.type) {
|
|
1357
|
-
case "and":
|
|
1358
|
-
return ((index > 0 ? "AND " : "") +
|
|
1359
|
-
this.replacePropertyNames(having.condition));
|
|
1360
|
-
case "or":
|
|
1361
|
-
return ((index > 0 ? "OR " : "") +
|
|
1362
|
-
this.replacePropertyNames(having.condition));
|
|
1363
|
-
default:
|
|
1364
|
-
return this.replacePropertyNames(having.condition);
|
|
1365
|
-
}
|
|
1366
|
-
})
|
|
1367
|
-
.join(" ");
|
|
1368
|
-
if (!conditions.length)
|
|
1369
|
-
return "";
|
|
1370
|
-
return " HAVING " + conditions;
|
|
1371
|
-
}
|
|
1372
|
-
buildEscapedEntityColumnSelects(aliasName, metadata) {
|
|
1373
|
-
const hasMainAlias = this.expressionMap.selects.some((select) => select.selection === aliasName);
|
|
1374
|
-
const columns = [];
|
|
1375
|
-
if (hasMainAlias) {
|
|
1376
|
-
columns.push(...metadata.columns.filter((column) => column.isSelect === true));
|
|
1377
|
-
}
|
|
1378
|
-
columns.push(...metadata.columns.filter((column) => {
|
|
1379
|
-
return this.expressionMap.selects.some((select) => select.selection ===
|
|
1380
|
-
aliasName + "." + column.propertyPath);
|
|
1381
|
-
}));
|
|
1382
|
-
if (columns.length === 0)
|
|
1383
|
-
return [];
|
|
1384
|
-
const nonSelectedPrimaryColumns = this.expressionMap.queryEntity
|
|
1385
|
-
? metadata.primaryColumns.filter((primaryColumn) => columns.indexOf(primaryColumn) === -1)
|
|
1386
|
-
: [];
|
|
1387
|
-
const allColumns = [...columns, ...nonSelectedPrimaryColumns];
|
|
1388
|
-
const finalSelects = [];
|
|
1389
|
-
const escapedAliasName = this.escape(aliasName);
|
|
1390
|
-
allColumns.forEach((column) => {
|
|
1391
|
-
let selectionPath = escapedAliasName + "." + this.escape(column.databaseName);
|
|
1392
|
-
if (column.isVirtualProperty && column.query) {
|
|
1393
|
-
selectionPath = `(${column.query(escapedAliasName)})`;
|
|
1394
|
-
}
|
|
1395
|
-
if (this.connection.driver.spatialTypes.indexOf(column.type) !== -1) {
|
|
1396
|
-
/* */
|
|
1397
|
-
/* */
|
|
1398
|
-
/* */
|
|
1399
|
-
/* */
|
|
1400
|
-
/* */
|
|
1401
|
-
/* */
|
|
1402
|
-
/* */
|
|
1403
|
-
/* */
|
|
1404
|
-
/* */
|
|
1405
|
-
/* */
|
|
1406
|
-
/* */
|
|
1407
|
-
/* */
|
|
1408
|
-
/* */
|
|
1409
|
-
/* */
|
|
1410
|
-
/* */
|
|
1411
|
-
/* */
|
|
1412
|
-
/* */
|
|
1413
|
-
/* */
|
|
1414
|
-
/* */
|
|
1415
|
-
/* */
|
|
1416
|
-
/* */
|
|
1417
|
-
/* */
|
|
1418
|
-
/* */
|
|
1419
|
-
}
|
|
1420
|
-
const selections = this.expressionMap.selects.filter((select) => select.selection === aliasName + "." + column.propertyPath);
|
|
1421
|
-
if (selections.length) {
|
|
1422
|
-
selections.forEach((selection) => {
|
|
1423
|
-
finalSelects.push({
|
|
1424
|
-
selection: selectionPath,
|
|
1425
|
-
aliasName: selection.aliasName
|
|
1426
|
-
? selection.aliasName
|
|
1427
|
-
: DriverUtils.buildAlias(this.connection.driver, aliasName, column.databaseName),
|
|
1428
|
-
virtual: selection.virtual,
|
|
1429
|
-
});
|
|
1430
|
-
});
|
|
1431
|
-
}
|
|
1432
|
-
else {
|
|
1433
|
-
finalSelects.push({
|
|
1434
|
-
selection: selectionPath,
|
|
1435
|
-
aliasName: DriverUtils.buildAlias(this.connection.driver, aliasName, column.databaseName),
|
|
1436
|
-
virtual: hasMainAlias,
|
|
1437
|
-
});
|
|
1438
|
-
}
|
|
1439
|
-
});
|
|
1440
|
-
return finalSelects;
|
|
1441
|
-
}
|
|
1442
|
-
findEntityColumnSelects(aliasName, metadata) {
|
|
1443
|
-
const mainSelect = this.expressionMap.selects.find((select) => select.selection === aliasName);
|
|
1444
|
-
if (mainSelect)
|
|
1445
|
-
return [mainSelect];
|
|
1446
|
-
return this.expressionMap.selects.filter((select) => {
|
|
1447
|
-
return metadata.columns.some((column) => select.selection === aliasName + "." + column.propertyPath);
|
|
1448
|
-
});
|
|
1449
|
-
}
|
|
1450
|
-
computeCountExpression() {
|
|
1451
|
-
const mainAlias = this.expressionMap.mainAlias.name; // todo: will this work with "fromTableName"?
|
|
1452
|
-
const metadata = this.expressionMap.mainAlias.metadata;
|
|
1453
|
-
const primaryColumns = metadata.primaryColumns;
|
|
1454
|
-
const distinctAlias = this.escape(mainAlias);
|
|
1455
|
-
if (this.expressionMap.joinAttributes.length === 0 &&
|
|
1456
|
-
this.expressionMap.relationIdAttributes.length === 0 &&
|
|
1457
|
-
this.expressionMap.relationCountAttributes.length === 0) {
|
|
1458
|
-
return "COUNT(1)";
|
|
1459
|
-
}
|
|
1460
|
-
if (this.connection.driver.options.type === "cockroachdb" ||
|
|
1461
|
-
DriverUtils.isPostgresFamily(this.connection.driver)) {
|
|
1462
|
-
return ("COUNT(DISTINCT(" +
|
|
1463
|
-
primaryColumns
|
|
1464
|
-
.map((c) => `${distinctAlias}.${this.escape(c.databaseName)}`)
|
|
1465
|
-
.join(", ") +
|
|
1466
|
-
"))");
|
|
1467
|
-
}
|
|
1468
|
-
if (DriverUtils.isMySQLFamily(this.connection.driver)) {
|
|
1469
|
-
return ("COUNT(DISTINCT " +
|
|
1470
|
-
primaryColumns
|
|
1471
|
-
.map((c) => `${distinctAlias}.${this.escape(c.databaseName)}`)
|
|
1472
|
-
.join(", ") +
|
|
1473
|
-
")");
|
|
1474
|
-
}
|
|
1475
|
-
if (this.connection.driver.options.type === "mssql") {
|
|
1476
|
-
const columnsExpression = primaryColumns
|
|
1477
|
-
.map((primaryColumn) => `${distinctAlias}.${this.escape(primaryColumn.databaseName)}`)
|
|
1478
|
-
.join(", '|;|', ");
|
|
1479
|
-
if (primaryColumns.length === 1) {
|
|
1480
|
-
return `COUNT(DISTINCT(${columnsExpression}))`;
|
|
1481
|
-
}
|
|
1482
|
-
return `COUNT(DISTINCT(CONCAT(${columnsExpression})))`;
|
|
1483
|
-
}
|
|
1484
|
-
if (this.connection.driver.options.type === "spanner") {
|
|
1485
|
-
if (primaryColumns.length === 1) {
|
|
1486
|
-
return `COUNT(DISTINCT(${distinctAlias}.${this.escape(primaryColumns[0].databaseName)}))`;
|
|
1487
|
-
}
|
|
1488
|
-
const columnsExpression = primaryColumns
|
|
1489
|
-
.map((primaryColumn) => `CAST(${distinctAlias}.${this.escape(primaryColumn.databaseName)} AS STRING)`)
|
|
1490
|
-
.join(", '|;|', ");
|
|
1491
|
-
return `COUNT(DISTINCT(CONCAT(${columnsExpression})))`;
|
|
1492
|
-
}
|
|
1493
|
-
return (`COUNT(DISTINCT(` +
|
|
1494
|
-
primaryColumns
|
|
1495
|
-
.map((c) => `${distinctAlias}.${this.escape(c.databaseName)}`)
|
|
1496
|
-
.join(" || '|;|' || ") +
|
|
1497
|
-
"))");
|
|
1498
|
-
}
|
|
1499
|
-
async executeCountQuery(queryRunner) {
|
|
1500
|
-
const countSql = this.computeCountExpression();
|
|
1501
|
-
const results = await this.clone()
|
|
1502
|
-
.orderBy()
|
|
1503
|
-
.groupBy()
|
|
1504
|
-
.offset(undefined)
|
|
1505
|
-
.limit(undefined)
|
|
1506
|
-
.skip(undefined)
|
|
1507
|
-
.take(undefined)
|
|
1508
|
-
.select(countSql, "cnt")
|
|
1509
|
-
.setOption("disable-global-order")
|
|
1510
|
-
.loadRawResults(queryRunner);
|
|
1511
|
-
if (!results || !results[0] || !results[0]["cnt"])
|
|
1512
|
-
return 0;
|
|
1513
|
-
return parseInt(results[0]["cnt"]);
|
|
1514
|
-
}
|
|
1515
|
-
applyFindOptions() {
|
|
1516
|
-
if (this.expressionMap.mainAlias.metadata) {
|
|
1517
|
-
if (this.findOptions.relationLoadStrategy) {
|
|
1518
|
-
this.expressionMap.relationLoadStrategy =
|
|
1519
|
-
this.findOptions.relationLoadStrategy;
|
|
1520
|
-
}
|
|
1521
|
-
if (this.findOptions.comment) {
|
|
1522
|
-
this.comment(this.findOptions.comment);
|
|
1523
|
-
}
|
|
1524
|
-
if (this.findOptions.withDeleted) {
|
|
1525
|
-
this.withDeleted();
|
|
1526
|
-
}
|
|
1527
|
-
if (this.findOptions.select) {
|
|
1528
|
-
const select = Array.isArray(this.findOptions.select)
|
|
1529
|
-
? OrmUtils.propertyPathsToTruthyObject(this.findOptions.select)
|
|
1530
|
-
: this.findOptions.select;
|
|
1531
|
-
this.buildSelect(select, this.expressionMap.mainAlias.metadata, this.expressionMap.mainAlias.name);
|
|
1532
|
-
}
|
|
1533
|
-
if (this.selects.length) {
|
|
1534
|
-
this.select(this.selects);
|
|
1535
|
-
}
|
|
1536
|
-
this.selects = [];
|
|
1537
|
-
if (this.findOptions.relations) {
|
|
1538
|
-
const relations = Array.isArray(this.findOptions.relations)
|
|
1539
|
-
? OrmUtils.propertyPathsToTruthyObject(this.findOptions.relations)
|
|
1540
|
-
: this.findOptions.relations;
|
|
1541
|
-
this.buildRelations(relations, typeof this.findOptions.select === "object"
|
|
1542
|
-
? this.findOptions.select
|
|
1543
|
-
: undefined, this.expressionMap.mainAlias.metadata, this.expressionMap.mainAlias.name);
|
|
1544
|
-
if (this.findOptions.loadEagerRelations !== false &&
|
|
1545
|
-
this.expressionMap.relationLoadStrategy === "join") {
|
|
1546
|
-
this.buildEagerRelations(relations, typeof this.findOptions.select === "object"
|
|
1547
|
-
? this.findOptions
|
|
1548
|
-
.select
|
|
1549
|
-
: undefined, this.expressionMap.mainAlias.metadata, this.expressionMap.mainAlias.name);
|
|
1550
|
-
}
|
|
1551
|
-
}
|
|
1552
|
-
if (this.selects.length) {
|
|
1553
|
-
this.addSelect(this.selects);
|
|
1554
|
-
}
|
|
1555
|
-
if (this.findOptions.where) {
|
|
1556
|
-
this.conditions = this.buildWhere(this.findOptions.where, this.expressionMap.mainAlias.metadata, this.expressionMap.mainAlias.name);
|
|
1557
|
-
if (this.conditions.length)
|
|
1558
|
-
this.andWhere(this.conditions.substr(0, 1) !== "("
|
|
1559
|
-
? "(" + this.conditions + ")"
|
|
1560
|
-
: this.conditions); // temporary and where and braces
|
|
1561
|
-
}
|
|
1562
|
-
if (this.findOptions.order) {
|
|
1563
|
-
this.buildOrder(this.findOptions.order, this.expressionMap.mainAlias.metadata, this.expressionMap.mainAlias.name);
|
|
1564
|
-
}
|
|
1565
|
-
if (this.joins.length) {
|
|
1566
|
-
this.joins.forEach((join) => {
|
|
1567
|
-
if (join.select && !join.selection) {
|
|
1568
|
-
//
|
|
1569
|
-
if (join.type === "inner") {
|
|
1570
|
-
this.innerJoinAndSelect(`${join.parentAlias}.${join.relationMetadata.propertyPath}`, join.alias);
|
|
1571
|
-
}
|
|
1572
|
-
else {
|
|
1573
|
-
this.leftJoinAndSelect(`${join.parentAlias}.${join.relationMetadata.propertyPath}`, join.alias);
|
|
1574
|
-
}
|
|
1575
|
-
}
|
|
1576
|
-
else {
|
|
1577
|
-
if (join.type === "inner") {
|
|
1578
|
-
this.innerJoin(`${join.parentAlias}.${join.relationMetadata.propertyPath}`, join.alias);
|
|
1579
|
-
}
|
|
1580
|
-
else {
|
|
1581
|
-
this.leftJoin(`${join.parentAlias}.${join.relationMetadata.propertyPath}`, join.alias);
|
|
1582
|
-
}
|
|
1583
|
-
}
|
|
1584
|
-
});
|
|
1585
|
-
}
|
|
1586
|
-
if (this.findOptions.skip !== undefined) {
|
|
1587
|
-
this.skip(this.findOptions.skip);
|
|
1588
|
-
}
|
|
1589
|
-
if (this.findOptions.take !== undefined) {
|
|
1590
|
-
this.take(this.findOptions.take);
|
|
1591
|
-
}
|
|
1592
|
-
if (typeof this.findOptions.cache === "number") {
|
|
1593
|
-
this.cache(this.findOptions.cache);
|
|
1594
|
-
}
|
|
1595
|
-
else if (typeof this.findOptions.cache === "boolean") {
|
|
1596
|
-
this.cache(this.findOptions.cache);
|
|
1597
|
-
}
|
|
1598
|
-
else if (typeof this.findOptions.cache === "object") {
|
|
1599
|
-
this.cache(this.findOptions.cache.id, this.findOptions.cache.milliseconds);
|
|
1600
|
-
}
|
|
1601
|
-
if (this.findOptions.join) {
|
|
1602
|
-
if (this.findOptions.join.leftJoin)
|
|
1603
|
-
Object.keys(this.findOptions.join.leftJoin).forEach((key) => {
|
|
1604
|
-
this.leftJoin(this.findOptions.join.leftJoin[key], key);
|
|
1605
|
-
});
|
|
1606
|
-
if (this.findOptions.join.innerJoin)
|
|
1607
|
-
Object.keys(this.findOptions.join.innerJoin).forEach((key) => {
|
|
1608
|
-
this.innerJoin(this.findOptions.join.innerJoin[key], key);
|
|
1609
|
-
});
|
|
1610
|
-
if (this.findOptions.join.leftJoinAndSelect)
|
|
1611
|
-
Object.keys(this.findOptions.join.leftJoinAndSelect).forEach((key) => {
|
|
1612
|
-
this.leftJoinAndSelect(this.findOptions.join.leftJoinAndSelect[key], key);
|
|
1613
|
-
});
|
|
1614
|
-
if (this.findOptions.join.innerJoinAndSelect)
|
|
1615
|
-
Object.keys(this.findOptions.join.innerJoinAndSelect).forEach((key) => {
|
|
1616
|
-
this.innerJoinAndSelect(this.findOptions.join.innerJoinAndSelect[key], key);
|
|
1617
|
-
});
|
|
1618
|
-
}
|
|
1619
|
-
if (this.findOptions.lock) {
|
|
1620
|
-
if (this.findOptions.lock.mode === "optimistic") {
|
|
1621
|
-
this.setLock(this.findOptions.lock.mode, this.findOptions.lock.version);
|
|
1622
|
-
}
|
|
1623
|
-
else if (this.findOptions.lock.mode === "pessimistic_read" ||
|
|
1624
|
-
this.findOptions.lock.mode === "pessimistic_write" ||
|
|
1625
|
-
this.findOptions.lock.mode === "dirty_read" ||
|
|
1626
|
-
this.findOptions.lock.mode ===
|
|
1627
|
-
"pessimistic_partial_write" ||
|
|
1628
|
-
this.findOptions.lock.mode ===
|
|
1629
|
-
"pessimistic_write_or_fail" ||
|
|
1630
|
-
this.findOptions.lock.mode === "for_no_key_update" ||
|
|
1631
|
-
this.findOptions.lock.mode === "for_key_share") {
|
|
1632
|
-
const tableNames = this.findOptions.lock.tables
|
|
1633
|
-
? this.findOptions.lock.tables.map((table) => {
|
|
1634
|
-
const tableAlias = this.expressionMap.aliases.find((alias) => {
|
|
1635
|
-
return (alias.metadata
|
|
1636
|
-
.tableNameWithoutPrefix === table);
|
|
1637
|
-
});
|
|
1638
|
-
if (!tableAlias) {
|
|
1639
|
-
throw new TypeORMError(`"${table}" is not part of this query`);
|
|
1640
|
-
}
|
|
1641
|
-
return this.escape(tableAlias.name);
|
|
1642
|
-
})
|
|
1643
|
-
: undefined;
|
|
1644
|
-
this.setLock(this.findOptions.lock.mode, undefined, tableNames);
|
|
1645
|
-
if (this.findOptions.lock.onLocked) {
|
|
1646
|
-
this.setOnLocked(this.findOptions.lock.onLocked);
|
|
1647
|
-
}
|
|
1648
|
-
}
|
|
1649
|
-
}
|
|
1650
|
-
if (this.findOptions.loadRelationIds === true) {
|
|
1651
|
-
this.loadAllRelationIds();
|
|
1652
|
-
}
|
|
1653
|
-
else if (typeof this.findOptions.loadRelationIds === "object") {
|
|
1654
|
-
this.loadAllRelationIds(this.findOptions.loadRelationIds);
|
|
1655
|
-
}
|
|
1656
|
-
if (this.findOptions.loadEagerRelations !== false) {
|
|
1657
|
-
FindOptionsUtils.joinEagerRelations(this, this.expressionMap.mainAlias.name, this.expressionMap.mainAlias.metadata);
|
|
1658
|
-
}
|
|
1659
|
-
if (this.findOptions.transaction === true) {
|
|
1660
|
-
this.expressionMap.useTransaction = true;
|
|
1661
|
-
}
|
|
1662
|
-
}
|
|
1663
|
-
}
|
|
1664
|
-
/**
|
|
1665
|
-
* Executes sql generated by query builder and returns object with raw results and entities created from them.
|
|
1666
|
-
*/
|
|
1667
|
-
async executeEntitiesAndRawResults(queryRunner) {
|
|
1668
|
-
if (!this.expressionMap.mainAlias)
|
|
1669
|
-
throw new TypeORMError(`Alias is not set. Use "from" method to set an alias.`);
|
|
1670
|
-
if ((this.expressionMap.lockMode === "pessimistic_read" ||
|
|
1671
|
-
this.expressionMap.lockMode === "pessimistic_write" ||
|
|
1672
|
-
this.expressionMap.lockMode === "pessimistic_partial_write" ||
|
|
1673
|
-
this.expressionMap.lockMode === "pessimistic_write_or_fail" ||
|
|
1674
|
-
this.expressionMap.lockMode === "for_no_key_update" ||
|
|
1675
|
-
this.expressionMap.lockMode === "for_key_share") &&
|
|
1676
|
-
!queryRunner.isTransactionActive)
|
|
1677
|
-
throw new PessimisticLockTransactionRequiredError();
|
|
1678
|
-
if (this.expressionMap.lockMode === "optimistic") {
|
|
1679
|
-
const metadata = this.expressionMap.mainAlias.metadata;
|
|
1680
|
-
if (!metadata.versionColumn && !metadata.updateDateColumn)
|
|
1681
|
-
throw new NoVersionOrUpdateDateColumnError(metadata.name);
|
|
1682
|
-
}
|
|
1683
|
-
const relationIdLoader = new RelationIdLoader(this.connection, queryRunner, this.expressionMap.relationIdAttributes);
|
|
1684
|
-
const relationCountLoader = new RelationCountLoader(this.connection, queryRunner, this.expressionMap.relationCountAttributes);
|
|
1685
|
-
const relationIdMetadataTransformer = new RelationIdMetadataToAttributeTransformer(this.expressionMap);
|
|
1686
|
-
relationIdMetadataTransformer.transform();
|
|
1687
|
-
const relationCountMetadataTransformer = new RelationCountMetadataToAttributeTransformer(this.expressionMap);
|
|
1688
|
-
relationCountMetadataTransformer.transform();
|
|
1689
|
-
let rawResults = [], entities = [];
|
|
1690
|
-
if ((this.expressionMap.skip || this.expressionMap.take) &&
|
|
1691
|
-
this.expressionMap.joinAttributes.length > 0) {
|
|
1692
|
-
const [selects, orderBys] = this.createOrderByCombinedWithSelectExpression("distinctAlias");
|
|
1693
|
-
const metadata = this.expressionMap.mainAlias.metadata;
|
|
1694
|
-
const mainAliasName = this.expressionMap.mainAlias.name;
|
|
1695
|
-
const querySelects = metadata.primaryColumns.map((primaryColumn) => {
|
|
1696
|
-
const distinctAlias = this.escape("distinctAlias");
|
|
1697
|
-
const columnAlias = this.escape(DriverUtils.buildAlias(this.connection.driver, mainAliasName, primaryColumn.databaseName));
|
|
1698
|
-
if (!orderBys[columnAlias])
|
|
1699
|
-
orderBys[columnAlias] = "ASC";
|
|
1700
|
-
const alias = DriverUtils.buildAlias(this.connection.driver, "ids_" + mainAliasName, primaryColumn.databaseName);
|
|
1701
|
-
return `${distinctAlias}.${columnAlias} AS ${this.escape(alias)}`;
|
|
1702
|
-
});
|
|
1703
|
-
rawResults = await new SelectQueryBuilder_1(this.connection, queryRunner)
|
|
1704
|
-
.select(`DISTINCT ${querySelects.join(", ")}`)
|
|
1705
|
-
.addSelect(selects)
|
|
1706
|
-
.from(`(${this.clone().orderBy().getQuery()})`, "distinctAlias")
|
|
1707
|
-
.offset(this.expressionMap.skip)
|
|
1708
|
-
.limit(this.expressionMap.take)
|
|
1709
|
-
.orderBy(orderBys)
|
|
1710
|
-
.cache(this.expressionMap.cache
|
|
1711
|
-
? this.expressionMap.cache
|
|
1712
|
-
: this.expressionMap.cacheId, this.expressionMap.cacheDuration)
|
|
1713
|
-
.setParameters(this.getParameters())
|
|
1714
|
-
.setNativeParameters(this.expressionMap.nativeParameters)
|
|
1715
|
-
.getRawMany();
|
|
1716
|
-
if (rawResults.length > 0) {
|
|
1717
|
-
let condition = "";
|
|
1718
|
-
const parameters = {};
|
|
1719
|
-
if (metadata.hasMultiplePrimaryKeys) {
|
|
1720
|
-
condition = rawResults
|
|
1721
|
-
.map((result, index) => {
|
|
1722
|
-
return metadata.primaryColumns
|
|
1723
|
-
.map((primaryColumn) => {
|
|
1724
|
-
const paramKey = `orm_distinct_ids_${index}_${primaryColumn.databaseName}`;
|
|
1725
|
-
parameters[paramKey] =
|
|
1726
|
-
result[`ids_${mainAliasName}_${primaryColumn.databaseName}`];
|
|
1727
|
-
return `${mainAliasName}.${primaryColumn.propertyPath}=:${paramKey}`;
|
|
1728
|
-
})
|
|
1729
|
-
.join(" AND ");
|
|
1730
|
-
})
|
|
1731
|
-
.join(" OR ");
|
|
1732
|
-
}
|
|
1733
|
-
else {
|
|
1734
|
-
const alias = DriverUtils.buildAlias(this.connection.driver, "ids_" + mainAliasName, metadata.primaryColumns[0].databaseName);
|
|
1735
|
-
const ids = rawResults.map((result) => result[alias]);
|
|
1736
|
-
const areAllNumbers = ids.every((id) => typeof id === "number");
|
|
1737
|
-
if (areAllNumbers) {
|
|
1738
|
-
condition = `${mainAliasName}.${metadata.primaryColumns[0].propertyPath} IN (${ids.join(", ")})`;
|
|
1739
|
-
}
|
|
1740
|
-
else {
|
|
1741
|
-
parameters["orm_distinct_ids"] = ids;
|
|
1742
|
-
condition =
|
|
1743
|
-
mainAliasName +
|
|
1744
|
-
"." +
|
|
1745
|
-
metadata.primaryColumns[0].propertyPath +
|
|
1746
|
-
" IN (:...orm_distinct_ids)";
|
|
1747
|
-
}
|
|
1748
|
-
}
|
|
1749
|
-
rawResults = await this.clone()
|
|
1750
|
-
.mergeExpressionMap({
|
|
1751
|
-
extraAppendedAndWhereCondition: condition,
|
|
1752
|
-
})
|
|
1753
|
-
.setParameters(parameters)
|
|
1754
|
-
.loadRawResults(queryRunner);
|
|
1755
|
-
}
|
|
1756
|
-
}
|
|
1757
|
-
else {
|
|
1758
|
-
rawResults = await this.loadRawResults(queryRunner);
|
|
1759
|
-
}
|
|
1760
|
-
if (rawResults.length > 0) {
|
|
1761
|
-
const rawRelationIdResults = await relationIdLoader.load(rawResults);
|
|
1762
|
-
const rawRelationCountResults = await relationCountLoader.load(rawResults);
|
|
1763
|
-
const transformer = new RawSqlResultsToEntityTransformer(this.expressionMap, this.connection.driver, rawRelationIdResults, rawRelationCountResults, this.queryRunner);
|
|
1764
|
-
entities = transformer.transform(rawResults, this.expressionMap.mainAlias);
|
|
1765
|
-
if (this.expressionMap.callListeners === true &&
|
|
1766
|
-
this.expressionMap.mainAlias.hasMetadata) {
|
|
1767
|
-
await queryRunner.broadcaster.broadcast("Load", this.expressionMap.mainAlias.metadata, entities);
|
|
1768
|
-
}
|
|
1769
|
-
}
|
|
1770
|
-
if (this.expressionMap.relationLoadStrategy === "query") {
|
|
1771
|
-
await Promise.all(this.relationMetadatas.map(async (relation) => {
|
|
1772
|
-
const relationTarget = relation.inverseEntityMetadata.target;
|
|
1773
|
-
const relationAlias = relation.inverseEntityMetadata.targetName;
|
|
1774
|
-
const select = Array.isArray(this.findOptions.select)
|
|
1775
|
-
? OrmUtils.propertyPathsToTruthyObject(this.findOptions.select)
|
|
1776
|
-
: this.findOptions.select;
|
|
1777
|
-
const relations = Array.isArray(this.findOptions.relations)
|
|
1778
|
-
? OrmUtils.propertyPathsToTruthyObject(this.findOptions.relations)
|
|
1779
|
-
: this.findOptions.relations;
|
|
1780
|
-
const queryBuilder = this.createQueryBuilder()
|
|
1781
|
-
.select(relationAlias)
|
|
1782
|
-
.from(relationTarget, relationAlias)
|
|
1783
|
-
.setFindOptions({
|
|
1784
|
-
select: select
|
|
1785
|
-
? OrmUtils.deepValue(select, relation.propertyPath)
|
|
1786
|
-
: undefined,
|
|
1787
|
-
order: this.findOptions.order
|
|
1788
|
-
? OrmUtils.deepValue(this.findOptions.order, relation.propertyPath)
|
|
1789
|
-
: undefined,
|
|
1790
|
-
relations: relations
|
|
1791
|
-
? OrmUtils.deepValue(relations, relation.propertyPath)
|
|
1792
|
-
: undefined,
|
|
1793
|
-
withDeleted: this.findOptions.withDeleted,
|
|
1794
|
-
relationLoadStrategy: this.findOptions.relationLoadStrategy,
|
|
1795
|
-
});
|
|
1796
|
-
if (entities.length > 0) {
|
|
1797
|
-
const relatedEntityGroups = await this.connection.relationIdLoader.loadManyToManyRelationIdsAndGroup(relation, entities, undefined, queryBuilder);
|
|
1798
|
-
entities.forEach((entity) => {
|
|
1799
|
-
const relatedEntityGroup = relatedEntityGroups.find((group) => group.entity === entity);
|
|
1800
|
-
if (relatedEntityGroup) {
|
|
1801
|
-
const value = relatedEntityGroup.related === undefined
|
|
1802
|
-
? null
|
|
1803
|
-
: relatedEntityGroup.related;
|
|
1804
|
-
relation.setEntityValue(entity, value);
|
|
1805
|
-
}
|
|
1806
|
-
});
|
|
1807
|
-
}
|
|
1808
|
-
}));
|
|
1809
|
-
}
|
|
1810
|
-
return {
|
|
1811
|
-
raw: rawResults,
|
|
1812
|
-
entities: entities,
|
|
1813
|
-
};
|
|
1814
|
-
}
|
|
1815
|
-
createOrderByCombinedWithSelectExpression(parentAlias) {
|
|
1816
|
-
const orderBys = this.expressionMap.allOrderBys;
|
|
1817
|
-
const selectString = Object.keys(orderBys)
|
|
1818
|
-
.map((orderCriteria) => {
|
|
1819
|
-
if (orderCriteria.indexOf(".") !== -1) {
|
|
1820
|
-
const criteriaParts = orderCriteria.split(".");
|
|
1821
|
-
const aliasName = criteriaParts[0];
|
|
1822
|
-
const propertyPath = criteriaParts.slice(1).join(".");
|
|
1823
|
-
const alias = this.expressionMap.findAliasByName(aliasName);
|
|
1824
|
-
const column = alias.metadata.findColumnWithPropertyPath(propertyPath);
|
|
1825
|
-
return (this.escape(parentAlias) +
|
|
1826
|
-
"." +
|
|
1827
|
-
this.escape(DriverUtils.buildAlias(this.connection.driver, aliasName, column.databaseName)));
|
|
1828
|
-
}
|
|
1829
|
-
else {
|
|
1830
|
-
if (this.expressionMap.selects.find((select) => select.selection === orderCriteria ||
|
|
1831
|
-
select.aliasName === orderCriteria))
|
|
1832
|
-
return this.escape(parentAlias) + "." + orderCriteria;
|
|
1833
|
-
return "";
|
|
1834
|
-
}
|
|
1835
|
-
})
|
|
1836
|
-
.join(", ");
|
|
1837
|
-
const orderByObject = {};
|
|
1838
|
-
Object.keys(orderBys).forEach((orderCriteria) => {
|
|
1839
|
-
if (orderCriteria.indexOf(".") !== -1) {
|
|
1840
|
-
const criteriaParts = orderCriteria.split(".");
|
|
1841
|
-
const aliasName = criteriaParts[0];
|
|
1842
|
-
const propertyPath = criteriaParts.slice(1).join(".");
|
|
1843
|
-
const alias = this.expressionMap.findAliasByName(aliasName);
|
|
1844
|
-
const column = alias.metadata.findColumnWithPropertyPath(propertyPath);
|
|
1845
|
-
orderByObject[this.escape(parentAlias) +
|
|
1846
|
-
"." +
|
|
1847
|
-
this.escape(DriverUtils.buildAlias(this.connection.driver, aliasName, column.databaseName))] = orderBys[orderCriteria];
|
|
1848
|
-
}
|
|
1849
|
-
else {
|
|
1850
|
-
if (this.expressionMap.selects.find((select) => select.selection === orderCriteria ||
|
|
1851
|
-
select.aliasName === orderCriteria)) {
|
|
1852
|
-
orderByObject[this.escape(parentAlias) + "." + orderCriteria] = orderBys[orderCriteria];
|
|
1853
|
-
}
|
|
1854
|
-
else {
|
|
1855
|
-
orderByObject[orderCriteria] = orderBys[orderCriteria];
|
|
1856
|
-
}
|
|
1857
|
-
}
|
|
1858
|
-
});
|
|
1859
|
-
return [selectString, orderByObject];
|
|
1860
|
-
}
|
|
1861
|
-
/**
|
|
1862
|
-
* Loads raw results from the database.
|
|
1863
|
-
*/
|
|
1864
|
-
async loadRawResults(queryRunner) {
|
|
1865
|
-
const [sql, parameters] = this.getQueryAndParameters();
|
|
1866
|
-
const queryId = sql + " -- PARAMETERS: " + JSON.stringify(parameters);
|
|
1867
|
-
const cacheOptions = typeof this.connection.options.cache === "object"
|
|
1868
|
-
? this.connection.options.cache
|
|
1869
|
-
: {};
|
|
1870
|
-
let savedQueryResultCacheOptions = undefined;
|
|
1871
|
-
let cacheError = false;
|
|
1872
|
-
if (this.connection.queryResultCache &&
|
|
1873
|
-
(this.expressionMap.cache || cacheOptions.alwaysEnabled)) {
|
|
1874
|
-
try {
|
|
1875
|
-
savedQueryResultCacheOptions =
|
|
1876
|
-
await this.connection.queryResultCache.getFromCache({
|
|
1877
|
-
identifier: this.expressionMap.cacheId,
|
|
1878
|
-
query: queryId,
|
|
1879
|
-
duration: this.expressionMap.cacheDuration ||
|
|
1880
|
-
cacheOptions.duration ||
|
|
1881
|
-
1000,
|
|
1882
|
-
}, queryRunner);
|
|
1883
|
-
if (savedQueryResultCacheOptions &&
|
|
1884
|
-
!this.connection.queryResultCache.isExpired(savedQueryResultCacheOptions)) {
|
|
1885
|
-
return JSON.parse(savedQueryResultCacheOptions.result);
|
|
1886
|
-
}
|
|
1887
|
-
}
|
|
1888
|
-
catch (error) {
|
|
1889
|
-
if (!cacheOptions.ignoreErrors) {
|
|
1890
|
-
throw error;
|
|
1891
|
-
}
|
|
1892
|
-
cacheError = true;
|
|
1893
|
-
}
|
|
1894
|
-
}
|
|
1895
|
-
const results = await queryRunner.query(sql, parameters, true);
|
|
1896
|
-
if (!cacheError &&
|
|
1897
|
-
this.connection.queryResultCache &&
|
|
1898
|
-
(this.expressionMap.cache || cacheOptions.alwaysEnabled)) {
|
|
1899
|
-
try {
|
|
1900
|
-
await this.connection.queryResultCache.storeInCache({
|
|
1901
|
-
identifier: this.expressionMap.cacheId,
|
|
1902
|
-
query: queryId,
|
|
1903
|
-
time: new Date().getTime(),
|
|
1904
|
-
duration: this.expressionMap.cacheDuration ||
|
|
1905
|
-
cacheOptions.duration ||
|
|
1906
|
-
1000,
|
|
1907
|
-
result: JSON.stringify(results.records),
|
|
1908
|
-
}, savedQueryResultCacheOptions, queryRunner);
|
|
1909
|
-
}
|
|
1910
|
-
catch (error) {
|
|
1911
|
-
if (!cacheOptions.ignoreErrors) {
|
|
1912
|
-
throw error;
|
|
1913
|
-
}
|
|
1914
|
-
}
|
|
1915
|
-
}
|
|
1916
|
-
return results.records;
|
|
1917
|
-
}
|
|
1918
|
-
/**
|
|
1919
|
-
* Merges into expression map given expression map properties.
|
|
1920
|
-
*/
|
|
1921
|
-
mergeExpressionMap(expressionMap) {
|
|
1922
|
-
ObjectUtils.assign(this.expressionMap, expressionMap);
|
|
1923
|
-
return this;
|
|
1924
|
-
}
|
|
1925
|
-
/**
|
|
1926
|
-
* Normalizes a give number - converts to int if possible.
|
|
1927
|
-
*/
|
|
1928
|
-
normalizeNumber(num) {
|
|
1929
|
-
if (typeof num === "number" || num === undefined || num === null)
|
|
1930
|
-
return num;
|
|
1931
|
-
return Number(num);
|
|
1932
|
-
}
|
|
1933
|
-
/**
|
|
1934
|
-
* Creates a query builder used to execute sql queries inside this query builder.
|
|
1935
|
-
*/
|
|
1936
|
-
obtainQueryRunner() {
|
|
1937
|
-
return this.queryRunner || this.connection.createQueryRunner("slave");
|
|
1938
|
-
}
|
|
1939
|
-
buildSelect(select, metadata, alias, embedPrefix) {
|
|
1940
|
-
for (let key in select) {
|
|
1941
|
-
if (select[key] === undefined || select[key] === false)
|
|
1942
|
-
continue;
|
|
1943
|
-
const propertyPath = embedPrefix ? embedPrefix + "." + key : key;
|
|
1944
|
-
const column = metadata.findColumnWithPropertyPathStrict(propertyPath);
|
|
1945
|
-
const embed = metadata.findEmbeddedWithPropertyPath(propertyPath);
|
|
1946
|
-
const relation = metadata.findRelationWithPropertyPath(propertyPath);
|
|
1947
|
-
if (!embed && !column && !relation)
|
|
1948
|
-
throw new EntityPropertyNotFoundError(propertyPath, metadata);
|
|
1949
|
-
if (column) {
|
|
1950
|
-
this.selects.push(alias + "." + propertyPath);
|
|
1951
|
-
}
|
|
1952
|
-
else if (embed) {
|
|
1953
|
-
this.buildSelect(// @ts-ignore
|
|
1954
|
-
select[key], metadata, alias, propertyPath);
|
|
1955
|
-
}
|
|
1956
|
-
}
|
|
1957
|
-
}
|
|
1958
|
-
buildRelations(relations, selection, metadata, alias, embedPrefix) {
|
|
1959
|
-
if (!relations)
|
|
1960
|
-
return;
|
|
1961
|
-
Object.keys(relations).forEach((relationName) => {
|
|
1962
|
-
const relationValue = relations[relationName];
|
|
1963
|
-
const propertyPath = embedPrefix
|
|
1964
|
-
? embedPrefix + "." + relationName
|
|
1965
|
-
: relationName;
|
|
1966
|
-
const embed = metadata.findEmbeddedWithPropertyPath(propertyPath);
|
|
1967
|
-
const relation = metadata.findRelationWithPropertyPath(propertyPath);
|
|
1968
|
-
if (!embed && !relation)
|
|
1969
|
-
throw new EntityPropertyNotFoundError(propertyPath, metadata);
|
|
1970
|
-
if (embed) {
|
|
1971
|
-
this.buildRelations(relationValue, typeof selection === "object"
|
|
1972
|
-
? OrmUtils.deepValue(selection, embed.propertyPath)
|
|
1973
|
-
: undefined, metadata, alias, propertyPath);
|
|
1974
|
-
}
|
|
1975
|
-
else if (relation) {
|
|
1976
|
-
let joinAlias = alias + "_" + propertyPath.replace(".", "_");
|
|
1977
|
-
joinAlias = DriverUtils.buildAlias(this.connection.driver, { joiner: "__" }, alias, joinAlias);
|
|
1978
|
-
if (relationValue === true ||
|
|
1979
|
-
typeof relationValue === "object") {
|
|
1980
|
-
if (this.expressionMap.relationLoadStrategy === "query") {
|
|
1981
|
-
this.relationMetadatas.push(relation);
|
|
1982
|
-
}
|
|
1983
|
-
else {
|
|
1984
|
-
this.joins.push({
|
|
1985
|
-
type: "left",
|
|
1986
|
-
select: true,
|
|
1987
|
-
selection: selection &&
|
|
1988
|
-
typeof selection[relationName] === "object" // @ts-ignore
|
|
1989
|
-
? selection[relationName]
|
|
1990
|
-
: undefined,
|
|
1991
|
-
alias: joinAlias,
|
|
1992
|
-
parentAlias: alias,
|
|
1993
|
-
relationMetadata: relation,
|
|
1994
|
-
});
|
|
1995
|
-
if (selection &&
|
|
1996
|
-
typeof selection[relationName] === "object") {
|
|
1997
|
-
this.buildSelect(// @ts-ignore
|
|
1998
|
-
selection[relationName], relation.inverseEntityMetadata, joinAlias);
|
|
1999
|
-
}
|
|
2000
|
-
}
|
|
2001
|
-
}
|
|
2002
|
-
if (typeof relationValue === "object" &&
|
|
2003
|
-
this.expressionMap.relationLoadStrategy === "join") {
|
|
2004
|
-
this.buildRelations(relationValue, typeof selection === "object"
|
|
2005
|
-
? OrmUtils.deepValue(selection, relation.propertyPath)
|
|
2006
|
-
: undefined, relation.inverseEntityMetadata, joinAlias, undefined);
|
|
2007
|
-
}
|
|
2008
|
-
}
|
|
2009
|
-
});
|
|
2010
|
-
}
|
|
2011
|
-
buildEagerRelations(relations, selection, metadata, alias, embedPrefix) {
|
|
2012
|
-
if (!relations)
|
|
2013
|
-
return;
|
|
2014
|
-
Object.keys(relations).forEach((relationName) => {
|
|
2015
|
-
const relationValue = relations[relationName];
|
|
2016
|
-
const propertyPath = embedPrefix
|
|
2017
|
-
? embedPrefix + "." + relationName
|
|
2018
|
-
: relationName;
|
|
2019
|
-
const embed = metadata.findEmbeddedWithPropertyPath(propertyPath);
|
|
2020
|
-
const relation = metadata.findRelationWithPropertyPath(propertyPath);
|
|
2021
|
-
if (!embed && !relation)
|
|
2022
|
-
throw new EntityPropertyNotFoundError(propertyPath, metadata);
|
|
2023
|
-
if (embed) {
|
|
2024
|
-
this.buildEagerRelations(relationValue, typeof selection === "object"
|
|
2025
|
-
? OrmUtils.deepValue(selection, embed.propertyPath)
|
|
2026
|
-
: undefined, metadata, alias, propertyPath);
|
|
2027
|
-
}
|
|
2028
|
-
else if (relation) {
|
|
2029
|
-
let joinAlias = alias + "_" + propertyPath.replace(".", "_");
|
|
2030
|
-
joinAlias = DriverUtils.buildAlias(this.connection.driver, { joiner: "__" }, alias, joinAlias);
|
|
2031
|
-
if (relationValue === true ||
|
|
2032
|
-
typeof relationValue === "object") {
|
|
2033
|
-
relation.inverseEntityMetadata.eagerRelations.forEach((eagerRelation) => {
|
|
2034
|
-
let eagerRelationJoinAlias = joinAlias +
|
|
2035
|
-
"_" +
|
|
2036
|
-
eagerRelation.propertyPath.replace(".", "_");
|
|
2037
|
-
eagerRelationJoinAlias = DriverUtils.buildAlias(this.connection.driver, { joiner: "__" }, joinAlias, eagerRelationJoinAlias);
|
|
2038
|
-
const existJoin = this.joins.find((join) => join.alias === eagerRelationJoinAlias);
|
|
2039
|
-
if (!existJoin) {
|
|
2040
|
-
this.joins.push({
|
|
2041
|
-
type: "left",
|
|
2042
|
-
select: true,
|
|
2043
|
-
alias: eagerRelationJoinAlias,
|
|
2044
|
-
parentAlias: joinAlias,
|
|
2045
|
-
selection: undefined,
|
|
2046
|
-
relationMetadata: eagerRelation,
|
|
2047
|
-
});
|
|
2048
|
-
}
|
|
2049
|
-
if (selection &&
|
|
2050
|
-
typeof selection[relationName] === "object") {
|
|
2051
|
-
this.buildSelect(// @ts-ignore
|
|
2052
|
-
selection[relationName], relation.inverseEntityMetadata, joinAlias);
|
|
2053
|
-
}
|
|
2054
|
-
});
|
|
2055
|
-
}
|
|
2056
|
-
if (typeof relationValue === "object") {
|
|
2057
|
-
this.buildEagerRelations(relationValue, typeof selection === "object"
|
|
2058
|
-
? OrmUtils.deepValue(selection, relation.propertyPath)
|
|
2059
|
-
: undefined, relation.inverseEntityMetadata, joinAlias, undefined);
|
|
2060
|
-
}
|
|
2061
|
-
}
|
|
2062
|
-
});
|
|
2063
|
-
}
|
|
2064
|
-
buildOrder(order, metadata, alias, embedPrefix) {
|
|
2065
|
-
for (let key in order) {
|
|
2066
|
-
if (order[key] === undefined)
|
|
2067
|
-
continue;
|
|
2068
|
-
const propertyPath = embedPrefix ? embedPrefix + "." + key : key;
|
|
2069
|
-
const column = metadata.findColumnWithPropertyPathStrict(propertyPath);
|
|
2070
|
-
const embed = metadata.findEmbeddedWithPropertyPath(propertyPath);
|
|
2071
|
-
const relation = metadata.findRelationWithPropertyPath(propertyPath);
|
|
2072
|
-
if (!embed && !column && !relation)
|
|
2073
|
-
throw new EntityPropertyNotFoundError(propertyPath, metadata);
|
|
2074
|
-
if (column) {
|
|
2075
|
-
let direction = typeof order[key] === "object"
|
|
2076
|
-
? order[key].direction
|
|
2077
|
-
: order[key];
|
|
2078
|
-
direction =
|
|
2079
|
-
direction === "DESC" ||
|
|
2080
|
-
direction === "desc" ||
|
|
2081
|
-
direction === -1
|
|
2082
|
-
? "DESC"
|
|
2083
|
-
: "ASC";
|
|
2084
|
-
let nulls = typeof order[key] === "object"
|
|
2085
|
-
? order[key].nulls
|
|
2086
|
-
: undefined;
|
|
2087
|
-
nulls =
|
|
2088
|
-
nulls?.toLowerCase() === "first"
|
|
2089
|
-
? "NULLS FIRST"
|
|
2090
|
-
: nulls?.toLowerCase() === "last"
|
|
2091
|
-
? "NULLS LAST"
|
|
2092
|
-
: undefined;
|
|
2093
|
-
let aliasPath = `${alias}.${propertyPath}`;
|
|
2094
|
-
if (column.isVirtualProperty && column.query) {
|
|
2095
|
-
const selection = this.expressionMap.selects.find((s) => s.selection === aliasPath);
|
|
2096
|
-
if (selection) {
|
|
2097
|
-
aliasPath = DriverUtils.buildAlias(this.connection.driver, alias, column.databaseName);
|
|
2098
|
-
selection.aliasName = aliasPath;
|
|
2099
|
-
}
|
|
2100
|
-
else {
|
|
2101
|
-
aliasPath = `(${column.query(alias)})`;
|
|
2102
|
-
}
|
|
2103
|
-
}
|
|
2104
|
-
this.addOrderBy(aliasPath, direction, nulls);
|
|
2105
|
-
}
|
|
2106
|
-
else if (embed) {
|
|
2107
|
-
this.buildOrder(order[key], metadata, alias, propertyPath);
|
|
2108
|
-
}
|
|
2109
|
-
else if (relation) {
|
|
2110
|
-
let joinAlias = alias + "_" + propertyPath.replace(".", "_");
|
|
2111
|
-
joinAlias = DriverUtils.buildAlias(this.connection.driver, { joiner: "__" }, alias, joinAlias);
|
|
2112
|
-
const existJoin = this.joins.find((join) => join.alias === joinAlias);
|
|
2113
|
-
if (!existJoin) {
|
|
2114
|
-
this.joins.push({
|
|
2115
|
-
type: "left",
|
|
2116
|
-
select: false,
|
|
2117
|
-
alias: joinAlias,
|
|
2118
|
-
parentAlias: alias,
|
|
2119
|
-
selection: undefined,
|
|
2120
|
-
relationMetadata: relation,
|
|
2121
|
-
});
|
|
2122
|
-
}
|
|
2123
|
-
this.buildOrder(order[key], relation.inverseEntityMetadata, joinAlias);
|
|
2124
|
-
}
|
|
2125
|
-
}
|
|
2126
|
-
}
|
|
2127
|
-
buildWhere(where, metadata, alias, embedPrefix) {
|
|
2128
|
-
let condition = "";
|
|
2129
|
-
if (Array.isArray(where)) {
|
|
2130
|
-
condition =
|
|
2131
|
-
"(" +
|
|
2132
|
-
where
|
|
2133
|
-
.map((whereItem) => {
|
|
2134
|
-
return this.buildWhere(whereItem, metadata, alias, embedPrefix);
|
|
2135
|
-
})
|
|
2136
|
-
.filter((condition) => !!condition)
|
|
2137
|
-
.map((condition) => "(" + condition + ")")
|
|
2138
|
-
.join(" OR ") +
|
|
2139
|
-
")";
|
|
2140
|
-
}
|
|
2141
|
-
else {
|
|
2142
|
-
let andConditions = [];
|
|
2143
|
-
for (let key in where) {
|
|
2144
|
-
if (where[key] === undefined || where[key] === null)
|
|
2145
|
-
continue;
|
|
2146
|
-
const propertyPath = embedPrefix ? embedPrefix + "." + key : key;
|
|
2147
|
-
const column = metadata.findColumnWithPropertyPathStrict(propertyPath);
|
|
2148
|
-
const embed = metadata.findEmbeddedWithPropertyPath(propertyPath);
|
|
2149
|
-
const relation = metadata.findRelationWithPropertyPath(propertyPath);
|
|
2150
|
-
if (!embed && !column && !relation)
|
|
2151
|
-
throw new EntityPropertyNotFoundError(propertyPath, metadata);
|
|
2152
|
-
if (column) {
|
|
2153
|
-
let aliasPath = `${alias}.${propertyPath}`;
|
|
2154
|
-
if (column.isVirtualProperty && column.query) {
|
|
2155
|
-
aliasPath = `(${column.query(alias)})`;
|
|
2156
|
-
}
|
|
2157
|
-
let parameterValue = where[key];
|
|
2158
|
-
if (InstanceChecker.isEqualOperator(where[key])) {
|
|
2159
|
-
parameterValue = where[key].value;
|
|
2160
|
-
}
|
|
2161
|
-
if (column.transformer) {
|
|
2162
|
-
parameterValue = ApplyValueTransformers.transformTo(column.transformer, parameterValue);
|
|
2163
|
-
}
|
|
2164
|
-
//
|
|
2165
|
-
//
|
|
2166
|
-
andConditions.push(this.createWhereConditionExpression(this.getWherePredicateCondition(aliasPath, parameterValue)));
|
|
2167
|
-
}
|
|
2168
|
-
else if (embed) {
|
|
2169
|
-
const condition = this.buildWhere(where[key], metadata, alias, propertyPath);
|
|
2170
|
-
if (condition)
|
|
2171
|
-
andConditions.push(condition);
|
|
2172
|
-
}
|
|
2173
|
-
else if (relation) {
|
|
2174
|
-
if (typeof where[key] === "object") {
|
|
2175
|
-
const allAllUndefined = Object.keys(where[key]).every((k) => where[key][k] === undefined);
|
|
2176
|
-
if (allAllUndefined) {
|
|
2177
|
-
continue;
|
|
2178
|
-
}
|
|
2179
|
-
}
|
|
2180
|
-
if (InstanceChecker.isFindOperator(where[key])) {
|
|
2181
|
-
if (where[key].type === "moreThan" ||
|
|
2182
|
-
where[key].type === "lessThan") {
|
|
2183
|
-
const sqlOperator = where[key].type === "moreThan" ? ">" : "<";
|
|
2184
|
-
const qb = this.subQuery();
|
|
2185
|
-
if (relation.isManyToManyOwner) {
|
|
2186
|
-
qb.select("COUNT(*)")
|
|
2187
|
-
.from(relation.joinTableName, relation.joinTableName)
|
|
2188
|
-
.where(relation.joinColumns
|
|
2189
|
-
.map((column) => {
|
|
2190
|
-
return `${relation.joinTableName}.${column.propertyName} = ${alias}.${column.referencedColumn
|
|
2191
|
-
.propertyName}`;
|
|
2192
|
-
})
|
|
2193
|
-
.join(" AND "));
|
|
2194
|
-
}
|
|
2195
|
-
else if (relation.isManyToManyNotOwner) {
|
|
2196
|
-
qb.select("COUNT(*)")
|
|
2197
|
-
.from(relation.inverseRelation.joinTableName, relation.inverseRelation.joinTableName)
|
|
2198
|
-
.where(relation
|
|
2199
|
-
.inverseRelation.inverseJoinColumns.map((column) => {
|
|
2200
|
-
return `${relation.inverseRelation
|
|
2201
|
-
.joinTableName}.${column.propertyName} = ${alias}.${column.referencedColumn
|
|
2202
|
-
.propertyName}`;
|
|
2203
|
-
})
|
|
2204
|
-
.join(" AND "));
|
|
2205
|
-
}
|
|
2206
|
-
else if (relation.isOneToMany) {
|
|
2207
|
-
qb.select("COUNT(*)")
|
|
2208
|
-
.from(relation.inverseEntityMetadata.target, relation.inverseEntityMetadata
|
|
2209
|
-
.tableName)
|
|
2210
|
-
.where(relation
|
|
2211
|
-
.inverseRelation.joinColumns.map((column) => {
|
|
2212
|
-
return `${relation
|
|
2213
|
-
.inverseEntityMetadata
|
|
2214
|
-
.tableName}.${column.propertyName} = ${alias}.${column.referencedColumn
|
|
2215
|
-
.propertyName}`;
|
|
2216
|
-
})
|
|
2217
|
-
.join(" AND "));
|
|
2218
|
-
}
|
|
2219
|
-
else {
|
|
2220
|
-
throw new Error(`This relation isn't supported by given find operator`);
|
|
2221
|
-
}
|
|
2222
|
-
this.andWhere(qb.getSql() +
|
|
2223
|
-
" " +
|
|
2224
|
-
sqlOperator +
|
|
2225
|
-
" " +
|
|
2226
|
-
parseInt(where[key].value));
|
|
2227
|
-
}
|
|
2228
|
-
else {
|
|
2229
|
-
if (relation.isManyToOne ||
|
|
2230
|
-
(relation.isOneToOne &&
|
|
2231
|
-
relation.isOneToOneOwner)) {
|
|
2232
|
-
const aliasPath = `${alias}.${propertyPath}`;
|
|
2233
|
-
andConditions.push(this.createWhereConditionExpression(this.getWherePredicateCondition(aliasPath, where[key])));
|
|
2234
|
-
}
|
|
2235
|
-
else {
|
|
2236
|
-
throw new Error(`This relation isn't supported by given find operator`);
|
|
2237
|
-
}
|
|
2238
|
-
}
|
|
2239
|
-
}
|
|
2240
|
-
else {
|
|
2241
|
-
let joinAlias = alias +
|
|
2242
|
-
"_" +
|
|
2243
|
-
relation.propertyPath.replace(".", "_");
|
|
2244
|
-
joinAlias = DriverUtils.buildAlias(this.connection.driver, { joiner: "__" }, alias, joinAlias);
|
|
2245
|
-
const existJoin = this.joins.find((join) => join.alias === joinAlias);
|
|
2246
|
-
if (!existJoin) {
|
|
2247
|
-
this.joins.push({
|
|
2248
|
-
type: "inner",
|
|
2249
|
-
select: false,
|
|
2250
|
-
selection: undefined,
|
|
2251
|
-
alias: joinAlias,
|
|
2252
|
-
parentAlias: alias,
|
|
2253
|
-
relationMetadata: relation,
|
|
2254
|
-
});
|
|
2255
|
-
}
|
|
2256
|
-
else {
|
|
2257
|
-
if (existJoin.type === "left")
|
|
2258
|
-
existJoin.type = "inner";
|
|
2259
|
-
}
|
|
2260
|
-
const condition = this.buildWhere(where[key], relation.inverseEntityMetadata, joinAlias);
|
|
2261
|
-
if (condition) {
|
|
2262
|
-
andConditions.push(condition);
|
|
2263
|
-
}
|
|
2264
|
-
}
|
|
2265
|
-
}
|
|
2266
|
-
}
|
|
2267
|
-
condition = andConditions.join(" AND ");
|
|
2268
|
-
}
|
|
2269
|
-
return condition;
|
|
2270
|
-
}
|
|
2271
|
-
};
|
|
2272
|
-
SelectQueryBuilder = SelectQueryBuilder_1 = __decorate([
|
|
2273
|
-
CLASS.NAME('SelectQueryBuilder')
|
|
2274
|
-
], SelectQueryBuilder);
|
|
2275
|
-
export { SelectQueryBuilder };
|
|
2276
|
-
;
|
|
2277
|
-
({}); // @--end-of-file-for-module=taon-typeorm lib/typeorm/query-builder/SelectQueryBuilder.ts
|
|
2278
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VsZWN0UXVlcnlCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdG1wLWxpYnMtZm9yLWRpc3Qtd2Vic3FsL3Rhb24tdHlwZW9ybS9wcm9qZWN0cy90YW9uLXR5cGVvcm0vc3JjL2xpYi90eXBlb3JtL3F1ZXJ5LWJ1aWxkZXIvU2VsZWN0UXVlcnlCdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBRUEsT0FBTyxFQUFFLGdDQUFnQyxFQUFFLE1BQU0sZ0RBQWdELENBQUE7QUFFakcsT0FBTyxFQUFFLHVDQUF1QyxFQUFFLE1BQU0sa0RBQWtELENBQUE7QUFDMUcsT0FBTyxFQUFFLGdDQUFnQyxFQUFFLE1BQU0sMkNBQTJDLENBQUE7QUFDNUYsT0FBTyxFQUFFLGtDQUFrQyxFQUFFLE1BQU0sNkNBQTZDLENBQUE7QUFDaEcsT0FBTyxFQUFFLCtCQUErQixFQUFFLE1BQU0sMENBQTBDLENBQUE7QUFDMUYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFBO0FBQy9DLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFBO0FBQ3ZFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHlDQUF5QyxDQUFBO0FBQ2hGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFBO0FBQ2pFLE9BQU8sRUFBRSx3Q0FBd0MsRUFBRSxNQUFNLHdEQUF3RCxDQUFBO0FBQ2pILE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFBO0FBQzFFLE9BQU8sRUFBRSwyQ0FBMkMsRUFBRSxNQUFNLDhEQUE4RCxDQUFBO0FBQzFILE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUM3QyxLQUFLO0FBQ0wsS0FBSztBQUVMLE9BQU8sRUFBRSxrQ0FBa0MsRUFBRSxNQUFNLDZDQUE2QyxDQUFBO0FBY2hHLE9BQU8sRUFBRSxtQ0FBbUMsRUFB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Zm9ybWVyIH0gZnJvbSBcIi4vdHJhbnNmb3JtZXIvUmF3U3FsUmVzdWx0c1RvRW50aXR5VHJhbnNmb3JtZXJcIlxuaW1wb3J0IHsgT2JqZWN0TGl0ZXJhbCB9IGZyb20gXCIuLi9jb21tb24vT2JqZWN0TGl0ZXJhbFwiXG5pbXBvcnQgeyBQZXNzaW1pc3RpY0xvY2tUcmFuc2FjdGlvblJlcXVpcmVkRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3IvUGVzc2ltaXN0aWNMb2NrVHJhbnNhY3Rpb25SZXF1aXJlZEVycm9yXCJcbmltcG9ydCB7IE5vVmVyc2lvbk9yVXBkYXRlRGF0ZUNvbHVtbkVycm9yIH0gZnJvbSBcIi4uL2Vycm9yL05vVmVyc2lvbk9yVXBkYXRlRGF0ZUNvbHVtbkVycm9yXCJcbmltcG9ydCB7IE9wdGltaXN0aWNMb2NrVmVyc2lvbk1pc21hdGNoRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3IvT3B0aW1pc3RpY0xvY2tWZXJzaW9uTWlzbWF0Y2hFcnJvclwiXG5pbXBvcnQgeyBPcHRpbWlzdGljTG9ja0Nhbk5vdEJlVXNlZEVycm9yIH0gZnJvbSBcIi4uL2Vycm9yL09wdGltaXN0aWNMb2NrQ2FuTm90QmVVc2VkRXJyb3JcIlxuaW1wb3J0IHsgSm9pbkF0dHJpYnV0ZSB9IGZyb20gXCIuL0pvaW5BdHRyaWJ1dGVcIlxuaW1wb3J0IHsgUmVsYXRpb25JZEF0dHJpYnV0ZSB9IGZyb20gXCIuL3JlbGF0aW9uLWlkL1JlbGF0aW9uSWRBdHRyaWJ1dGVcIlxuaW1wb3J0IHsgUmVsYXRpb25Db3VudEF0dHJpYnV0ZSB9IGZyb20gXCIuL3JlbGF0aW9uLWNvdW50L1JlbGF0aW9uQ291bnRBdHRyaWJ1dGVcIlxuaW1wb3J0IHsgUmVsYXRpb25JZExvYWRlciB9IGZyb20gXCIuL3JlbGF0aW9uLWlkL1JlbGF0aW9uSWRMb2FkZXJcIlxuaW1wb3J0IHsgUmVsYXRpb25JZE1ldGFkYXRhVG9BdHRyaWJ1dGVUcmFuc2Zvcm1lciB9IGZyb20gXCIuL3JlbGF0aW9uLWlkL1JlbGF0aW9uSWRNZXRhZGF0YVRvQXR0cmlidXRlVHJhbnNmb3JtZXJcIlxuaW1wb3J0IHsgUmVsYXRpb25Db3VudExvYWRlciB9IGZyb20gXCIuL3JlbGF0aW9uLWNvdW50L1JlbGF0aW9uQ291bnRMb2FkZXJcIlxuaW1wb3J0IHsgUmVsYXRpb25Db3VudE1ldGFkYXRhVG9BdHRyaWJ1dGVUcmFuc2Zvcm1lciB9IGZyb20gXCIuL3JlbGF0aW9uLWNvdW50L1JlbGF0aW9uQ291bnRNZXRhZGF0YVRvQXR0cmlidXRlVHJhbnNmb3JtZXJcIlxuaW1wb3J0IHsgUXVlcnlCdWlsZGVyIH0gZnJvbSBcIi4vUXVlcnlCdWlsZGVyXCJcbi8qICovXG4vKiAqL1xuICBcbmltcG9ydCB7IExvY2tOb3RTdXBwb3J0ZWRPbkdpdmVuRHJpdmVyRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3IvTG9ja05vdFN1cHBvcnRlZE9uR2l2ZW5Ecml2ZXJFcnJvclwiXG4vKiAqL1xuLyogKi9cbiAgXG5pbXBvcnQgeyBTZWxlY3RRdWVyeSB9IGZyb20gXCIuL1NlbGVjdFF1ZXJ5XCJcbmltcG9ydCB7IEVudGl0eU1ldGFkYXRhIH0gZnJvbSBcIi4uL21ldGFkYXRhL0VudGl0eU1ldGFkYXRhXCJcbmltcG9ydCB7IENvbHVtbk1ldGFkYXRhIH0gZnJvbSBcIi4uL21ldGFkYXRhL0NvbHVtbk1ldGFkYXRhXCJcbmltcG9ydCB7IE9yZGVyQnlDb25kaXRpb24gfSBmcm9tIFwiLi4vZmluZC1vcHRpb25zL09yZGVyQnlDb25kaXRpb25cIlxuaW1wb3J0IHsgUXVlcnlFeHByZXNzaW9uTWFwIH0gZnJvbSBcIi4vUXVlcnlFeHByZXNzaW9uTWFwXCJcbmltcG9ydCB7IEVudGl0eVRhcmdldCB9IGZyb20gXCIuLi9jb21tb24vRW50aXR5VGFyZ2V0XCJcbmltcG9ydCB7IFF1ZXJ5UnVubmVyIH0gZnJvbSBcIi4uL3F1ZXJ5LXJ1bm5lci9RdWVyeVJ1bm5lclwiXG5pbXBvcnQgeyBXaGVyZUV4cHJlc3Npb25CdWlsZGVyIH0gZnJvbSBcIi4vV2hlcmVFeHByZXNzaW9uQnVpbGRlclwiXG5pbXBvcnQgeyBCcmFja2V0cyB9IGZyb20gXCIuL0JyYWNrZXRzXCJcbmltcG9ydCB7IFF1ZXJ5UmVzdWx0Q2FjaGVPcHRpb25zIH0gZnJvbSBcIi4uL2NhY2hlL1F1ZXJ5UmVzdWx0Q2FjaGVPcHRpb25zXCJcbmltcG9ydCB7IE9mZnNldFdpdGhvdXRMaW1pdE5vdFN1cHBvcnRlZEVycm9yIH0gZnJvbSBcIi4uL2Vycm9yL09mZnNldFdpdGhvdXRMaW1pdE5vdFN1cHBvcnRlZEVycm9yXCJcbmltcG9ydCB7IFNlbGVjdFF1ZXJ5QnVpbGRlck9wdGlvbiB9IGZyb20gXCIuL1NlbGVjdFF1ZXJ5QnVpbGRlck9wdGlvblwiXG5pbXBvcnQgeyBPYmplY3RVdGlscyB9IGZyb20gXCIuLi91dGlsL09iamVjdFV0aWxzXCJcbmltcG9ydCB7IERyaXZlclV0aWxzIH0gZnJvbSBcIi4uL2RyaXZlci9Ecml2ZXJVdGlsc1wiXG5pbXBvcnQgeyBFbnRpdHlOb3RGb3VuZEVycm9yIH0gZnJvbSBcIi4uL2Vycm9yL0VudGl0eU5vdEZvdW5kRXJyb3JcIlxuaW1wb3J0IHsgVHlwZU9STUVycm9yIH0gZnJvbSBcIi4uL2Vycm9yXCJcbmltcG9ydCB7IEZpbmRNYW55T3B0aW9ucyB9IGZyb20gXCIuLi9maW5kLW9wdGlvbnMvRmluZE1hbnlPcHRpb25zXCJcbmltcG9ydCB7IEZpbmRPcHRpb25zU2VsZWN0IH0gZnJvbSBcIi4uL2ZpbmQtb3B0aW9ucy9GaW5kT3B0aW9uc1NlbGVjdFwiXG5pbXBvcnQgeyBSZWxhdGlvbk1ldGFkYXRhIH0gZnJvbSBcIi4uL21ldGFkYXRhL1JlbGF0aW9uTWV0YWRhdGFcIlxuaW1wb3J0IHsgRmluZE9wdGlvbnNPcmRlciB9IGZyb20gXCIuLi9maW5kLW9wdGlvbnMvRmluZE9wdGlvbnNPcmRlclwiXG5pbXBvcnQgeyBGaW5kT3B0aW9uc1doZXJlIH0gZnJvbSBcIi4uL2ZpbmQtb3B0aW9ucy9GaW5kT3B0aW9uc1doZXJlXCJcbmltcG9ydCB7IEZpbmRPcHRpb25zVXRpbHMgfSBmcm9tIFwiLi4vZmluZC1vcHRpb25zL0ZpbmRPcHRpb25zVXRpbHNcIlxuaW1wb3J0IHsgRmluZE9wdGlvbnNSZWxhdGlvbnMgfSBmcm9tIFwiLi4vZmluZC1vcHRpb25zL0ZpbmRPcHRpb25zUmVsYXRpb25zXCJcbmltcG9ydCB7IEFwcGx5VmFsdWVUcmFuc2Zvcm1lcnMgfSBmcm9tIFwiLi4vdXRpbC9BcHBseVZhbHVlVHJhbnNmb3JtZXJzXCJcbmltcG9ydCB7IE9ybVV0aWxzIH0gZnJvbSBcIi4uL3V0aWwvT3JtVXRpbHNcIlxuaW1wb3J0IHsgRW50aXR5UHJvcGVydHlOb3RGb3VuZEVycm9yIH0gZnJvbSBcIi4uL2Vycm9yL0VudGl0eVByb3BlcnR5Tm90Rm91bmRFcnJvclwiXG4vKiAqL1xuLyogKi9cbiAgXG5pbXBvcnQgeyBJbnN0YW5jZUNoZWNrZXIgfSBmcm9tIFwiLi4vdXRpbC9JbnN0YW5jZUNoZWNrZXJcIlxuaW1wb3J0IHsgQ0xBU1MgfSBmcm9tIFwidHlwZXNjcmlwdC1jbGFzcy1oZWxwZXJzL3dlYnNxbFwiXG5cbi8qKlxuICogQWxsb3dzIHRvIGJ1aWxkIGNvbXBsZXggc3FsIHF1ZXJpZXMgaW4gYSBmYXNoaW9uIHdheSBhbmQgZXhlY3V0ZSB0aG9zZSBxdWVyaWVzLlxuICovXG5AQ0xBU1MuTkFNRSgnU2VsZWN0UXVlcnlCdWlsZGVyJylcbmV4cG9ydCBjbGFzcyBTZWxlY3RRdWVyeUJ1aWxkZXI8RW50aXR5IGV4dGVuZHMgT2JqZWN0TGl0ZXJhbD5cbiAgICBleHRlbmRzIFF1ZXJ5QnVpbGRlcjxFbnRpdHk+XG4gICAgaW1wbGVtZW50cyBXaGVyZUV4cHJlc3Npb25CdWlsZGVyXG57XG4gICAgcmVhZG9ubHkgXCJAaW5zdGFuY2VvZlwiID0gU3ltYm9sLmZvcihcIlNlbGVjdFF1ZXJ5QnVpbGRlclwiKVxuXG4gICAgcHJvdGVjdGVkIGZpbmRPcHRpb25zOiBGaW5kTWFueU9wdGlvbnMgPSB7fVxuICAgIHByb3RlY3RlZCBzZWxlY3RzOiBzdHJpbmdbXSA9IFtdXG4gICAgcHJvdGVjdGVkIGpvaW5zOiB7XG4gICAgICAgIHR5cGU6IFwiaW5uZXJcIiB8IFwibGVmdFwiXG4gICAgICAgIGFsaWFzOiBzdHJpbmdcbiAgICAgICAgcGFyZW50QWxpYXM6IHN0cmluZ1xuICAgICAgICByZWxhdGlvbk1ldGFkYXRhOiBSZWxhdGlvbk1ldGFkYXRhXG4gICAgICAgIHNlbGVjdDogYm9vbGVhblxuICAgICAgICBzZWxlY3Rpb246IEZpbmRPcHRpb25zU2VsZWN0PGFueT4gfCB1bmRlZmluZWRcbiAgICB9W10gPSBbXVxuICAgIHByb3RlY3RlZCBjb25kaXRpb25zOiBzdHJpbmcgPSBcIlwiXG4gICAgcHJvdGVjdGVkIG9yZGVyQnlzOiB7XG4gICAgICAgIGFsaWFzOiBzdHJpbmdcbiAgICAgICAgZGlyZWN0aW9uOiBcIkFTQ1wiIHwgXCJERVNDXCJcbiAgICAgICAgbnVsbHM/OiBcIk5VTExTIEZJUlNUXCIgfCBcIk5VTExTIExBU1RcIlxuICAgIH1bXSA9IFtdXG4gICAgcHJvdGVjdGVkIHJlbGF0aW9uTWV0YWRhdGFzOiBSZWxhdGlvbk1ldGFkYXRhW10gPSBbXVxuXG5cblxuXG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGdlbmVyYXRlZCBTUUwgcXVlcnkgd2l0aG91dCBwYXJhbWV0ZXJzIGJlaW5nIHJlcGxhY2VkLlxuICAgICAqL1xuICAgIGdldFF1ZXJ5KCk6IHN0cmluZyB7XG4gICAgICAgIGxldCBzcWwgPSB0aGlzLmNyZWF0ZUNvbW1lbnQoKVxuICAgICAgICBzcWwgKz0gdGhpcy5jcmVhdGVDdGVFeHByZXNzaW9uKClcbiAgICAgICAgc3FsICs9IHRoaXMuY3JlYXRlU2VsZWN0RXhwcmVzc2lvbigpXG4gICAgICAgIHNxbCArPSB0aGlzLmNyZWF0ZUpvaW5FeHByZXNzaW9uKClcbiAgICAgICAgc3FsICs9IHRoaXMuY3JlYXRlV2hlcmVFeHByZXNzaW9uKClcbiAgICAgICAgc3FsICs9IHRoaXMuY3JlYXRlR3JvdXBCeUV4cHJlc3Npb24oKVxuICAgICAgICBzcWwgKz0gdGhpcy5jcmVhdGVIYXZpbmdFeHByZXNzaW9uKClcbiAgICAgICAgc3FsICs9IHRoaXMuY3JlYXRlT3JkZXJCeUV4cHJlc3Npb24oKVxuICAgICAgICBzcWwgKz0gdGhpcy5jcmVhdGVMaW1pdE9mZnNldEV4cHJlc3Npb24oKVxuICAgICAgICBzcWwgKz0gdGhpcy5jcmVhdGVMb2NrRXhwcmVzc2lvbigpXG4gICAgICAgIHNxbCA9IHNxbC50cmltKClcbiAgICAgICAgaWYgKHRoaXMuZXhwcmVzc2lvbk1hcC5zdWJRdWVyeSkgc3FsID0gXCIoXCIgKyBzcWwgKyBcIilcIlxuICAgICAgICByZXR1cm4gc3FsXG4gICAgfVxuXG5cblxuXG5cbiAgICBzZXRGaW5kT3B0aW9ucyhmaW5kT3B0aW9uczogRmluZE1hbnlPcHRpb25zPEVudGl0eT4pIHtcbiAgICAgICAgdGhpcy5maW5kT3B0aW9ucyA9IGZpbmRPcHRpb25zXG4gICAgICAgIHRoaXMuYXBwbHlGaW5kT3B0aW9ucygpXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHN1YnF1ZXJ5IC0gcXVlcnkgdGhhdCBjYW4gYmUgdXNlZCBpbnNpZGUgb3RoZXIgcXVlcmllcy5cbiAgICAgKi9cbiAgICBzdWJRdWVyeSgpOiBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PiB7XG4gICAgICAgIGNvbnN0IHFiID0gdGhpcy5jcmVhdGVRdWVyeUJ1aWxkZXIoKVxuICAgICAgICBxYi5leHByZXNzaW9uTWFwLnN1YlF1ZXJ5ID0gdHJ1ZVxuICAgICAgICBxYi5wYXJlbnRRdWVyeUJ1aWxkZXIgPSB0aGlzXG4gICAgICAgIHJldHVybiBxYlxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgU0VMRUNUIHF1ZXJ5LlxuICAgICAqIFJlcGxhY2VzIGFsbCBwcmV2aW91cyBzZWxlY3Rpb25zIGlmIHRoZXkgZXhpc3QuXG4gICAgICovXG4gICAgc2VsZWN0KCk6IHRoaXNcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgU0VMRUNUIHF1ZXJ5LlxuICAgICAqIFJlcGxhY2VzIGFsbCBwcmV2aW91cyBzZWxlY3Rpb25zIGlmIHRoZXkgZXhpc3QuXG4gICAgICovXG4gICAgc2VsZWN0KFxuICAgICAgICBzZWxlY3Rpb246IChxYjogU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4pID0+IFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+LFxuICAgICAgICBzZWxlY3Rpb25BbGlhc05hbWU/OiBzdHJpbmcsXG4gICAgKTogdGhpc1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBTRUxFQ1QgcXVlcnkgYW5kIHNlbGVjdHMgZ2l2ZW4gZGF0YS5cbiAgICAgKiBSZXBsYWNlcyBhbGwgcHJldmlvdXMgc2VsZWN0aW9ucyBpZiB0aGV5IGV4aXN0LlxuICAgICAqL1xuICAgIHNlbGVjdChzZWxlY3Rpb246IHN0cmluZywgc2VsZWN0aW9uQWxpYXNOYW1lPzogc3RyaW5nKTogdGhpc1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBTRUxFQ1QgcXVlcnkgYW5kIHNlbGVjdHMgZ2l2ZW4gZGF0YS5cbiAgICAgKiBSZXBsYWNlcyBhbGwgcHJldmlvdXMgc2VsZWN0aW9ucyBpZiB0aGV5IGV4aXN0LlxuICAgICAqL1xuICAgIHNlbGVjdChzZWxlY3Rpb246IHN0cmluZ1tdKTogdGhpc1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBTRUxFQ1QgcXVlcnkgYW5kIHNlbGVjdHMgZ2l2ZW4gZGF0YS5cbiAgICAgKiBSZXBsYWNlcyBhbGwgcHJldmlvdXMgc2VsZWN0aW9ucyBpZiB0aGV5IGV4aXN0LlxuICAgICAqL1xuICAgIHNlbGVjdChcbiAgICAgICAgc2VsZWN0aW9uPzpcbiAgICAgICAgICAgIHwgc3RyaW5nXG4gICAgICAgICAgICB8IHN0cmluZ1tdXG4gICAgICAgICAgICB8ICgocWI6IFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+KSA9PiBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PiksXG4gICAgICAgIHNlbGVjdGlvbkFsaWFzTmFtZT86IHN0cmluZyxcbiAgICApOiBTZWxlY3RRdWVyeUJ1aWxkZXI8RW50aXR5PiB7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5xdWVyeVR5cGUgPSBcInNlbGVjdFwiXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHNlbGVjdGlvbikpIHtcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5zZWxlY3RzID0gc2VsZWN0aW9uLm1hcCgoc2VsZWN0aW9uKSA9PiAoe1xuICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogc2VsZWN0aW9uLFxuICAgICAgICAgICAgfSkpXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHNlbGVjdGlvbiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICBjb25zdCBzdWJRdWVyeUJ1aWxkZXIgPSBzZWxlY3Rpb24odGhpcy5zdWJRdWVyeSgpKVxuICAgICAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXJzKHN1YlF1ZXJ5QnVpbGRlci5nZXRQYXJhbWV0ZXJzKCkpXG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAuc2VsZWN0cy5wdXNoKHtcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb246IHN1YlF1ZXJ5QnVpbGRlci5nZXRRdWVyeSgpLFxuICAgICAgICAgICAgICAgIGFsaWFzTmFtZTogc2VsZWN0aW9uQWxpYXNOYW1lLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIGlmIChzZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5zZWxlY3RzID0gW1xuICAgICAgICAgICAgICAgIHsgc2VsZWN0aW9uOiBzZWxlY3Rpb24sIGFsaWFzTmFtZTogc2VsZWN0aW9uQWxpYXNOYW1lIH0sXG4gICAgICAgICAgICBdXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgbmV3IHNlbGVjdGlvbiB0byB0aGUgU0VMRUNUIHF1ZXJ5LlxuICAgICAqL1xuICAgIGFkZFNlbGVjdChcbiAgICAgICAgc2VsZWN0aW9uOiAocWI6IFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+KSA9PiBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PixcbiAgICAgICAgc2VsZWN0aW9uQWxpYXNOYW1lPzogc3RyaW5nLFxuICAgICk6IHRoaXNcblxuICAgIC8qKlxuICAgICAqIEFkZHMgbmV3IHNlbGVjdGlvbiB0byB0aGUgU0VMRUNUIHF1ZXJ5LlxuICAgICAqL1xuICAgIGFkZFNlbGVjdChzZWxlY3Rpb246IHN0cmluZywgc2VsZWN0aW9uQWxpYXNOYW1lPzogc3RyaW5nKTogdGhpc1xuXG4gICAgLyoqXG4gICAgICogQWRkcyBuZXcgc2VsZWN0aW9uIHRvIHRoZSBTRUxFQ1QgcXVlcnkuXG4gICAgICovXG4gICAgYWRkU2VsZWN0KHNlbGVjdGlvbjogc3RyaW5nW10pOiB0aGlzXG5cbiAgICAvKipcbiAgICAgKiBBZGRzIG5ldyBzZWxlY3Rpb24gdG8gdGhlIFNFTEVDVCBxdWVyeS5cbiAgICAgKi9cbiAgICBhZGRTZWxlY3QoXG4gICAgICAgIHNlbGVjdGlvbjpcbiAgICAgICAgICAgIHwgc3RyaW5nXG4gICAgICAgICAgICB8IHN0cmluZ1tdXG4gICAgICAgICAgICB8ICgocWI6IFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+KSA9PiBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PiksXG4gICAgICAgIHNlbGVjdGlvbkFsaWFzTmFtZT86IHN0cmluZyxcbiAgICApOiB0aGlzIHtcbiAgICAgICAgaWYgKCFzZWxlY3Rpb24pIHJldHVybiB0aGlzXG5cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc2VsZWN0aW9uKSkge1xuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLnNlbGVjdHMgPSB0aGlzLmV4cHJlc3Npb25NYXAuc2VsZWN0cy5jb25jYXQoXG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uLm1hcCgoc2VsZWN0aW9uKSA9PiAoeyBzZWxlY3Rpb246IHNlbGVjdGlvbiB9KSksXG4gICAgICAgICAgICApXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHNlbGVjdGlvbiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICBjb25zdCBzdWJRdWVyeUJ1aWxkZXIgPSBzZWxlY3Rpb24odGhpcy5zdWJRdWVyeSgpKVxuICAgICAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXJzKHN1YlF1ZXJ5QnVpbGRlci5nZXRQYXJhbWV0ZXJzKCkpXG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAuc2VsZWN0cy5wdXNoKHtcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb246IHN1YlF1ZXJ5QnVpbGRlci5nZXRRdWVyeSgpLFxuICAgICAgICAgICAgICAgIGFsaWFzTmFtZTogc2VsZWN0aW9uQWxpYXNOYW1lLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIGlmIChzZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5zZWxlY3RzLnB1c2goe1xuICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogc2VsZWN0aW9uLFxuICAgICAgICAgICAgICAgIGFsaWFzTmFtZTogc2VsZWN0aW9uQWxpYXNOYW1lLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IG1heCBleGVjdXRpb24gdGltZS5cbiAgICAgKiBAcGFyYW0gbWlsbGlzZWNvbmRzXG4gICAgICovXG4gICAgbWF4RXhlY3V0aW9uVGltZShtaWxsaXNlY29uZHM6IG51bWJlcik6IHRoaXMge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAubWF4RXhlY3V0aW9uVGltZSA9IG1pbGxpc2Vjb25kc1xuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgd2hldGhlciB0aGUgc2VsZWN0aW9uIGlzIERJU1RJTkNULlxuICAgICAqL1xuICAgIGRpc3RpbmN0KGRpc3RpbmN0OiBib29sZWFuID0gdHJ1ZSk6IHRoaXMge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAuc2VsZWN0RGlzdGluY3QgPSBkaXN0aW5jdFxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGRpc3RpbmN0IG9uIGNsYXVzZSBmb3IgUG9zdGdyZXMuXG4gICAgICovXG4gICAgZGlzdGluY3RPbihkaXN0aW5jdE9uOiBzdHJpbmdbXSk6IHRoaXMge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAuc2VsZWN0RGlzdGluY3RPbiA9IGRpc3RpbmN0T25cbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgRlJPTSB3aGljaCBlbnRpdHkncyB0YWJsZSBzZWxlY3QvdXBkYXRlL2RlbGV0ZSB3aWxsIGJlIGV4ZWN1dGVkLlxuICAgICAqIEFsc28gc2V0cyBhIG1haW4gc3RyaW5nIGFsaWFzIG9mIHRoZSBzZWxlY3Rpb24gZGF0YS5cbiAgICAgKiBSZW1vdmVzIGFsbCBwcmV2aW91c2x5IHNldCBmcm9tLXMuXG4gICAgICovXG4gICAgZnJvbTxUIGV4dGVuZHMgT2JqZWN0TGl0ZXJhbD4oXG4gICAgICAgIGVudGl0eVRhcmdldDogKHFiOiBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PikgPT4gU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4sXG4gICAgICAgIGFsaWFzTmFtZTogc3RyaW5nLFxuICAgICk6IFNlbGVjdFF1ZXJ5QnVpbGRlcjxUPlxuXG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIEZST00gd2hpY2ggZW50aXR5J3MgdGFibGUgc2VsZWN0L3VwZGF0ZS9kZWxldGUgd2lsbCBiZSBleGVjdXRlZC5cbiAgICAgKiBBbHNvIHNldHMgYSBtYWluIHN0cmluZyBhbGlhcyBvZiB0aGUgc2VsZWN0aW9uIGRhdGEuXG4gICAgICogUmVtb3ZlcyBhbGwgcHJldmlvdXNseSBzZXQgZnJvbS1zLlxuICAgICAqL1xuICAgIGZyb208VCBleHRlbmRzIE9iamVjdExpdGVyYWw+KFxuICAgICAgICBlbnRpdHlUYXJnZXQ6IEVudGl0eVRhcmdldDxUPixcbiAgICAgICAgYWxpYXNOYW1lOiBzdHJpbmcsXG4gICAgKTogU2VsZWN0UXVlcnlCdWlsZGVyPFQ+XG5cbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgRlJPTSB3aGljaCBlbnRpdHkncyB0YWJsZSBzZWxlY3QvdXBkYXRlL2RlbGV0ZSB3aWxsIGJlIGV4ZWN1dGVkLlxuICAgICAqIEFsc28gc2V0cyBhIG1haW4gc3RyaW5nIGFsaWFzIG9mIHRoZSBzZWxlY3Rpb24gZGF0YS5cbiAgICAgKiBSZW1vdmVzIGFsbCBwcmV2aW91c2x5IHNldCBmcm9tLXMuXG4gICAgICovXG4gICAgZnJvbTxUIGV4dGVuZHMgT2JqZWN0TGl0ZXJhbD4oXG4gICAgICAgIGVudGl0eVRhcmdldDpcbiAgICAgICAgICAgIHwgRW50aXR5VGFyZ2V0PFQ+XG4gICAgICAgICAgICB8ICgocWI6IFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+KSA9PiBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PiksXG4gICAgICAgIGFsaWFzTmFtZTogc3RyaW5nLFxuICAgICk6IFNlbGVjdFF1ZXJ5QnVpbGRlcjxUPiB7XG4gICAgICAgIGNvbnN0IG1haW5BbGlhcyA9IHRoaXMuY3JlYXRlRnJvbUFsaWFzKGVudGl0eVRhcmdldCwgYWxpYXNOYW1lKVxuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAuc2V0TWFpbkFsaWFzKG1haW5BbGlhcylcbiAgICAgICAgcmV0dXJuIHRoaXMgYXMgYW55IGFzIFNlbGVjdFF1ZXJ5QnVpbGRlcjxUPlxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyBGUk9NIHdoaWNoIGVudGl0eSdzIHRhYmxlIHNlbGVjdC91cGRhdGUvZGVsZXRlIHdpbGwgYmUgZXhlY3V0ZWQuXG4gICAgICogQWxzbyBzZXRzIGEgbWFpbiBzdHJpbmcgYWxpYXMgb2YgdGhlIHNlbGVjdGlvbiBkYXRhLlxuICAgICAqL1xuICAgIGFkZEZyb208VCBleHRlbmRzIE9iamVjdExpdGVyYWw+KFxuICAgICAgICBlbnRpdHlUYXJnZXQ6IChxYjogU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4pID0+IFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+LFxuICAgICAgICBhbGlhc05hbWU6IHN0cmluZyxcbiAgICApOiBTZWxlY3RRdWVyeUJ1aWxkZXI8VD5cblxuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyBGUk9NIHdoaWNoIGVudGl0eSdzIHRhYmxlIHNlbGVjdC91cGRhdGUvZGVsZXRlIHdpbGwgYmUgZXhlY3V0ZWQuXG4gICAgICogQWxzbyBzZXRzIGEgbWFpbiBzdHJpbmcgYWxpYXMgb2YgdGhlIHNlbGVjdGlvbiBkYXRhLlxuICAgICAqL1xuICAgIGFkZEZyb208VCBleHRlbmRzIE9iamVjdExpdGVyYWw+KFxuICAgICAgICBlbnRpdHlUYXJnZXQ6IEVudGl0eVRhcmdldDxUPixcbiAgICAgICAgYWxpYXNOYW1lOiBzdHJpbmcsXG4gICAgKTogU2VsZWN0UXVlcnlCdWlsZGVyPFQ+XG5cbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgRlJPTSB3aGljaCBlbnRpdHkncyB0YWJsZSBzZWxlY3QvdXBkYXRlL2RlbGV0ZSB3aWxsIGJlIGV4ZWN1dGVkLlxuICAgICAqIEFsc28gc2V0cyBhIG1haW4gc3RyaW5nIGFsaWFzIG9mIHRoZSBzZWxlY3Rpb24gZGF0YS5cbiAgICAgKi9cbiAgICBhZGRGcm9tPFQgZXh0ZW5kcyBPYmplY3RMaXRlcmFsPihcbiAgICAgICAgZW50aXR5VGFyZ2V0OlxuICAgICAgICAgICAgfCBFbnRpdHlUYXJnZXQ8VD5cbiAgICAgICAgICAgIHwgKChxYjogU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4pID0+IFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+KSxcbiAgICAgICAgYWxpYXNOYW1lOiBzdHJpbmcsXG4gICAgKTogU2VsZWN0UXVlcnlCdWlsZGVyPFQ+IHtcbiAgICAgICAgY29uc3QgYWxpYXMgPSB0aGlzLmNyZWF0ZUZyb21BbGlhcyhlbnRpdHlUYXJnZXQsIGFsaWFzTmFtZSlcbiAgICAgICAgaWYgKCF0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzKVxuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLnNldE1haW5BbGlhcyhhbGlhcylcblxuICAgICAgICByZXR1cm4gdGhpcyBhcyBhbnkgYXMgU2VsZWN0UXVlcnlCdWlsZGVyPFQ+XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSU5ORVIgSk9JTnMgKHdpdGhvdXQgc2VsZWN0aW9uKSBnaXZlbiBzdWJxdWVyeS5cbiAgICAgKiBZb3UgYWxzbyBuZWVkIHRvIHNwZWNpZnkgYW4gYWxpYXMgb2YgdGhlIGpvaW5lZCBkYXRhLlxuICAgICAqIE9wdGlvbmFsbHksIHlvdSBjYW4gYWRkIGNvbmRpdGlvbiBhbmQgcGFyYW1ldGVycyB1c2VkIGluIGNvbmRpdGlvbi5cbiAgICAgKi9cbiAgICBpbm5lckpvaW4oXG4gICAgICAgIHN1YlF1ZXJ5RmFjdG9yeTogKFxuICAgICAgICAgICAgcWI6IFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+LFxuICAgICAgICApID0+IFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+LFxuICAgICAgICBhbGlhczogc3RyaW5nLFxuICAgICAgICBjb25kaXRpb24/OiBzdHJpbmcsXG4gICAgICAgIHBhcmFtZXRlcnM/OiBPYmplY3RMaXRlcmFsLFxuICAgICk6IHRoaXNcblxuICAgIC8qKlxuICAgICAqIElOTkVSIEpPSU5zICh3aXRob3V0IHNlbGVjdGlvbikgZW50aXR5J3MgcHJvcGVydHkuXG4gICAgICogR2l2ZW4gZW50aXR5IHByb3BlcnR5IHNob3VsZCBiZSBhIHJlbGF0aW9uLlxuICAgICAqIFlvdSBhbHNvIG5lZWQgdG8gc3BlY2lmeSBhbiBhbGlhcyBvZiB0aGUgam9pbmVkIGRhdGEuXG4gICAgICogT3B0aW9uYWxseSwgeW91IGNhbiBhZGQgY29uZGl0aW9uIGFuZCBwYXJhbWV0ZXJzIHVzZWQgaW4gY29uZGl0aW9uLlxuICAgICAqL1xuICAgIGlubmVySm9pbihcbiAgICAgICAgcHJvcGVydHk6IHN0cmluZyxcbiAgICAgICAgYWxpYXM6IHN0cmluZyxcbiAgICAgICAgY29uZGl0aW9uPzogc3RyaW5nLFxuICAgICAgICBwYXJhbWV0ZXJzPzogT2JqZWN0TGl0ZXJhbCxcbiAgICApOiB0aGlzXG5cbiAgICAvKipcbiAgICAgKiBJTk5FUiBKT0lOcyAod2l0aG91dCBzZWxlY3Rpb24pIGdpdmVuIGVudGl0eSdzIHRhYmxlLlxuICAgICAqIFlvdSBhbHNvIG5lZWQgdG8gc3BlY2lmeSBhbiBhbGlhcyBvZiB0aGUgam9pbmVkIGRhdGEuXG4gICAgICogT3B0aW9uYWxseSwgeW91IGNhbiBhZGQgY29uZGl0aW9uIGFuZCBwYXJhbWV0ZXJzIHVzZWQgaW4gY29uZGl0aW9uLlxuICAgICAqL1xuICAgIGlubmVySm9pbihcbiAgICAgICAgZW50aXR5OiBGdW5jdGlvbiB8IHN0cmluZyxcbiAgICAgICAgYWxpYXM6IHN0cmluZyxcbiAgICAgICAgY29uZGl0aW9uPzogc3RyaW5nLFxuICAgICAgICBwYXJhbWV0ZXJzPzogT2JqZWN0TGl0ZXJhbCxcbiAgICApOiB0aGlzXG5cbiAgICAvKipcbiAgICAgKiBJTk5FUiBKT0lOcyAod2l0aG91dCBzZWxlY3Rpb24pIGdpdmVuIHRhYmxlLlxuICAgICAqIFlvdSBhbHNvIG5lZWQgdG8gc3BlY2lmeSBhbiBhbGlhcyBvZiB0aGUgam9pbmVkIGRhdGEuXG4gICAgICogT3B0aW9uYWxseSwgeW91IGNhbiBhZGQgY29uZGl0aW9uIGFuZCBwYXJhbWV0ZXJzIHVzZWQgaW4gY29uZGl0aW9uLlxuICAgICAqL1xuICAgIGlubmVySm9pbihcbiAgICAgICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgICAgIGFsaWFzOiBzdHJpbmcsXG4gICAgICAgIGNvbmRpdGlvbj86IHN0cmluZyxcbiAgICAgICAgcGFyYW1ldGVycz86IE9iamVjdExpdGVyYWwsXG4gICAgKTogdGhpc1xuXG4gICAgLyoqXG4gICAgICogSU5ORVIgSk9JTnMgKHdpdGhvdXQgc2VsZWN0aW9uKS5cbiAgICAgKiBZb3UgYWxzbyBuZWVkIHRvIHNwZWNpZnkgYW4gYWxpYXMgb2YgdGhlIGpvaW5lZCBkYXRhLlxuICAgICAqIE9wdGlvbmFsbHksIHlvdSBjYW4gYWRkIGNvbmRpdGlvbiBhbmQgcGFyYW1ldGVycyB1c2VkIGluIGNvbmRpdGlvbi5cbiAgICAgKi9cbiAgICBpbm5lckpvaW4oXG4gICAgICAgIGVudGl0eU9yUHJvcGVydHk6XG4gICAgICAgICAgICB8IEZ1bmN0aW9uXG4gICAgICAgICAgICB8IHN0cmluZ1xuICAgICAgICAgICAgfCAoKHFiOiBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PikgPT4gU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4pLFxuICAgICAgICBhbGlhczogc3RyaW5nLFxuICAgICAgICBjb25kaXRpb24/OiBzdHJpbmcsXG4gICAgICAgIHBhcmFtZXRlcnM/OiBPYmplY3RMaXRlcmFsLFxuICAgICk6IHRoaXMge1xuICAgICAgICB0aGlzLmpvaW4oXCJJTk5FUlwiLCBlbnRpdHlPclByb3BlcnR5LCBhbGlhcywgY29uZGl0aW9uLCBwYXJhbWV0ZXJzKVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExFRlQgSk9JTnMgKHdpdGhvdXQgc2VsZWN0aW9uKSBnaXZlbiBzdWJxdWVyeS5cbiAgICAgKiBZb3UgYWxzbyBuZWVkIHRvIHNwZWNpZnkgYW4gYWxpYXMgb2YgdGhlIGpvaW5lZCBkYXRhLlxuICAgICAqIE9wdGlvbmFsbHksIHlvdSBjYW4gYWRkIGNvbmRpdGlvbiBhbmQgcGFyYW1ldGVycyB1c2VkIGluIGNvbmRpdGlvbi5cbiAgICAgKi9cbiAgICBsZWZ0Sm9pbihcbiAgICAgICAgc3ViUXVlcnlGYWN0b3J5OiAoXG4gICAgICAgICAgICBxYjogU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4sXG4gICAgICAgICkgPT4gU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4sXG4gICAgICAgIGFsaWFzOiBzdHJpbmcsXG4gICAgICAgIGNvbmRpdGlvbj86IHN0cmluZyxcbiAgICAgICAgcGFyYW1ldGVycz86IE9iamVjdExpdGVyYWwsXG4gICAgKTogdGhpc1xuXG4gICAgLyoqXG4gICAgICogTEVGVCBKT0lOcyAod2l0aG91dCBzZWxlY3Rpb24pIGVudGl0eSdzIHByb3BlcnR5LlxuICAgICAqIEdpdmVuIGVudGl0eSBwcm9wZXJ0eSBzaG91bGQgYmUgYSByZWxhdGlvbi5cbiAgICAgKiBZb3UgYWxzbyBuZWVkIHRvIHNwZWNpZnkgYW4gYWxpYXMgb2YgdGhlIGpvaW5lZCBkYXRhLlxuICAgICAqIE9wdGlvbmFsbHksIHlvdSBjYW4gYWRkIGNvbmRpdGlvbiBhbmQgcGFyYW1ldGVycyB1c2VkIGluIGNvbmRpdGlvbi5cbiAgICAgKi9cbiAgICBsZWZ0Sm9pbihcbiAgICAgICAgcHJvcGVydHk6IHN0cmluZyxcbiAgICAgICAgYWxpYXM6IHN0cmluZyxcbiAgICAgICAgY29uZGl0aW9uPzogc3RyaW5nLFxuICAgICAgICBwYXJhbWV0ZXJzPzogT2JqZWN0TGl0ZXJhbCxcbiAgICApOiB0aGlzXG5cbiAgICAvKipcbiAgICAgKiBMRUZUIEpPSU5zICh3aXRob3V0IHNlbGVjdGlvbikgZW50aXR5J3MgdGFibGUuXG4gICAgICogWW91IGFsc28gbmVlZCB0byBzcGVjaWZ5IGFuIGFsaWFzIG9mIHRoZSBqb2luZWQgZGF0YS5cbiAgICAgKiBPcHRpb25hbGx5LCB5b3UgY2FuIGFkZCBjb25kaXRpb24gYW5kIHBhcmFtZXRlcnMgdXNlZCBpbiBjb25kaXRpb24uXG4gICAgICovXG4gICAgbGVmdEpvaW4oXG4gICAgICAgIGVudGl0eTogRnVuY3Rpb24gfCBzdHJpbmcsXG4gICAgICAgIGFsaWFzOiBzdHJpbmcsXG4gICAgICAgIGNvbmRpdGlvbj86IHN0cmluZyxcbiAgICAgICAgcGFyYW1ldGVycz86IE9iamVjdExpdGVyYWwsXG4gICAgKTogdGhpc1xuXG4gICAgLyoqXG4gICAgICogTEVGVCBKT0lOcyAod2l0aG91dCBzZWxlY3Rpb24pIGdpdmVuIHRhYmxlLlxuICAgICAqIFlvdSBhbHNvIG5lZWQgdG8gc3BlY2lmeSBhbiBhbGlhcyBvZiB0aGUgam9pbmVkIGRhdGEuXG4gICAgICogT3B0aW9uYWxseSwgeW91IGNhbiBhZGQgY29uZGl0aW9uIGFuZCBwYXJhbWV0ZXJzIHVzZWQgaW4gY29uZGl0aW9uLlxuICAgICAqL1xuICAgIGxlZnRKb2luKFxuICAgICAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICAgICAgYWxpYXM6IHN0cmluZyxcbiAgICAgICAgY29uZGl0aW9uPzogc3RyaW5nLFxuICAgICAgICBwYXJhbWV0ZXJzPzogT2JqZWN0TGl0ZXJhbCxcbiAgICApOiB0aGlzXG5cbiAgICAvKipcbiAgICAgKiBMRUZUIEpPSU5zICh3aXRob3V0IHNlbGVjdGlvbikuXG4gICAgICogWW91IGFsc28gbmVlZCB0byBzcGVjaWZ5IGFuIGFsaWFzIG9mIHRoZSBqb2luZWQgZGF0YS5cbiAgICAgKiBPcHRpb25hbGx5LCB5b3UgY2FuIGFkZCBjb25kaXRpb24gYW5kIHBhcmFtZXRlcnMgdXNlZCBpbiBjb25kaXRpb24uXG4gICAgICovXG4gICAgbGVmdEpvaW4oXG4gICAgICAgIGVudGl0eU9yUHJvcGVydHk6XG4gICAgICAgICAgICB8IEZ1bmN0aW9uXG4gICAgICAgICAgICB8IHN0cmluZ1xuICAgICAgICAgICAgfCAoKHFiOiBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PikgPT4gU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4pLFxuICAgICAgICBhbGlhczogc3RyaW5nLFxuICAgICAgICBjb25kaXRpb24/OiBzdHJpbmcsXG4gICAgICAgIHBhcmFtZXRlcnM/OiBPYmplY3RMaXRlcmFsLFxuICAgICk6IHRoaXMge1xuICAgICAgICB0aGlzLmpvaW4oXCJMRUZUXCIsIGVudGl0eU9yUHJvcGVydHksIGFsaWFzLCBjb25kaXRpb24sIHBhcmFtZXRlcnMpXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSU5ORVIgSk9JTnMgZ2l2ZW4gc3VicXVlcnkgYW5kIGFkZHMgYWxsIHNlbGVjdGlvbiBwcm9wZXJ0aWVzIHRvIFNFTEVDVC4uXG4gICAgICogWW91IGFsc28gbmVlZCB0byBzcGVjaWZ5IGFuIGFsaWFzIG9mIHRoZSBqb2luZWQgZGF0YS5cbiAgICAgKiBPcHRpb25hbGx5LCB5b3UgY2FuIGFkZCBjb25kaXRpb24gYW5kIHBhcmFtZXRlcnMgdXNlZCBpbiBjb25kaXRpb24uXG4gICAgICovXG4gICAgaW5uZXJKb2luQW5kU2VsZWN0KFxuICAgICAgICBzdWJRdWVyeUZhY3Rvcnk6IChcbiAgICAgICAgICAgIHFiOiBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PixcbiAgICAgICAgKSA9PiBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PixcbiAgICAgICAgYWxpYXM6IHN0cmluZyxcbiAgICAgICAgY29uZGl0aW9uPzogc3RyaW5nLFxuICAgICAgICBwYXJhbWV0ZXJzPzogT2JqZWN0TGl0ZXJhbCxcbiAgICApOiB0aGlzXG5cbiAgICAvKipcbiAgICAgKiBJTk5FUiBKT0lOcyBlbnRpdHkncyBwcm9wZXJ0eSBhbmQgYWRkcyBhbGwgc2VsZWN0aW9uIHByb3BlcnRpZXMgdG8gU0VMRUNULlxuICAgICAqIEdpdmVuIGVudGl0eSBwcm9wZXJ0eSBzaG91bGQgYmUgYSByZWxhdGlvbi5cbiAgICAgKiBZb3UgYWxzbyBuZWVkIHRvIHNwZWNpZnkgYW4gYWxpYXMgb2YgdGhlIGpvaW5lZCBkYXRhLlxuICAgICAqIE9wdGlvbmFsbHksIHlvdSBjYW4gYWRkIGNvbmRpdGlvbiBhbmQgcGFyYW1ldGVycyB1c2VkIGluIGNvbmRpdGlvbi5cbiAgICAgKi9cbiAgICBpbm5lckpvaW5BbmRTZWxlY3QoXG4gICAgICAgIHByb3BlcnR5OiBzdHJpbmcsXG4gICAgICAgIGFsaWFzOiBzdHJpbmcsXG4gICAgICAgIGNvbmRpdGlvbj86IHN0cmluZyxcbiAgICAgICAgcGFyYW1ldGVycz86IE9iamVjdExpdGVyYWwsXG4gICAgKTogdGhpc1xuXG4gICAgLyoqXG4gICAgICogSU5ORVIgSk9JTnMgZW50aXR5IGFuZCBhZGRzIGFsbCBzZWxlY3Rpb24gcHJvcGVydGllcyB0byBTRUxFQ1QuXG4gICAgICogWW91IGFsc28gbmVlZCB0byBzcGVjaWZ5IGFuIGFsaWFzIG9mIHRoZSBqb2luZWQgZGF0YS5cbiAgICAgKiBPcHRpb25hbGx5LCB5b3UgY2FuIGFkZCBjb25kaXRpb24gYW5kIHBhcmFtZXRlcnMgdXNlZCBpbiBjb25kaXRpb24uXG4gICAgICovXG4gICAgaW5uZXJKb2luQW5kU2VsZWN0KFxuICAgICAgICBlbnRpdHk6IEZ1bmN0aW9uIHwgc3RyaW5nLFxuICAgICAgICBhbGlhczogc3RyaW5nLFxuICAgICAgICBjb25kaXRpb24/OiBzdHJpbmcsXG4gICAgICAgIHBhcmFtZXRlcnM/OiBPYmplY3RMaXRlcmFsLFxuICAgICk6IHRoaXNcblxuICAgIC8qKlxuICAgICAqIElOTkVSIEpPSU5zIHRhYmxlIGFuZCBhZGRzIGFsbCBzZWxlY3Rpb24gcHJvcGVydGllcyB0byBTRUxFQ1QuXG4gICAgICogWW91IGFsc28gbmVlZCB0byBzcGVjaWZ5IGFuIGFsaWFzIG9mIHRoZSBqb2luZWQgZGF0YS5cbiAgICAgKiBPcHRpb25hbGx5LCB5b3UgY2FuIGFkZCBjb25kaXRpb24gYW5kIHBhcmFtZXRlcnMgdXNlZCBpbiBjb25kaXRpb24uXG4gICAgICovXG4gICAgaW5uZXJKb2luQW5kU2VsZWN0KFxuICAgICAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICAgICAgYWxpYXM6IHN0cmluZyxcbiAgICAgICAgY29uZGl0aW9uPzogc3RyaW5nLFxuICAgICAgICBwYXJhbWV0ZXJzPzogT2JqZWN0TGl0ZXJhbCxcbiAgICApOiB0aGlzXG5cbiAgICAvKipcbiAgICAgKiBJTk5FUiBKT0lOcyBhbmQgYWRkcyBhbGwgc2VsZWN0aW9uIHByb3BlcnRpZXMgdG8gU0VMRUNULlxuICAgICAqIFlvdSBhbHNvIG5lZWQgdG8gc3BlY2lmeSBhbiBhbGlhcyBvZiB0aGUgam9pbmVkIGRhdGEuXG4gICAgICogT3B0aW9uYWxseSwgeW91IGNhbiBhZGQgY29uZGl0aW9uIGFuZCBwYXJhbWV0ZXJzIHVzZWQgaW4gY29uZGl0aW9uLlxuICAgICAqL1xuICAgIGlubmVySm9pbkFuZFNlbGVjdChcbiAgICAgICAgZW50aXR5T3JQcm9wZXJ0eTpcbiAgICAgICAgICAgIHwgRnVuY3Rpb25cbiAgICAgICAgICAgIHwgc3RyaW5nXG4gICAgICAgICAgICB8ICgocWI6IFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+KSA9PiBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PiksXG4gICAgICAgIGFsaWFzOiBzdHJpbmcsXG4gICAgICAgIGNvbmRpdGlvbj86IHN0cmluZyxcbiAgICAgICAgcGFyYW1ldGVycz86IE9iamVjdExpdGVyYWwsXG4gICAgKTogdGhpcyB7XG4gICAgICAgIHRoaXMuYWRkU2VsZWN0KGFsaWFzKVxuICAgICAgICB0aGlzLmlubmVySm9pbihlbnRpdHlPclByb3BlcnR5LCBhbGlhcywgY29uZGl0aW9uLCBwYXJhbWV0ZXJzKVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExFRlQgSk9JTnMgZ2l2ZW4gc3VicXVlcnkgYW5kIGFkZHMgYWxsIHNlbGVjdGlvbiBwcm9wZXJ0aWVzIHRvIFNFTEVDVC4uXG4gICAgICogWW91IGFsc28gbmVlZCB0byBzcGVjaWZ5IGFuIGFsaWFzIG9mIHRoZSBqb2luZWQgZGF0YS5cbiAgICAgKiBPcHRpb25hbGx5LCB5b3UgY2FuIGFkZCBjb25kaXRpb24gYW5kIHBhcmFtZXRlcnMgdXNlZCBpbiBjb25kaXRpb24uXG4gICAgICovXG4gICAgbGVmdEpvaW5BbmRTZWxlY3QoXG4gICAgICAgIHN1YlF1ZXJ5RmFjdG9yeTogKFxuICAgICAgICAgICAgcWI6IFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+LFxuICAgICAgICApID0+IFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+LFxuICAgICAgICBhbGlhczogc3RyaW5nLFxuICAgICAgICBjb25kaXRpb24/OiBzdHJpbmcsXG4gICAgICAgIHBhcmFtZXRlcnM/OiBPYmplY3RMaXRlcmFsLFxuICAgICk6IHRoaXNcblxuICAgIC8qKlxuICAgICAqIExFRlQgSk9JTnMgZW50aXR5J3MgcHJvcGVydHkgYW5kIGFkZHMgYWxsIHNlbGVjdGlvbiBwcm9wZXJ0aWVzIHRvIFNFTEVDVC5cbiAgICAgKiBHaXZlbiBlbnRpdHkgcHJvcGVydHkgc2hvdWxkIGJlIGEgcmVsYXRpb24uXG4gICAgICogWW91IGFsc28gbmVlZCB0byBzcGVjaWZ5IGFuIGFsaWFzIG9mIHRoZSBqb2luZWQgZGF0YS5cbiAgICAgKiBPcHRpb25hbGx5LCB5b3UgY2FuIGFkZCBjb25kaXRpb24gYW5kIHBhcmFtZXRlcnMgdXNlZCBpbiBjb25kaXRpb24uXG4gICAgICovXG4gICAgbGVmdEpvaW5BbmRTZWxlY3QoXG4gICAgICAgIHByb3BlcnR5OiBzdHJpbmcsXG4gICAgICAgIGFsaWFzOiBzdHJpbmcsXG4gICAgICAgIGNvbmRpdGlvbj86IHN0cmluZyxcbiAgICAgICAgcGFyYW1ldGVycz86IE9iamVjdExpdGVyYWwsXG4gICAgKTogdGhpc1xuXG4gICAgLyoqXG4gICAgICogTEVGVCBKT0lOcyBlbnRpdHkgYW5kIGFkZHMgYWxsIHNlbGVjdGlvbiBwcm9wZXJ0aWVzIHRvIFNFTEVDVC5cbiAgICAgKiBZb3UgYWxzbyBuZWVkIHRvIHNwZWNpZnkgYW4gYWxpYXMgb2YgdGhlIGpvaW5lZCBkYXRhLlxuICAgICAqIE9wdGlvbmFsbHksIHlvdSBjYW4gYWRkIGNvbmRpdGlvbiBhbmQgcGFyYW1ldGVycyB1c2VkIGluIGNvbmRpdGlvbi5cbiAgICAgKi9cbiAgICBsZWZ0Sm9pbkFuZFNlbGVjdChcbiAgICAgICAgZW50aXR5OiBGdW5jdGlvbiB8IHN0cmluZyxcbiAgICAgICAgYWxpYXM6IHN0cmluZyxcbiAgICAgICAgY29uZGl0aW9uPzogc3RyaW5nLFxuICAgICAgICBwYXJhbWV0ZXJzPzogT2JqZWN0TGl0ZXJhbCxcbiAgICApOiB0aGlzXG5cbiAgICAvKipcbiAgICAgKiBMRUZUIEpPSU5zIHRhYmxlIGFuZCBhZGRzIGFsbCBzZWxlY3Rpb24gcHJvcGVydGllcyB0byBTRUxFQ1QuXG4gICAgICogWW91IGFsc28gbmVlZCB0byBzcGVjaWZ5IGFuIGFsaWFzIG9mIHRoZSBqb2luZWQgZGF0YS5cbiAgICAgKiBPcHRpb25hbGx5LCB5b3UgY2FuIGFkZCBjb25kaXRpb24gYW5kIHBhcmFtZXRlcnMgdXNlZCBpbiBjb25kaXRpb24uXG4gICAgICovXG4gICAgbGVmdEpvaW5BbmRTZWxlY3QoXG4gICAgICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgICAgICBhbGlhczogc3RyaW5nLFxuICAgICAgICBjb25kaXRpb24/OiBzdHJpbmcsXG4gICAgICAgIHBhcmFtZXRlcnM/OiBPYmplY3RMaXRlcmFsLFxuICAgICk6IHRoaXNcblxuICAgIC8qKlxuICAgICAqIExFRlQgSk9JTnMgYW5kIGFkZHMgYWxsIHNlbGVjdGlvbiBwcm9wZXJ0aWVzIHRvIFNFTEVDVC5cbiAgICAgKiBZb3UgYWxzbyBuZWVkIHRvIHNwZWNpZnkgYW4gYWxpYXMgb2YgdGhlIGpvaW5lZCBkYXRhLlxuICAgICAqIE9wdGlvbmFsbHksIHlvdSBjYW4gYWRkIGNvbmRpdGlvbiBhbmQgcGFyYW1ldGVycyB1c2VkIGluIGNvbmRpdGlvbi5cbiAgICAgKi9cbiAgICBsZWZ0Sm9pbkFuZFNlbGVjdChcbiAgICAgICAgZW50aXR5T3JQcm9wZXJ0eTpcbiAgICAgICAgICAgIHwgRnVuY3Rpb25cbiAgICAgICAgICAgIHwgc3RyaW5nXG4gICAgICAgICAgICB8ICgocWI6IFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+KSA9PiBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PiksXG4gICAgICAgIGFsaWFzOiBzdHJpbmcsXG4gICAgICAgIGNvbmRpdGlvbj86IHN0cmluZyxcbiAgICAgICAgcGFyYW1ldGVycz86IE9iamVjdExpdGVyYWwsXG4gICAgKTogdGhpcyB7XG4gICAgICAgIHRoaXMuYWRkU2VsZWN0KGFsaWFzKVxuICAgICAgICB0aGlzLmxlZnRKb2luKGVudGl0eU9yUHJvcGVydHksIGFsaWFzLCBjb25kaXRpb24sIHBhcmFtZXRlcnMpXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSU5ORVIgSk9JTnMgZ2l2ZW4gc3VicXVlcnksIFNFTEVDVHMgdGhlIGRhdGEgcmV0dXJuZWQgYnkgYSBqb2luIGFuZCBNQVBzIGFsbCB0aGF0IGRhdGEgdG8gc29tZSBlbnRpdHkncyBwcm9wZXJ0eS5cbiAgICAgKiBUaGlzIGlzIGV4dHJlbWVseSB1c2VmdWwgd2hlbiB5b3Ugd2FudCB0byBzZWxlY3Qgc29tZSBkYXRhIGFuZCBtYXAgaXQgdG8gc29tZSB2aXJ0dWFsIHByb3BlcnR5LlxuICAgICAqIEl0IHdpbGwgYXNzdW1lIHRoYXQgdGhlcmUgYXJlIG11bHRpcGxlIHJvd3Mgb2Ygc2VsZWN0aW5nIGRhdGEsIGFuZCBtYXBwZWQgcmVzdWx0IHdpbGwgYmUgYW4gYXJyYXkuXG4gICAgICogR2l2ZW4gZW50aXR5IHByb3BlcnR5IHNob3VsZCBiZSBhIHJlbGF0aW9uLlxuICAgICAqIFlvdSBhbHNvIG5lZWQgdG8gc3BlY2lmeSBhbiBhbGlhcyBvZiB0aGUgam9pbmVkIGRhdGEuXG4gICAgICogT3B0aW9uYWxseSwgeW91IGNhbiBhZGQgY29uZGl0aW9uIGFuZCBwYXJhbWV0ZXJzIHVzZWQgaW4gY29uZGl0aW9uLlxuICAgICAqL1xuICAgIGlubmVySm9pbkFuZE1hcE1hbnkoXG4gICAgICAgIG1hcFRvUHJvcGVydHk6IHN0cmluZyxcbiAgICAgICAgc3ViUXVlcnlGYWN0b3J5OiAoXG4gICAgICAgICAgICBxYjogU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4sXG4gICAgICAgICkgPT4gU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4sXG4gICAgICAgIGFsaWFzOiBzdHJpbmcsXG4gICAgICAgIGNvbmRpdGlvbj86IHN0cmluZyxcbiAgICAgICAgcGFyYW1ldGVycz86IE9iamVjdExpdGVyYWwsXG4gICAgKTogdGhpc1xuXG4gICAgLyoqXG4gICAgICogSU5ORVIgSk9JTnMgZW50aXR5J3MgcHJvcGVydHksIFNFTEVDVHMgdGhlIGRhdGEgcmV0dXJuZWQgYnkgYSBqb2luIGFuZCBNQVBzIGFsbCB0aGF0IGRhdGEgdG8gc29tZSBlbnRpdHkncyBwcm9wZXJ0eS5cbiAgICAgKiBUaGlzIGlzIGV4dHJlbWVseSB1c2VmdWwgd2hlbiB5b3Ugd2FudCB0byBzZWxlY3Qgc29tZSBkYXRhIGFuZCBtYXAgaXQgdG8gc29tZSB2aXJ0dWFsIHByb3BlcnR5LlxuICAgICAqIEl0IHdpbGwgYXNzdW1lIHRoYXQgdGhlcmUgYXJlIG11bHRpcGxlIHJvd3Mgb2Ygc2VsZWN0aW5nIGRhdGEsIGFuZCBtYXBwZWQgcmVzdWx0IHdpbGwgYmUgYW4gYXJyYXkuXG4gICAgICogR2l2ZW4gZW50aXR5IHByb3BlcnR5IHNob3VsZCBiZSBhIHJlbGF0aW9uLlxuICAgICAqIFlvdSBhbHNvIG5lZWQgdG8gc3BlY2lmeSBhbiBhbGlhcyBvZiB0aGUgam9pbmVkIGRhdGEuXG4gICAgICogT3B0aW9uYWxseSwgeW91IGNhbiBhZGQgY29uZGl0aW9uIGFuZCBwYXJhbWV0ZXJzIHVzZWQgaW4gY29uZGl0aW9uLlxuICAgICAqL1xuICAgIGlubmVySm9pbkFuZE1hcE1hbnkoXG4gICAgICAgIG1hcFRvUHJvcGVydHk6IHN0cmluZyxcbiAgICAgICAgcHJvcGVydHk6IHN0cmluZyxcbiAgICAgICAgYWxpYXM6IHN0cmluZyxcbiAgICAgICAgY29uZGl0aW9uPzogc3RyaW5nLFxuICAgICAgICBwYXJhbWV0ZXJzPzogT2JqZWN0TGl0ZXJhbCxcbiAgICApOiB0aGlzXG5cbiAgICAvKipcbiAgICAgKiBJTk5FUiBKT0lOcyBlbnRpdHkncyB0YWJsZSwgU0VMRUNUcyB0aGUgZGF0YSByZXR1cm5lZCBieSBhIGpvaW4gYW5kIE1BUHMgYWxsIHRoYXQgZGF0YSB0byBzb21lIGVudGl0eSdzIHByb3BlcnR5LlxuICAgICAqIFRoaXMgaXMgZXh0cmVtZWx5IHVzZWZ1bCB3aGVuIHlvdSB3YW50IHRvIHNlbGVjdCBzb21lIGRhdGEgYW5kIG1hcCBpdCB0byBzb21lIHZpcnR1YWwgcHJvcGVydHkuXG4gICAgICogSXQgd2lsbCBhc3N1bWUgdGhhdCB0aGVyZSBhcmUgbXVsdGlwbGUgcm93cyBvZiBzZWxlY3RpbmcgZGF0YSwgYW5kIG1hcHBlZCByZXN1bHQgd2lsbCBiZSBhbiBhcnJheS5cbiAgICAgKiBZb3UgYWxzbyBuZWVkIHRvIHNwZWNpZnkgYW4gYWxpYXMgb2YgdGhlIGpvaW5lZCBkYXRhLlxuICAgICAqIE9wdGlvbmFsbHksIHlvdSBjYW4gYWRkIGNvbmRpdGlvbiBhbmQgcGFyYW1ldGVycyB1c2VkIGluIGNvbmRpdGlvbi5cbiAgICAgKi9cbiAgICBpbm5lckpvaW5BbmRNYXBNYW55KFxuICAgICAgICBtYXBUb1Byb3BlcnR5OiBzdHJpbmcsXG4gICAgICAgIGVudGl0eTogRnVuY3Rpb24gfCBzdHJpbmcsXG4gICAgICAgIGFsaWFzOiBzdHJpbmcsXG4gICAgICAgIGNvbmRpdGlvbj86IHN0cmluZyxcbiAgICAgICAgcGFyYW1ldGVycz86IE9iamVjdExpdGVyYWwsXG4gICAgKTogdGhpc1xuXG4gICAgLyoqXG4gICAgICogSU5ORVIgSk9JTnMgdGFibGUsIFNFTEVDVHMgdGhlIGRhdGEgcmV0dXJuZWQgYnkgYSBqb2luIGFuZCBNQVBzIGFsbCB0aGF0IGRhdGEgdG8gc29tZSBlbnRpdHkncyBwcm9wZXJ0eS5cbiAgICAgKiBUaGlzIGlzIGV4dHJlbWVseSB1c2VmdWwgd2hlbiB5b3Ugd2FudCB0byBzZWxlY3Qgc29tZSBkYXRhIGFuZCBtYXAgaXQgdG8gc29tZSB2aXJ0dWFsIHByb3BlcnR5LlxuICAgICAqIEl0IHdpbGwgYXNzdW1lIHRoYXQgdGhlcmUgYXJlIG11bHRpcGxlIHJvd3Mgb2Ygc2VsZWN0aW5nIGRhdGEsIGFuZCBtYXBwZWQgcmVzdWx0IHdpbGwgYmUgYW4gYXJyYXkuXG4gICAgICogWW91IGFsc28gbmVlZCB0byBzcGVjaWZ5IGFuIGFsaWFzIG9mIHRoZSBqb2luZWQgZGF0YS5cbiAgICAgKiBPcHRpb25hbGx5LCB5b3UgY2FuIGFkZCBjb25kaXRpb24gYW5kIHBhcmFtZXRlcnMgdXNlZCBpbiBjb25kaXRpb24uXG4gICAgICovXG4gICAgaW5uZXJKb2luQW5kTWFwTWFueShcbiAgICAgICAgbWFwVG9Qcm9wZXJ0eTogc3RyaW5nLFxuICAgICAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICAgICAgYWxpYXM6IHN0cmluZyxcbiAgICAgICAgY29uZGl0aW9uPzogc3RyaW5nLFxuICAgICAgICBwYXJhbWV0ZXJzPzogT2JqZWN0TGl0ZXJhbCxcbiAgICApOiB0aGlzXG5cbiAgICAvKipcbiAgICAgKiBJTk5FUiBKT0lOcywgU0VMRUNUcyB0aGUgZGF0YSByZXR1cm5lZCBieSBhIGpvaW4gYW5kIE1BUHMgYWxsIHRoYXQgZGF0YSB0byBzb21lIGVudGl0eSdzIHByb3BlcnR5LlxuICAgICAqIFRoaXMgaXMgZXh0cmVtZWx5IHVzZWZ1bCB3aGVuIHlvdSB3YW50IHRvIHNlbGVjdCBzb21lIGRhdGEgYW5kIG1hcCBpdCB0byBzb21lIHZpcnR1YWwgcHJvcGVydHkuXG4gICAgICogSXQgd2lsbCBhc3N1bWUgdGhhdCB0aGVyZSBhcmUgbXVsdGlwbGUgcm93cyBvZiBzZWxlY3RpbmcgZGF0YSwgYW5kIG1hcHBlZCByZXN1bHQgd2lsbCBiZSBhbiBhcnJheS5cbiAgICAgKiBZb3UgYWxzbyBuZWVkIHRvIHNwZWNpZnkgYW4gYWxpYXMgb2YgdGhlIGpvaW5lZCBkYXRhLlxuICAgICAqIE9wdGlvbmFsbHksIHlvdSBjYW4gYWRkIGNvbmRpdGlvbiBhbmQgcGFyYW1ldGVycyB1c2VkIGluIGNvbmRpdGlvbi5cbiAgICAgKi9cbiAgICBpbm5lckpvaW5BbmRNYXBNYW55KFxuICAgICAgICBtYXBUb1Byb3BlcnR5OiBzdHJpbmcsXG4gICAgICAgIGVudGl0eU9yUHJvcGVydHk6XG4gICAgICAgICAgICB8IEZ1bmN0aW9uXG4gICAgICAgICAgICB8IHN0cmluZ1xuICAgICAgICAgICAgfCAoKHFiOiBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PikgPT4gU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4pLFxuICAgICAgICBhbGlhczogc3RyaW5nLFxuICAgICAgICBjb25kaXRpb24/OiBzdHJpbmcsXG4gICAgICAgIHBhcmFtZXRlcnM/OiBPYmplY3RMaXRlcmFsLFxuICAgICk6IHRoaXMge1xuICAgICAgICB0aGlzLmFkZFNlbGVjdChhbGlhcylcbiAgICAgICAgdGhpcy5qb2luKFxuICAgICAgICAgICAgXCJJTk5FUlwiLFxuICAgICAgICAgICAgZW50aXR5T3JQcm9wZXJ0eSxcbiAgICAgICAgICAgIGFsaWFzLFxuICAgICAgICAgICAgY29uZGl0aW9uLFxuICAgICAgICAgICAgcGFyYW1ldGVycyxcbiAgICAgICAgICAgIG1hcFRvUHJvcGVydHksXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICApXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSU5ORVIgSk9JTnMgZ2l2ZW4gc3VicXVlcnksIFNFTEVDVHMgdGhlIGRhdGEgcmV0dXJuZWQgYnkgYSBqb2luIGFuZCBNQVBzIGFsbCB0aGF0IGRhdGEgdG8gc29tZSBlbnRpdHkncyBwcm9wZXJ0eS5cbiAgICAgKiBUaGlzIGlzIGV4dHJlbWVseSB1c2VmdWwgd2hlbiB5b3Ugd2FudCB0byBzZWxlY3Qgc29tZSBkYXRhIGFuZCBtYXAgaXQgdG8gc29tZSB2aXJ0dWFsIHByb3BlcnR5LlxuICAgICAqIEl0IHdpbGwgYXNzdW1lIHRoYXQgdGhlcmUgaXMgYSBzaW5nbGUgcm93IG9mIHNlbGVjdGluZyBkYXRhLCBhbmQgbWFwcGVkIHJlc3VsdCB3aWxsIGJlIGEgc2luZ2xlIHNlbGVjdGVkIHZhbHVlLlxuICAgICAqIEdpdmVuIGVudGl0eSBwcm9wZXJ0eSBzaG91bGQgYmUgYSByZWxhdGlvbi5cbiAgICAgKiBZb3UgYWxzbyBuZWVkIHRvIHNwZWNpZnkgYW4gYWxpYXMgb2YgdGhlIGpvaW5lZCBkYXRhLlxuICAgICAqIE9wdGlvbmFsbHksIHlvdSBjYW4gYWRkIGNvbmRpdGlvbiBhbmQgcGFyYW1ldGVycyB1c2VkIGluIGNvbmRpdGlvbi5cbiAgICAgKi9cbiAgICBpbm5lckpvaW5BbmRNYXBPbmUoXG4gICAgICAgIG1hcFRvUHJvcGVydHk6IHN0cmluZyxcbiAgICAgICAgc3ViUXVlcnlGYWN0b3J5OiAoXG4gICAgICAgICAgICBxYjogU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4sXG4gICAgICAgICkgPT4gU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4sXG4gICAgICAgIGFsaWFzOiBzdHJpbmcsXG4gICAgICAgIGNvbmRpdGlvbj86IHN0cmluZyxcbiAgICAgICAgcGFyYW1ldGVycz86IE9iamVjdExpdGVyYWwsXG4gICAgKTogdGhpc1xuXG4gICAgLyoqXG4gICAgICogSU5ORVIgSk9JTnMgZW50aXR5J3MgcHJvcGVydHksIFNFTEVDVHMgdGhlIGRhdGEgcmV0dXJuZWQgYnkgYSBqb2luIGFuZCBNQVBzIGFsbCB0aGF0IGRhdGEgdG8gc29tZSBlbnRpdHkncyBwcm9wZXJ0eS5cbiAgICAgKiBUaGlzIGlzIGV4dHJlbWVseSB1c2VmdWwgd2hlbiB5b3Ugd2FudCB0byBzZWxlY3Qgc29tZSBkYXRhIGFuZCBtYXAgaXQgdG8gc29tZSB2aXJ0dWFsIHByb3BlcnR5LlxuICAgICAqIEl0IHdpbGwgYXNzdW1lIHRoYXQgdGhlcmUgaXMgYSBzaW5nbGUgcm93IG9mIHNlbGVjdGluZyBkYXRhLCBhbmQgbWFwcGVkIHJlc3VsdCB3aWxsIGJlIGEgc2luZ2xlIHNlbGVjdGVkIHZhbHVlLlxuICAgICAqIEdpdmVuIGVudGl0eSBwcm9wZXJ0eSBzaG91bGQgYmUgYSByZWxhdGlvbi5cbiAgICAgKiBZb3UgYWxzbyBuZWVkIHRvIHNwZWNpZnkgYW4gYWxpYXMgb2YgdGhlIGpvaW5lZCBkYXRhLlxuICAgICAqIE9wdGlvbmFsbHksIHlvdSBjYW4gYWRkIGNvbmRpdGlvbiBhbmQgcGFyYW1ldGVycyB1c2VkIGluIGNvbmRpdGlvbi5cbiAgICAgKi9cbiAgICBpbm5lckpvaW5BbmRNYXBPbmUoXG4gICAgICAgIG1hcFRvUHJvcGVydHk6IHN0cmluZyxcbiAgICAgICAgcHJvcGVydHk6IHN0cmluZyxcbiAgICAgICAgYWxpYXM6IHN0cmluZyxcbiAgICAgICAgY29uZGl0aW9uPzogc3RyaW5nLFxuICAgICAgICBwYXJhbWV0ZXJzPzogT2JqZWN0TGl0ZXJhbCxcbiAgICApOiB0aGlzXG5cbiAgICAvKipcbiAgICAgKiBJTk5FUiBKT0lOcyBlbnRpdHkncyB0YWJsZSwgU0VMRUNUcyB0aGUgZGF0YSByZXR1cm5lZCBieSBhIGpvaW4gYW5kIE1BUHMgYWxsIHRoYXQgZGF0YSB0byBzb21lIGVudGl0eSdzIHByb3BlcnR5LlxuICAgICAqIFRoaXMgaXMgZXh0cmVtZWx5IHVzZWZ1bCB3aGVuIHlvdSB3YW50IHRvIHNlbGVjdCBzb21lIGRhdGEgYW5kIG1hcCBpdCB0byBzb21lIHZpcnR1YWwgcHJvcGVydHkuXG4gICAgICogSXQgd2lsbCBhc3N1bWUgdGhhdCB0aGVyZSBpcyBhIHNpbmdsZSByb3cgb2Ygc2VsZWN0aW5nIGRhdGEsIGFuZCBtYXBwZWQgcmVzdWx0IHdpbGwgYmUgYSBzaW5nbGUgc2VsZWN0ZWQgdmFsdWUuXG4gICAgICogWW91IGFsc28gbmVlZCB0byBzcGVjaWZ5IGFuIGFsaWFzIG9mIHRoZSBqb2luZWQgZGF0YS5cbiAgICAgKiBPcHRpb25hbGx5LCB5b3UgY2FuIGFkZCBjb25kaXRpb24gYW5kIHBhcmFtZXRlcnMgdXNlZCBpbiBjb25kaXRpb24uXG4gICAgICovXG4gICAgaW5uZXJKb2luQW5kTWFwT25lKFxuICAgICAgICBtYXBUb1Byb3BlcnR5OiBzdHJpbmcsXG4gICAgICAgIGVudGl0eTogRnVuY3Rpb24gfCBzdHJpbmcsXG4gICAgICAgIGFsaWFzOiBzdHJpbmcsXG4gICAgICAgIGNvbmRpdGlvbj86IHN0cmluZyxcbiAgICAgICAgcGFyYW1ldGVycz86IE9iamVjdExpdGVyYWwsXG4gICAgKTogdGhpc1xuXG4gICAgLyoqXG4gICAgICogSU5ORVIgSk9JTnMgdGFibGUsIFNFTEVDVHMgdGhlIGRhdGEgcmV0dXJuZWQgYnkgYSBqb2luIGFuZCBNQVBzIGFsbCB0aGF0IGRhdGEgdG8gc29tZSBlbnRpdHkncyBwcm9wZXJ0eS5cbiAgICAgKiBUaGlzIGlzIGV4dHJlbWVseSB1c2VmdWwgd2hlbiB5b3Ugd2FudCB0byBzZWxlY3Qgc29tZSBkYXRhIGFuZCBtYXAgaXQgdG8gc29tZSB2aXJ0dWFsIHByb3BlcnR5LlxuICAgICAqIEl0IHdpbGwgYXNzdW1lIHRoYXQgdGhlcmUgaXMgYSBzaW5nbGUgcm93IG9mIHNlbGVjdGluZyBkYXRhLCBhbmQgbWFwcGVkIHJlc3VsdCB3aWxsIGJlIGEgc2luZ2xlIHNlbGVjdGVkIHZhbHVlLlxuICAgICAqIFlvdSBhbHNvIG5lZWQgdG8gc3BlY2lmeSBhbiBhbGlhcyBvZiB0aGUgam9pbmVkIGRhdGEuXG4gICAgICogT3B0aW9uYWxseSwgeW91IGNhbiBhZGQgY29uZGl0aW9uIGFuZCBwYXJhbWV0ZXJzIHVzZWQgaW4gY29uZGl0aW9uLlxuICAgICAqL1xuICAgIGlubmVySm9pbkFuZE1hcE9uZShcbiAgICAgICAgbWFwVG9Qcm9wZXJ0eTogc3RyaW5nLFxuICAgICAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICAgICAgYWxpYXM6IHN0cmluZyxcbiAgICAgICAgY29uZGl0aW9uPzogc3RyaW5nLFxuICAgICAgICBwYXJhbWV0ZXJzPzogT2JqZWN0TGl0ZXJhbCxcbiAgICApOiB0aGlzXG5cbiAgICAvKipcbiAgICAgKiBJTk5FUiBKT0lOcywgU0VMRUNUcyB0aGUgZGF0YSByZXR1cm5lZCBieSBhIGpvaW4gYW5kIE1BUHMgYWxsIHRoYXQgZGF0YSB0byBzb21lIGVudGl0eSdzIHByb3BlcnR5LlxuICAgICAqIFRoaXMgaXMgZXh0cmVtZWx5IHVzZWZ1bCB3aGVuIHlvdSB3YW50IHRvIHNlbGVjdCBzb21lIGRhdGEgYW5kIG1hcCBpdCB0byBzb21lIHZpcnR1YWwgcHJvcGVydHkuXG4gICAgICogSXQgd2lsbCBhc3N1bWUgdGhhdCB0aGVyZSBpcyBhIHNpbmdsZSByb3cgb2Ygc2VsZWN0aW5nIGRhdGEsIGFuZCBtYXBwZWQgcmVzdWx0IHdpbGwgYmUgYSBzaW5nbGUgc2VsZWN0ZWQgdmFsdWUuXG4gICAgICogWW91IGFsc28gbmVlZCB0byBzcGVjaWZ5IGFuIGFsaWFzIG9mIHRoZSBqb2luZWQgZGF0YS5cbiAgICAgKiBPcHRpb25hbGx5LCB5b3UgY2FuIGFkZCBjb25kaXRpb24gYW5kIHBhcmFtZXRlcnMgdXNlZCBpbiBjb25kaXRpb24uXG4gICAgICovXG4gICAgaW5uZXJKb2luQW5kTWFwT25lKFxuICAgICAgICBtYXBUb1Byb3BlcnR5OiBzdHJpbmcsXG4gICAgICAgIGVudGl0eU9yUHJvcGVydHk6XG4gICAgICAgICAgICB8IEZ1bmN0aW9uXG4gICAgICAgICAgICB8IHN0cmluZ1xuICAgICAgICAgICAgfCAoKHFiOiBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PikgPT4gU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4pLFxuICAgICAgICBhbGlhczogc3RyaW5nLFxuICAgICAgICBjb25kaXRpb24/OiBzdHJpbmcsXG4gICAgICAgIHBhcmFtZXRlcnM/OiBPYmplY3RMaXRlcmFsLFxuICAgICk6IHRoaXMge1xuICAgICAgICB0aGlzLmFkZFNlbGVjdChhbGlhcylcbiAgICAgICAgdGhpcy5qb2luKFxuICAgICAgICAgICAgXCJJTk5FUlwiLFxuICAgICAgICAgICAgZW50aXR5T3JQcm9wZXJ0eSxcbiAgICAgICAgICAgIGFsaWFzLFxuICAgICAgICAgICAgY29uZGl0aW9uLFxuICAgICAgICAgICAgcGFyYW1ldGVycyxcbiAgICAgICAgICAgIG1hcFRvUHJvcGVydHksXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgKVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExFRlQgSk9JTnMgZ2l2ZW4gc3VicXVlcnksIFNFTEVDVHMgdGhlIGRhdGEgcmV0dXJuZWQgYnkgYSBqb2luIGFuZCBNQVBzIGFsbCB0aGF0IGRhdGEgdG8gc29tZSBlbnRpdHkncyBwcm9wZXJ0eS5cbiAgICAgKiBUaGlzIGlzIGV4dHJlbWVseSB1c2VmdWwgd2hlbiB5b3Ugd2FudCB0byBzZWxlY3Qgc29tZSBkYXRhIGFuZCBtYXAgaXQgdG8gc29tZSB2aXJ0dWFsIHByb3BlcnR5LlxuICAgICAqIEl0IHdpbGwgYXNzdW1lIHRoYXQgdGhlcmUgYXJlIG11bHRpcGxlIHJvd3Mgb2Ygc2VsZWN0aW5nIGRhdGEsIGFuZCBtYXBwZWQgcmVzdWx0IHdpbGwgYmUgYW4gYXJyYXkuXG4gICAgICogR2l2ZW4gZW50aXR5IHByb3BlcnR5IHNob3VsZCBiZSBhIHJlbGF0aW9uLlxuICAgICAqIFlvdSBhbHNvIG5lZWQgdG8gc3BlY2lmeSBhbiBhbGlhcyBvZiB0aGUgam9pbmVkIGRhdGEuXG4gICAgICogT3B0aW9uYWxseSwgeW91IGNhbiBhZGQgY29uZGl0aW9uIGFuZCBwYXJhbWV0ZXJzIHVzZWQgaW4gY29uZGl0aW9uLlxuICAgICAqL1xuICAgIGxlZnRKb2luQW5kTWFwTWFueShcbiAgICAgICAgbWFwVG9Qcm9wZXJ0eTogc3RyaW5nLFxuICAgICAgICBzdWJRdWVyeUZhY3Rvcnk6IChcbiAgICAgICAgICAgIHFiOiBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PixcbiAgICAgICAgKSA9PiBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PixcbiAgICAgICAgYWxpYXM6IHN0cmluZyxcbiAgICAgICAgY29uZGl0aW9uPzogc3RyaW5nLFxuICAgICAgICBwYXJhbWV0ZXJzPzogT2JqZWN0TGl0ZXJhbCxcbiAgICApOiB0aGlzXG5cbiAgICAvKipcbiAgICAgKiBMRUZUIEpPSU5zIGVudGl0eSdzIHByb3BlcnR5LCBTRUxFQ1RzIHRoZSBkYXRhIHJldHVybmVkIGJ5IGEgam9pbiBhbmQgTUFQcyBhbGwgdGhhdCBkYXRhIHRvIHNvbWUgZW50aXR5J3MgcHJvcGVydHkuXG4gICAgICogVGhpcyBpcyBleHRyZW1lbHkgdXNlZnVsIHdoZW4geW91IHdhbnQgdG8gc2VsZWN0IHNvbWUgZGF0YSBhbmQgbWFwIGl0IHRvIHNvbWUgdmlydHVhbCBwcm9wZXJ0eS5cbiAgICAgKiBJdCB3aWxsIGFzc3VtZSB0aGF0IHRoZXJlIGFyZSBtdWx0aXBsZSByb3dzIG9mIHNlbGVjdGluZyBkYXRhLCBhbmQgbWFwcGVkIHJlc3VsdCB3aWxsIGJlIGFuIGFycmF5LlxuICAgICAqIEdpdmVuIGVudGl0eSBwcm9wZXJ0eSBzaG91bGQgYmUgYSByZWxhdGlvbi5cbiAgICAgKiBZb3UgYWxzbyBuZWVkIHRvIHNwZWNpZnkgYW4gYWxpYXMgb2YgdGhlIGpvaW5lZCBkYXRhLlxuICAgICAqIE9wdGlvbmFsbHksIHlvdSBjYW4gYWRkIGNvbmRpdGlvbiBhbmQgcGFyYW1ldGVycyB1c2VkIGluIGNvbmRpdGlvbi5cbiAgICAgKi9cbiAgICBsZWZ0Sm9pbkFuZE1hcE1hbnkoXG4gICAgICAgIG1hcFRvUHJvcGVydHk6IHN0cmluZyxcbiAgICAgICAgcHJvcGVydHk6IHN0cmluZyxcbiAgICAgICAgYWxpYXM6IHN0cmluZyxcbiAgICAgICAgY29uZGl0aW9uPzogc3RyaW5nLFxuICAgICAgICBwYXJhbWV0ZXJzPzogT2JqZWN0TGl0ZXJhbCxcbiAgICApOiB0aGlzXG5cbiAgICAvKipcbiAgICAgKiBMRUZUIEpPSU5zIGVudGl0eSdzIHRhYmxlLCBTRUxFQ1RzIHRoZSBkYXRhIHJldHVybmVkIGJ5IGEgam9pbiBhbmQgTUFQcyBhbGwgdGhhdCBkYXRhIHRvIHNvbWUgZW50aXR5J3MgcHJvcGVydHkuXG4gICAgICogVGhpcyBpcyBleHRyZW1lbHkgdXNlZnVsIHdoZW4geW91IHdhbnQgdG8gc2VsZWN0IHNvbWUgZGF0YSBhbmQgbWFwIGl0IHRvIHNvbWUgdmlydHVhbCBwcm9wZXJ0eS5cbiAgICAgKiBJdCB3aWxsIGFzc3VtZSB0aGF0IHRoZXJlIGFyZSBtdWx0aXBsZSByb3dzIG9mIHNlbGVjdGluZyBkYXRhLCBhbmQgbWFwcGVkIHJlc3VsdCB3aWxsIGJlIGFuIGFycmF5LlxuICAgICAqIFlvdSBhbHNvIG5lZWQgdG8gc3BlY2lmeSBhbiBhbGlhcyBvZiB0aGUgam9pbmVkIGRhdGEuXG4gICAgICogT3B0aW9uYWxseSwgeW91IGNhbiBhZGQgY29uZGl0aW9uIGFuZCBwYXJhbWV0ZXJzIHVzZWQgaW4gY29uZGl0aW9uLlxuICAgICAqL1xuICAgIGxlZnRKb2luQW5kTWFwTWFueShcbiAgICAgICAgbWFwVG9Qcm9wZXJ0eTogc3RyaW5nLFxuICAgICAgICBlbnRpdHk6IEZ1bmN0aW9uIHwgc3RyaW5nLFxuICAgICAgICBhbGlhczogc3RyaW5nLFxuICAgICAgICBjb25kaXRpb24/OiBzdHJpbmcsXG4gICAgICAgIHBhcmFtZXRlcnM/OiBPYmplY3RMaXRlcmFsLFxuICAgICk6IHRoaXNcblxuICAgIC8qKlxuICAgICAqIExFRlQgSk9JTnMgdGFibGUsIFNFTEVDVHMgdGhlIGRhdGEgcmV0dXJuZWQgYnkgYSBqb2luIGFuZCBNQVBzIGFsbCB0aGF0IGRhdGEgdG8gc29tZSBlbnRpdHkncyBwcm9wZXJ0eS5cbiAgICAgKiBUaGlzIGlzIGV4dHJlbWVseSB1c2VmdWwgd2hlbiB5b3Ugd2FudCB0byBzZWxlY3Qgc29tZSBkYXRhIGFuZCBtYXAgaXQgdG8gc29tZSB2aXJ0dWFsIHByb3BlcnR5LlxuICAgICAqIEl0IHdpbGwgYXNzdW1lIHRoYXQgdGhlcmUgYXJlIG11bHRpcGxlIHJvd3Mgb2Ygc2VsZWN0aW5nIGRhdGEsIGFuZCBtYXBwZWQgcmVzdWx0IHdpbGwgYmUgYW4gYXJyYXkuXG4gICAgICogWW91IGFsc28gbmVlZCB0byBzcGVjaWZ5IGFuIGFsaWFzIG9mIHRoZSBqb2luZWQgZGF0YS5cbiAgICAgKiBPcHRpb25hbGx5LCB5b3UgY2FuIGFkZCBjb25kaXRpb24gYW5kIHBhcmFtZXRlcnMgdXNlZCBpbiBjb25kaXRpb24uXG4gICAgICovXG4gICAgbGVmdEpvaW5BbmRNYXBNYW55KFxuICAgICAgICBtYXBUb1Byb3BlcnR5OiBzdHJpbmcsXG4gICAgICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgICAgICBhbGlhczogc3RyaW5nLFxuICAgICAgICBjb25kaXRpb24/OiBzdHJpbmcsXG4gICAgICAgIHBhcmFtZXRlcnM/OiBPYmplY3RMaXRlcmFsLFxuICAgICk6IHRoaXNcblxuICAgIC8qKlxuICAgICAqIExFRlQgSk9JTnMsIFNFTEVDVHMgdGhlIGRhdGEgcmV0dXJuZWQgYnkgYSBqb2luIGFuZCBNQVBzIGFsbCB0aGF0IGRhdGEgdG8gc29tZSBlbnRpdHkncyBwcm9wZXJ0eS5cbiAgICAgKiBUaGlzIGlzIGV4dHJlbWVseSB1c2VmdWwgd2hlbiB5b3Ugd2FudCB0byBzZWxlY3Qgc29tZSBkYXRhIGFuZCBtYXAgaXQgdG8gc29tZSB2aXJ0dWFsIHByb3BlcnR5LlxuICAgICAqIEl0IHdpbGwgYXNzdW1lIHRoYXQgdGhlcmUgYXJlIG11bHRpcGxlIHJvd3Mgb2Ygc2VsZWN0aW5nIGRhdGEsIGFuZCBtYXBwZWQgcmVzdWx0IHdpbGwgYmUgYW4gYXJyYXkuXG4gICAgICogWW91IGFsc28gbmVlZCB0byBzcGVjaWZ5IGFuIGFsaWFzIG9mIHRoZSBqb2luZWQgZGF0YS5cbiAgICAgKiBPcHRpb25hbGx5LCB5b3UgY2FuIGFkZCBjb25kaXRpb24gYW5kIHBhcmFtZXRlcnMgdXNlZCBpbiBjb25kaXRpb24uXG4gICAgICovXG4gICAgbGVmdEpvaW5BbmRNYXBNYW55KFxuICAgICAgICBtYXBUb1Byb3BlcnR5OiBzdHJpbmcsXG4gICAgICAgIGVudGl0eU9yUHJvcGVydHk6XG4gICAgICAgICAgICB8IEZ1bmN0aW9uXG4gICAgICAgICAgICB8IHN0cmluZ1xuICAgICAgICAgICAgfCAoKHFiOiBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PikgPT4gU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4pLFxuICAgICAgICBhbGlhczogc3RyaW5nLFxuICAgICAgICBjb25kaXRpb24/OiBzdHJpbmcsXG4gICAgICAgIHBhcmFtZXRlcnM/OiBPYmplY3RMaXRlcmFsLFxuICAgICk6IHRoaXMge1xuICAgICAgICB0aGlzLmFkZFNlbGVjdChhbGlhcylcbiAgICAgICAgdGhpcy5qb2luKFxuICAgICAgICAgICAgXCJMRUZUXCIsXG4gICAgICAgICAgICBlbnRpdHlPclByb3BlcnR5LFxuICAgICAgICAgICAgYWxpYXMsXG4gICAgICAgICAgICBjb25kaXRpb24sXG4gICAgICAgICAgICBwYXJhbWV0ZXJzLFxuICAgICAgICAgICAgbWFwVG9Qcm9wZXJ0eSxcbiAgICAgICAgICAgIHRydWUsXG4gICAgICAgIClcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMRUZUIEpPSU5zIGdpdmVuIHN1YnF1ZXJ5LCBTRUxFQ1RzIHRoZSBkYXRhIHJldHVybmVkIGJ5IGEgam9pbiBhbmQgTUFQcyBhbGwgdGhhdCBkYXRhIHRvIHNvbWUgZW50aXR5J3MgcHJvcGVydHkuXG4gICAgICogVGhpcyBpcyBleHRyZW1lbHkgdXNlZnVsIHdoZW4geW91IHdhbnQgdG8gc2VsZWN0IHNvbWUgZGF0YSBhbmQgbWFwIGl0IHRvIHNvbWUgdmlydHVhbCBwcm9wZXJ0eS5cbiAgICAgKiBJdCB3aWxsIGFzc3VtZSB0aGF0IHRoZXJlIGlzIGEgc2luZ2xlIHJvdyBvZiBzZWxlY3RpbmcgZGF0YSwgYW5kIG1hcHBlZCByZXN1bHQgd2lsbCBiZSBhIHNpbmdsZSBzZWxlY3RlZCB2YWx1ZS5cbiAgICAgKiBHaXZlbiBlbnRpdHkgcHJvcGVydHkgc2hvdWxkIGJlIGEgcmVsYXRpb24uXG4gICAgICogWW91IGFsc28gbmVlZCB0byBzcGVjaWZ5IGFuIGFsaWFzIG9mIHRoZSBqb2luZWQgZGF0YS5cbiAgICAgKiBPcHRpb25hbGx5LCB5b3UgY2FuIGFkZCBjb25kaXRpb24gYW5kIHBhcmFtZXRlcnMgdXNlZCBpbiBjb25kaXRpb24uXG4gICAgICovXG4gICAgbGVmdEpvaW5BbmRNYXBPbmUoXG4gICAgICAgIG1hcFRvUHJvcGVydHk6IHN0cmluZyxcbiAgICAgICAgc3ViUXVlcnlGYWN0b3J5OiAoXG4gICAgICAgICAgICBxYjogU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4sXG4gICAgICAgICkgPT4gU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4sXG4gICAgICAgIGFsaWFzOiBzdHJpbmcsXG4gICAgICAgIGNvbmRpdGlvbj86IHN0cmluZyxcbiAgICAgICAgcGFyYW1ldGVycz86IE9iamVjdExpdGVyYWwsXG4gICAgKTogdGhpc1xuXG4gICAgLyoqXG4gICAgICogTEVGVCBKT0lOcyBlbnRpdHkncyBwcm9wZXJ0eSwgU0VMRUNUcyB0aGUgZGF0YSByZXR1cm5lZCBieSBhIGpvaW4gYW5kIE1BUHMgYWxsIHRoYXQgZGF0YSB0byBzb21lIGVudGl0eSdzIHByb3BlcnR5LlxuICAgICAqIFRoaXMgaXMgZXh0cmVtZWx5IHVzZWZ1bCB3aGVuIHlvdSB3YW50IHRvIHNlbGVjdCBzb21lIGRhdGEgYW5kIG1hcCBpdCB0byBzb21lIHZpcnR1YWwgcHJvcGVydHkuXG4gICAgICogSXQgd2lsbCBhc3N1bWUgdGhhdCB0aGVyZSBpcyBhIHNpbmdsZSByb3cgb2Ygc2VsZWN0aW5nIGRhdGEsIGFuZCBtYXBwZWQgcmVzdWx0IHdpbGwgYmUgYSBzaW5nbGUgc2VsZWN0ZWQgdmFsdWUuXG4gICAgICogR2l2ZW4gZW50aXR5IHByb3BlcnR5IHNob3VsZCBiZSBhIHJlbGF0aW9uLlxuICAgICAqIFlvdSBhbHNvIG5lZWQgdG8gc3BlY2lmeSBhbiBhbGlhcyBvZiB0aGUgam9pbmVkIGRhdGEuXG4gICAgICogT3B0aW9uYWxseSwgeW91IGNhbiBhZGQgY29uZGl0aW9uIGFuZCBwYXJhbWV0ZXJzIHVzZWQgaW4gY29uZGl0aW9uLlxuICAgICAqL1xuICAgIGxlZnRKb2luQW5kTWFwT25lKFxuICAgICAgICBtYXBUb1Byb3BlcnR5OiBzdHJpbmcsXG4gICAgICAgIHByb3BlcnR5OiBzdHJpbmcsXG4gICAgICAgIGFsaWFzOiBzdHJpbmcsXG4gICAgICAgIGNvbmRpdGlvbj86IHN0cmluZyxcbiAgICAgICAgcGFyYW1ldGVycz86IE9iamVjdExpdGVyYWwsXG4gICAgKTogdGhpc1xuXG4gICAgLyoqXG4gICAgICogTEVGVCBKT0lOcyBlbnRpdHkncyB0YWJsZSwgU0VMRUNUcyB0aGUgZGF0YSByZXR1cm5lZCBieSBhIGpvaW4gYW5kIE1BUHMgYWxsIHRoYXQgZGF0YSB0byBzb21lIGVudGl0eSdzIHByb3BlcnR5LlxuICAgICAqIFRoaXMgaXMgZXh0cmVtZWx5IHVzZWZ1bCB3aGVuIHlvdSB3YW50IHRvIHNlbGVjdCBzb21lIGRhdGEgYW5kIG1hcCBpdCB0byBzb21lIHZpcnR1YWwgcHJvcGVydHkuXG4gICAgICogSXQgd2lsbCBhc3N1bWUgdGhhdCB0aGVyZSBpcyBhIHNpbmdsZSByb3cgb2Ygc2VsZWN0aW5nIGRhdGEsIGFuZCBtYXBwZWQgcmVzdWx0IHdpbGwgYmUgYSBzaW5nbGUgc2VsZWN0ZWQgdmFsdWUuXG4gICAgICogWW91IGFsc28gbmVlZCB0byBzcGVjaWZ5IGFuIGFsaWFzIG9mIHRoZSBqb2luZWQgZGF0YS5cbiAgICAgKiBPcHRpb25hbGx5LCB5b3UgY2FuIGFkZCBjb25kaXRpb24gYW5kIHBhcmFtZXRlcnMgdXNlZCBpbiBjb25kaXRpb24uXG4gICAgICovXG4gICAgbGVmdEpvaW5BbmRNYXBPbmUoXG4gICAgICAgIG1hcFRvUHJvcGVydHk6IHN0cmluZyxcbiAgICAgICAgZW50aXR5OiBGdW5jdGlvbiB8IHN0cmluZyxcbiAgICAgICAgYWxpYXM6IHN0cmluZyxcbiAgICAgICAgY29uZGl0aW9uPzogc3RyaW5nLFxuICAgICAgICBwYXJhbWV0ZXJzPzogT2JqZWN0TGl0ZXJhbCxcbiAgICApOiB0aGlzXG5cbiAgICAvKipcbiAgICAgKiBMRUZUIEpPSU5zIHRhYmxlLCBTRUxFQ1RzIHRoZSBkYXRhIHJldHVybmVkIGJ5IGEgam9pbiBhbmQgTUFQcyBhbGwgdGhhdCBkYXRhIHRvIHNvbWUgZW50aXR5J3MgcHJvcGVydHkuXG4gICAgICogVGhpcyBpcyBleHRyZW1lbHkgdXNlZnVsIHdoZW4geW91IHdhbnQgdG8gc2VsZWN0IHNvbWUgZGF0YSBhbmQgbWFwIGl0IHRvIHNvbWUgdmlydHVhbCBwcm9wZXJ0eS5cbiAgICAgKiBJdCB3aWxsIGFzc3VtZSB0aGF0IHRoZXJlIGlzIGEgc2luZ2xlIHJvdyBvZiBzZWxlY3RpbmcgZGF0YSwgYW5kIG1hcHBlZCByZXN1bHQgd2lsbCBiZSBhIHNpbmdsZSBzZWxlY3RlZCB2YWx1ZS5cbiAgICAgKiBZb3UgYWxzbyBuZWVkIHRvIHNwZWNpZnkgYW4gYWxpYXMgb2YgdGhlIGpvaW5lZCBkYXRhLlxuICAgICAqIE9wdGlvbmFsbHksIHlvdSBjYW4gYWRkIGNvbmRpdGlvbiBhbmQgcGFyYW1ldGVycyB1c2VkIGluIGNvbmRpdGlvbi5cbiAgICAgKi9cbiAgICBsZWZ0Sm9pbkFuZE1hcE9uZShcbiAgICAgICAgbWFwVG9Qcm9wZXJ0eTogc3RyaW5nLFxuICAgICAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICAgICAgYWxpYXM6IHN0cmluZyxcbiAgICAgICAgY29uZGl0aW9uPzogc3RyaW5nLFxuICAgICAgICBwYXJhbWV0ZXJzPzogT2JqZWN0TGl0ZXJhbCxcbiAgICApOiB0aGlzXG5cbiAgICAvKipcbiAgICAgKiBMRUZUIEpPSU5zLCBTRUxFQ1RzIHRoZSBkYXRhIHJldHVybmVkIGJ5IGEgam9pbiBhbmQgTUFQcyBhbGwgdGhhdCBkYXRhIHRvIHNvbWUgZW50aXR5J3MgcHJvcGVydHkuXG4gICAgICogVGhpcyBpcyBleHRyZW1lbHkgdXNlZnVsIHdoZW4geW91IHdhbnQgdG8gc2VsZWN0IHNvbWUgZGF0YSBhbmQgbWFwIGl0IHRvIHNvbWUgdmlydHVhbCBwcm9wZXJ0eS5cbiAgICAgKiBJdCB3aWxsIGFzc3VtZSB0aGF0IHRoZXJlIGlzIGEgc2luZ2xlIHJvdyBvZiBzZWxlY3RpbmcgZGF0YSwgYW5kIG1hcHBlZCByZXN1bHQgd2lsbCBiZSBhIHNpbmdsZSBzZWxlY3RlZCB2YWx1ZS5cbiAgICAgKiBZb3UgYWxzbyBuZWVkIHRvIHNwZWNpZnkgYW4gYWxpYXMgb2YgdGhlIGpvaW5lZCBkYXRhLlxuICAgICAqIE9wdGlvbmFsbHksIHlvdSBjYW4gYWRkIGNvbmRpdGlvbiBhbmQgcGFyYW1ldGVycyB1c2VkIGluIGNvbmRpdGlvbi5cbiAgICAgKi9cbiAgICBsZWZ0Sm9pbkFuZE1hcE9uZShcbiAgICAgICAgbWFwVG9Qcm9wZXJ0eTogc3RyaW5nLFxuICAgICAgICBlbnRpdHlPclByb3BlcnR5OlxuICAgICAgICAgICAgfCBGdW5jdGlvblxuICAgICAgICAgICAgfCBzdHJpbmdcbiAgICAgICAgICAgIHwgKChxYjogU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4pID0+IFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+KSxcbiAgICAgICAgYWxpYXM6IHN0cmluZyxcbiAgICAgICAgY29uZGl0aW9uPzogc3RyaW5nLFxuICAgICAgICBwYXJhbWV0ZXJzPzogT2JqZWN0TGl0ZXJhbCxcbiAgICApOiB0aGlzIHtcbiAgICAgICAgdGhpcy5hZGRTZWxlY3QoYWxpYXMpXG4gICAgICAgIHRoaXMuam9pbihcbiAgICAgICAgICAgIFwiTEVGVFwiLFxuICAgICAgICAgICAgZW50aXR5T3JQcm9wZXJ0eSxcbiAgICAgICAgICAgIGFsaWFzLFxuICAgICAgICAgICAgY29uZGl0aW9uLFxuICAgICAgICAgICAgcGFyYW1ldGVycyxcbiAgICAgICAgICAgIG1hcFRvUHJvcGVydHksXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgKVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqL1xuXG5cbiAgICAvKipcbiAgICAgKi9cblxuXG4gICAgLyoqXG4gICAgICovXG5cblxuICAgIC8qKlxuICAgICAqL1xuXG5cblxuXG5cblxuXG5cblxuICAgIC8qKlxuICAgICAqIExFRlQgSk9JTnMgcmVsYXRpb24gaWQgYW5kIG1hcHMgaXQgaW50byBzb21lIGVudGl0eSdzIHByb3BlcnR5LlxuICAgICAqIE9wdGlvbmFsbHksIHlvdSBjYW4gYWRkIGNvbmRpdGlvbiBhbmQgcGFyYW1ldGVycyB1c2VkIGluIGNvbmRpdGlvbi5cbiAgICAgKi9cbiAgICBsb2FkUmVsYXRpb25JZEFuZE1hcChcbiAgICAgICAgbWFwVG9Qcm9wZXJ0eTogc3RyaW5nLFxuICAgICAgICByZWxhdGlvbk5hbWU6IHN0cmluZyxcbiAgICAgICAgb3B0aW9ucz86IHsgZGlzYWJsZU1peGVkTWFwPzogYm9vbGVhbiB9LFxuICAgICk6IHRoaXNcblxuICAgIC8qKlxuICAgICAqIExFRlQgSk9JTnMgcmVsYXRpb24gaWQgYW5kIG1hcHMgaXQgaW50byBzb21lIGVudGl0eSdzIHByb3BlcnR5LlxuICAgICAqIE9wdGlvbmFsbHksIHlvdSBjYW4gYWRkIGNvbmRpdGlvbiBhbmQgcGFyYW1ldGVycyB1c2VkIGluIGNvbmRpdGlvbi5cbiAgICAgKi9cbiAgICBsb2FkUmVsYXRpb25JZEFuZE1hcChcbiAgICAgICAgbWFwVG9Qcm9wZXJ0eTogc3RyaW5nLFxuICAgICAgICByZWxhdGlvbk5hbWU6IHN0cmluZyxcbiAgICAgICAgYWxpYXM6IHN0cmluZyxcbiAgICAgICAgcXVlcnlCdWlsZGVyRmFjdG9yeTogKFxuICAgICAgICAgICAgcWI6IFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+LFxuICAgICAgICApID0+IFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+LFxuICAgICk6IHRoaXNcblxuICAgIC8qKlxuICAgICAqIExFRlQgSk9JTnMgcmVsYXRpb24gaWQgYW5kIG1hcHMgaXQgaW50byBzb21lIGVudGl0eSdzIHByb3BlcnR5LlxuICAgICAqIE9wdGlvbmFsbHksIHlvdSBjYW4gYWRkIGNvbmRpdGlvbiBhbmQgcGFyYW1ldGVycyB1c2VkIGluIGNvbmRpdGlvbi5cbiAgICAgKi9cbiAgICBsb2FkUmVsYXRpb25JZEFuZE1hcChcbiAgICAgICAgbWFwVG9Qcm9wZXJ0eTogc3RyaW5nLFxuICAgICAgICByZWxhdGlvbk5hbWU6IHN0cmluZyxcbiAgICAgICAgYWxpYXNOYW1lT3JPcHRpb25zPzogc3RyaW5nIHwgeyBkaXNhYmxlTWl4ZWRNYXA/OiBib29sZWFuIH0sXG4gICAgICAgIHF1ZXJ5QnVpbGRlckZhY3Rvcnk/OiAoXG4gICAgICAgICAgICBxYjogU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4sXG4gICAgICAgICkgPT4gU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4sXG4gICAgKTogdGhpcyB7XG4gICAgICAgIGNvbnN0IHJlbGF0aW9uSWRBdHRyaWJ1dGUgPSBuZXcgUmVsYXRpb25JZEF0dHJpYnV0ZSh0aGlzLmV4cHJlc3Npb25NYXApXG4gICAgICAgIHJlbGF0aW9uSWRBdHRyaWJ1dGUubWFwVG9Qcm9wZXJ0eSA9IG1hcFRvUHJvcGVydHlcbiAgICAgICAgcmVsYXRpb25JZEF0dHJpYnV0ZS5yZWxhdGlvbk5hbWUgPSByZWxhdGlvbk5hbWVcbiAgICAgICAgaWYgKHR5cGVvZiBhbGlhc05hbWVPck9wdGlvbnMgPT09IFwic3RyaW5nXCIpXG4gICAgICAgICAgICByZWxhdGlvbklkQXR0cmlidXRlLmFsaWFzID0gYWxpYXNOYW1lT3JPcHRpb25zXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHR5cGVvZiBhbGlhc05hbWVPck9wdGlvbnMgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICAgIChhbGlhc05hbWVPck9wdGlvbnMgYXMgYW55KS5kaXNhYmxlTWl4ZWRNYXBcbiAgICAgICAgKVxuICAgICAgICAgICAgcmVsYXRpb25JZEF0dHJpYnV0ZS5kaXNhYmxlTWl4ZWRNYXAgPSB0cnVlXG5cbiAgICAgICAgcmVsYXRpb25JZEF0dHJpYnV0ZS5xdWVyeUJ1aWxkZXJGYWN0b3J5ID0gcXVlcnlCdWlsZGVyRmFjdG9yeVxuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAucmVsYXRpb25JZEF0dHJpYnV0ZXMucHVzaChyZWxhdGlvbklkQXR0cmlidXRlKVxuXG4gICAgICAgIGlmIChyZWxhdGlvbklkQXR0cmlidXRlLnJlbGF0aW9uLmp1bmN0aW9uRW50aXR5TWV0YWRhdGEpIHtcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5jcmVhdGVBbGlhcyh7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJvdGhlclwiLFxuICAgICAgICAgICAgICAgIG5hbWU6IHJlbGF0aW9uSWRBdHRyaWJ1dGUuanVuY3Rpb25BbGlhcyxcbiAgICAgICAgICAgICAgICBtZXRhZGF0YTogcmVsYXRpb25JZEF0dHJpYnV0ZS5yZWxhdGlvbi5qdW5jdGlvbkVudGl0eU1ldGFkYXRhLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvdW50cyBudW1iZXIgb2YgZW50aXRpZXMgb2YgZW50aXR5J3MgcmVsYXRpb24gYW5kIG1hcHMgdGhlIHZhbHVlIGludG8gc29tZSBlbnRpdHkncyBwcm9wZXJ0eS5cbiAgICAgKiBPcHRpb25hbGx5LCB5b3UgY2FuIGFkZCBjb25kaXRpb24gYW5kIHBhcmFtZXRlcnMgdXNlZCBpbiBjb25kaXRpb24uXG4gICAgICovXG4gICAgbG9hZFJlbGF0aW9uQ291bnRBbmRNYXAoXG4gICAgICAgIG1hcFRvUHJvcGVydHk6IHN0cmluZyxcbiAgICAgICAgcmVsYXRpb25OYW1lOiBzdHJpbmcsXG4gICAgICAgIGFsaWFzTmFtZT86IHN0cmluZyxcbiAgICAgICAgcXVlcnlCdWlsZGVyRmFjdG9yeT86IChcbiAgICAgICAgICAgIHFiOiBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PixcbiAgICAgICAgKSA9PiBTZWxlY3RRdWVyeUJ1aWxkZXI8YW55PixcbiAgICApOiB0aGlzIHtcbiAgICAgICAgY29uc3QgcmVsYXRpb25Db3VudEF0dHJpYnV0ZSA9IG5ldyBSZWxhdGlvbkNvdW50QXR0cmlidXRlKFxuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLFxuICAgICAgICApXG4gICAgICAgIHJlbGF0aW9uQ291bnRBdHRyaWJ1dGUubWFwVG9Qcm9wZXJ0eSA9IG1hcFRvUHJvcGVydHlcbiAgICAgICAgcmVsYXRpb25Db3VudEF0dHJpYnV0ZS5yZWxhdGlvbk5hbWUgPSByZWxhdGlvbk5hbWVcbiAgICAgICAgcmVsYXRpb25Db3VudEF0dHJpYnV0ZS5hbGlhcyA9IGFsaWFzTmFtZVxuICAgICAgICByZWxhdGlvbkNvdW50QXR0cmlidXRlLnF1ZXJ5QnVpbGRlckZhY3RvcnkgPSBxdWVyeUJ1aWxkZXJGYWN0b3J5XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5yZWxhdGlvbkNvdW50QXR0cmlidXRlcy5wdXNoKHJlbGF0aW9uQ291bnRBdHRyaWJ1dGUpXG5cbiAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmNyZWF0ZUFsaWFzKHtcbiAgICAgICAgICAgIHR5cGU6IFwib3RoZXJcIixcbiAgICAgICAgICAgIG5hbWU6IHJlbGF0aW9uQ291bnRBdHRyaWJ1dGUuanVuY3Rpb25BbGlhcyxcbiAgICAgICAgfSlcbiAgICAgICAgaWYgKHJlbGF0aW9uQ291bnRBdHRyaWJ1dGUucmVsYXRpb24uanVuY3Rpb25FbnRpdHlNZXRhZGF0YSkge1xuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmNyZWF0ZUFsaWFzKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcIm90aGVyXCIsXG4gICAgICAgICAgICAgICAgbmFtZTogcmVsYXRpb25Db3VudEF0dHJpYnV0ZS5qdW5jdGlvbkFsaWFzLFxuICAgICAgICAgICAgICAgIG1ldGFkYXRhOlxuICAgICAgICAgICAgICAgICAgICByZWxhdGlvbkNvdW50QXR0cmlidXRlLnJlbGF0aW9uLmp1bmN0aW9uRW50aXR5TWV0YWRhdGEsXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZHMgYWxsIHJlbGF0aW9uIGlkcyBmb3IgYWxsIHJlbGF0aW9ucyBvZiB0aGUgc2VsZWN0ZWQgZW50aXR5LlxuICAgICAqIEFsbCByZWxhdGlvbiBpZHMgd2lsbCBiZSBtYXBwZWQgdG8gcmVsYXRpb24gcHJvcGVydHkgdGhlbXNlbGYuXG4gICAgICogSWYgYXJyYXkgb2Ygc3RyaW5ncyBpcyBnaXZlbiB0aGVuIGxvYWRzIG9ubHkgcmVsYXRpb24gaWRzIG9mIHRoZSBnaXZlbiBwcm9wZXJ0aWVzLlxuICAgICAqL1xuICAgIGxvYWRBbGxSZWxhdGlvbklkcyhvcHRpb25zPzoge1xuICAgICAgICByZWxhdGlvbnM/OiBzdHJpbmdbXVxuICAgICAgICBkaXNhYmxlTWl4ZWRNYXA/OiBib29sZWFuXG4gICAgfSk6IHRoaXMge1xuXG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMhLm1ldGFkYXRhLnJlbGF0aW9ucy5mb3JFYWNoKChyZWxhdGlvbikgPT4ge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIG9wdGlvbnMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgIG9wdGlvbnMucmVsYXRpb25zICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICBvcHRpb25zLnJlbGF0aW9ucy5pbmRleE9mKHJlbGF0aW9uLnByb3BlcnR5UGF0aCkgPT09IC0xXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgcmV0dXJuXG5cbiAgICAgICAgICAgIHRoaXMubG9hZFJlbGF0aW9uSWRBbmRNYXAoXG4gICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcyEubmFtZSArXG4gICAgICAgICAgICAgICAgICAgIFwiLlwiICtcbiAgICAgICAgICAgICAgICAgICAgcmVsYXRpb24ucHJvcGVydHlQYXRoLFxuICAgICAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMhLm5hbWUgK1xuICAgICAgICAgICAgICAgICAgICBcIi5cIiArXG4gICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uLnByb3BlcnR5UGF0aCxcbiAgICAgICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgKVxuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgV0hFUkUgY29uZGl0aW9uIGluIHRoZSBxdWVyeSBidWlsZGVyLlxuICAgICAqIElmIHlvdSBoYWQgcHJldmlvdXNseSBXSEVSRSBleHByZXNzaW9uIGRlZmluZWQsXG4gICAgICogY2FsbGluZyB0aGlzIGZ1bmN0aW9uIHdpbGwgb3ZlcnJpZGUgcHJldmlvdXNseSBzZXQgV0hFUkUgY29uZGl0aW9ucy5cbiAgICAgKiBBZGRpdGlvbmFsbHkgeW91IGNhbiBhZGQgcGFyYW1ldGVycyB1c2VkIGluIHdoZXJlIGV4cHJlc3Npb24uXG4gICAgICovXG4gICAgd2hlcmUoXG4gICAgICAgIHdoZXJlOlxuICAgICAgICAgICAgfCBCcmFja2V0c1xuICAgICAgICAgICAgfCBzdHJpbmdcbiAgICAgICAgICAgIHwgKChxYjogdGhpcykgPT4gc3RyaW5nKVxuICAgICAgICAgICAgfCBPYmplY3RMaXRlcmFsXG4gICAgICAgICAgICB8IE9iamVjdExpdGVyYWxbXSxcbiAgICAgICAgcGFyYW1ldGVycz86IE9iamVjdExpdGVyYWwsXG4gICAgKTogdGhpcyB7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC53aGVyZXMgPSBbXSAvLyBkb24ndCBtb3ZlIHRoaXMgYmxvY2sgYmVsb3cgc2luY2UgY29tcHV0ZVdoZXJlUGFyYW1ldGVyIGNhbiBhZGQgd2hlcmUgZXhwcmVzc2lvbnNcbiAgICAgICAgY29uc3QgY29uZGl0aW9uID0gdGhpcy5nZXRXaGVyZUNvbmRpdGlvbih3aGVyZSlcbiAgICAgICAgaWYgKGNvbmRpdGlvbilcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC53aGVyZXMgPSBbXG4gICAgICAgICAgICAgICAgeyB0eXBlOiBcInNpbXBsZVwiLCBjb25kaXRpb246IGNvbmRpdGlvbiB9LFxuICAgICAgICAgICAgXVxuICAgICAgICBpZiAocGFyYW1ldGVycykgdGhpcy5zZXRQYXJhbWV0ZXJzKHBhcmFtZXRlcnMpXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBuZXcgQU5EIFdIRVJFIGNvbmRpdGlvbiBpbiB0aGUgcXVlcnkgYnVpbGRlci5cbiAgICAgKiBBZGRpdGlvbmFsbHkgeW91IGNhbiBhZGQgcGFyYW1ldGVycyB1c2VkIGluIHdoZXJlIGV4cHJlc3Npb24uXG4gICAgICovXG4gICAgYW5kV2hlcmUoXG4gICAgICAgIHdoZXJlOlxuICAgICAgICAgICAgfCBzdHJpbmdcbiAgICAgICAgICAgIHwgQnJhY2tldHNcbiAgICAgICAgICAgIHwgKChxYjogdGhpcykgPT4gc3RyaW5nKVxuICAgICAgICAgICAgfCBPYmplY3RMaXRlcmFsXG4gICAgICAgICAgICB8IE9iamVjdExpdGVyYWxbXSxcbiAgICAgICAgcGFyYW1ldGVycz86IE9iamVjdExpdGVyYWwsXG4gICAgKTogdGhpcyB7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC53aGVyZXMucHVzaCh7XG4gICAgICAgICAgICB0eXBlOiBcImFuZFwiLFxuICAgICAgICAgICAgY29uZGl0aW9uOiB0aGlzLmdldFdoZXJlQ29uZGl0aW9uKHdoZXJlKSxcbiAgICAgICAgfSlcbiAgICAgICAgaWYgKHBhcmFtZXRlcnMpIHRoaXMuc2V0UGFyYW1ldGVycyhwYXJhbWV0ZXJzKVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgbmV3IE9SIFdIRVJFIGNvbmRpdGlvbiBpbiB0aGUgcXVlcnkgYnVpbGRlci5cbiAgICAgKiBBZGRpdGlvbmFsbHkgeW91IGNhbiBhZGQgcGFyYW1ldGVycyB1c2VkIGluIHdoZXJlIGV4cHJlc3Npb24uXG4gICAgICovXG4gICAgb3JXaGVyZShcbiAgICAgICAgd2hlcmU6XG4gICAgICAgICAgICB8IEJyYWNrZXRzXG4gICAgICAgICAgICB8IHN0cmluZ1xuICAgICAgICAgICAgfCAoKHFiOiB0aGlzKSA9PiBzdHJpbmcpXG4gICAgICAgICAgICB8IE9iamVjdExpdGVyYWxcbiAgICAgICAgICAgIHwgT2JqZWN0TGl0ZXJhbFtdLFxuICAgICAgICBwYXJhbWV0ZXJzPzogT2JqZWN0TGl0ZXJhbCxcbiAgICApOiB0aGlzIHtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLndoZXJlcy5wdXNoKHtcbiAgICAgICAgICAgIHR5cGU6IFwib3JcIixcbiAgICAgICAgICAgIGNvbmRpdGlvbjogdGhpcy5nZXRXaGVyZUNvbmRpdGlvbih3aGVyZSksXG4gICAgICAgIH0pXG4gICAgICAgIGlmIChwYXJhbWV0ZXJzKSB0aGlzLnNldFBhcmFtZXRlcnMocGFyYW1ldGVycylcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIG5ldyBBTkQgV0hFUkUgd2l0aCBjb25kaXRpb25zIGZvciB0aGUgZ2l2ZW4gaWRzLlxuICAgICAqXG4gICAgICogSWRzIGFyZSBtaXhlZC5cbiAgICAgKiBJdCBtZWFucyBpZiB5b3UgaGF2ZSBzaW5nbGUgcHJpbWFyeSBrZXkgeW91IGNhbiBwYXNzIGEgc2ltcGxlIGlkIHZhbHVlcywgZm9yIGV4YW1wbGUgWzEsIDIsIDNdLlxuICAgICAqIElmIHlvdSBoYXZlIG11bHRpcGxlIHByaW1hcnkga2V5cyB5b3UgbmVlZCB0byBwYXNzIG9iamVjdCB3aXRoIHByb3BlcnR5IG5hbWVzIGFuZCB2YWx1ZXMgc3BlY2lmaWVkLFxuICAgICAqIGZvciBleGFtcGxlIFt7IGZpcnN0SWQ6IDEsIHNlY29uZElkOiAyIH0sIHsgZmlyc3RJZDogMiwgc2Vjb25kSWQ6IDMgfSwgLi4uXVxuICAgICAqL1xuICAgIHdoZXJlSW5JZHMoaWRzOiBhbnkgfCBhbnlbXSk6IHRoaXMge1xuICAgICAgICByZXR1cm4gdGhpcy53aGVyZSh0aGlzLmdldFdoZXJlSW5JZHNDb25kaXRpb24oaWRzKSlcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIG5ldyBBTkQgV0hFUkUgd2l0aCBjb25kaXRpb25zIGZvciB0aGUgZ2l2ZW4gaWRzLlxuICAgICAqXG4gICAgICogSWRzIGFyZSBtaXhlZC5cbiAgICAgKiBJdCBtZWFucyBpZiB5b3UgaGF2ZSBzaW5nbGUgcHJpbWFyeSBrZXkgeW91IGNhbiBwYXNzIGEgc2ltcGxlIGlkIHZhbHVlcywgZm9yIGV4YW1wbGUgWzEsIDIsIDNdLlxuICAgICAqIElmIHlvdSBoYXZlIG11bHRpcGxlIHByaW1hcnkga2V5cyB5b3UgbmVlZCB0byBwYXNzIG9iamVjdCB3aXRoIHByb3BlcnR5IG5hbWVzIGFuZCB2YWx1ZXMgc3BlY2lmaWVkLFxuICAgICAqIGZvciBleGFtcGxlIFt7IGZpcnN0SWQ6IDEsIHNlY29uZElkOiAyIH0sIHsgZmlyc3RJZDogMiwgc2Vjb25kSWQ6IDMgfSwgLi4uXVxuICAgICAqL1xuICAgIGFuZFdoZXJlSW5JZHMoaWRzOiBhbnkgfCBhbnlbXSk6IHRoaXMge1xuICAgICAgICByZXR1cm4gdGhpcy5hbmRXaGVyZSh0aGlzLmdldFdoZXJlSW5JZHNDb25kaXRpb24oaWRzKSlcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIG5ldyBPUiBXSEVSRSB3aXRoIGNvbmRpdGlvbnMgZm9yIHRoZSBnaXZlbiBpZHMuXG4gICAgICpcbiAgICAgKiBJZHMgYXJlIG1peGVkLlxuICAgICAqIEl0IG1lYW5zIGlmIHlvdSBoYXZlIHNpbmdsZSBwcmltYXJ5IGtleSB5b3UgY2FuIHBhc3MgYSBzaW1wbGUgaWQgdmFsdWVzLCBmb3IgZXhhbXBsZSBbMSwgMiwgM10uXG4gICAgICogSWYgeW91IGhhdmUgbXVsdGlwbGUgcHJpbWFyeSBrZXlzIHlvdSBuZWVkIHRvIHBhc3Mgb2JqZWN0IHdpdGggcHJvcGVydHkgbmFtZXMgYW5kIHZhbHVlcyBzcGVjaWZpZWQsXG4gICAgICogZm9yIGV4YW1wbGUgW3sgZmlyc3RJZDogMSwgc2Vjb25kSWQ6IDIgfSwgeyBmaXJzdElkOiAyLCBzZWNvbmRJZDogMyB9LCAuLi5dXG4gICAgICovXG4gICAgb3JXaGVyZUluSWRzKGlkczogYW55IHwgYW55W10pOiB0aGlzIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3JXaGVyZSh0aGlzLmdldFdoZXJlSW5JZHNDb25kaXRpb24oaWRzKSlcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIEhBVklORyBjb25kaXRpb24gaW4gdGhlIHF1ZXJ5IGJ1aWxkZXIuXG4gICAgICogSWYgeW91IGhhZCBwcmV2aW91c2x5IEhBVklORyBleHByZXNzaW9uIGRlZmluZWQsXG4gICAgICogY2FsbGluZyB0aGlzIGZ1bmN0aW9uIHdpbGwgb3ZlcnJpZGUgcHJldmlvdXNseSBzZXQgSEFWSU5HIGNvbmRpdGlvbnMuXG4gICAgICogQWRkaXRpb25hbGx5IHlvdSBjYW4gYWRkIHBhcmFtZXRlcnMgdXNlZCBpbiB3aGVyZSBleHByZXNzaW9uLlxuICAgICAqL1xuICAgIGhhdmluZyhoYXZpbmc6IHN0cmluZywgcGFyYW1ldGVycz86IE9iamVjdExpdGVyYWwpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmhhdmluZ3MucHVzaCh7IHR5cGU6IFwic2ltcGxlXCIsIGNvbmRpdGlvbjogaGF2aW5nIH0pXG4gICAgICAgIGlmIChwYXJhbWV0ZXJzKSB0aGlzLnNldFBhcmFtZXRlcnMocGFyYW1ldGVycylcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIG5ldyBBTkQgSEFWSU5HIGNvbmRpdGlvbiBpbiB0aGUgcXVlcnkgYnVpbGRlci5cbiAgICAgKiBBZGRpdGlvbmFsbHkgeW91IGNhbiBhZGQgcGFyYW1ldGVycyB1c2VkIGluIHdoZXJlIGV4cHJlc3Npb24uXG4gICAgICovXG4gICAgYW5kSGF2aW5nKGhhdmluZzogc3RyaW5nLCBwYXJhbWV0ZXJzPzogT2JqZWN0TGl0ZXJhbCk6IHRoaXMge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAuaGF2aW5ncy5wdXNoKHsgdHlwZTogXCJhbmRcIiwgY29uZGl0aW9uOiBoYXZpbmcgfSlcbiAgICAgICAgaWYgKHBhcmFtZXRlcnMpIHRoaXMuc2V0UGFyYW1ldGVycyhwYXJhbWV0ZXJzKVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgbmV3IE9SIEhBVklORyBjb25kaXRpb24gaW4gdGhlIHF1ZXJ5IGJ1aWxkZXIuXG4gICAgICogQWRkaXRpb25hbGx5IHlvdSBjYW4gYWRkIHBhcmFtZXRlcnMgdXNlZCBpbiB3aGVyZSBleHByZXNzaW9uLlxuICAgICAqL1xuICAgIG9ySGF2aW5nKGhhdmluZzogc3RyaW5nLCBwYXJhbWV0ZXJzPzogT2JqZWN0TGl0ZXJhbCk6IHRoaXMge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAuaGF2aW5ncy5wdXNoKHsgdHlwZTogXCJvclwiLCBjb25kaXRpb246IGhhdmluZyB9KVxuICAgICAgICBpZiAocGFyYW1ldGVycykgdGhpcy5zZXRQYXJhbWV0ZXJzKHBhcmFtZXRlcnMpXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBHUk9VUCBCWSBjb25kaXRpb24gaW4gdGhlIHF1ZXJ5IGJ1aWxkZXIuXG4gICAgICogSWYgeW91IGhhZCBwcmV2aW91c2x5IEdST1VQIEJZIGV4cHJlc3Npb24gZGVmaW5lZCxcbiAgICAgKiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gd2lsbCBvdmVycmlkZSBwcmV2aW91c2x5IHNldCBHUk9VUCBCWSBjb25kaXRpb25zLlxuICAgICAqL1xuICAgIGdyb3VwQnkoKTogdGhpc1xuXG4gICAgLyoqXG4gICAgICogU2V0cyBHUk9VUCBCWSBjb25kaXRpb24gaW4gdGhlIHF1ZXJ5IGJ1aWxkZXIuXG4gICAgICogSWYgeW91IGhhZCBwcmV2aW91c2x5IEdST1VQIEJZIGV4cHJlc3Npb24gZGVmaW5lZCxcbiAgICAgKiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gd2lsbCBvdmVycmlkZSBwcmV2aW91c2x5IHNldCBHUk9VUCBCWSBjb25kaXRpb25zLlxuICAgICAqL1xuICAgIGdyb3VwQnkoZ3JvdXBCeTogc3RyaW5nKTogdGhpc1xuXG4gICAgLyoqXG4gICAgICogU2V0cyBHUk9VUCBCWSBjb25kaXRpb24gaW4gdGhlIHF1ZXJ5IGJ1aWxkZXIuXG4gICAgICogSWYgeW91IGhhZCBwcmV2aW91c2x5IEdST1VQIEJZIGV4cHJlc3Npb24gZGVmaW5lZCxcbiAgICAgKiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gd2lsbCBvdmVycmlkZSBwcmV2aW91c2x5IHNldCBHUk9VUCBCWSBjb25kaXRpb25zLlxuICAgICAqL1xuICAgIGdyb3VwQnkoZ3JvdXBCeT86IHN0cmluZyk6IHRoaXMge1xuICAgICAgICBpZiAoZ3JvdXBCeSkge1xuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmdyb3VwQnlzID0gW2dyb3VwQnldXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAuZ3JvdXBCeXMgPSBbXVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBHUk9VUCBCWSBjb25kaXRpb24gaW4gdGhlIHF1ZXJ5IGJ1aWxkZXIuXG4gICAgICovXG4gICAgYWRkR3JvdXBCeShncm91cEJ5OiBzdHJpbmcpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmdyb3VwQnlzLnB1c2goZ3JvdXBCeSlcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIE9SREVSIEJZIGNvbmRpdGlvbiBpbiB0aGUgcXVlcnkgYnVpbGRlci5cbiAgICAgKiBJZiB5b3UgaGFkIHByZXZpb3VzbHkgT1JERVIgQlkgZXhwcmVzc2lvbiBkZWZpbmVkLFxuICAgICAqIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiB3aWxsIG92ZXJyaWRlIHByZXZpb3VzbHkgc2V0IE9SREVSIEJZIGNvbmRpdGlvbnMuXG4gICAgICpcbiAgICAgKiBDYWxsaW5nIG9yZGVyIGJ5IHdpdGhvdXQgb3JkZXIgc2V0IHdpbGwgcmVtb3ZlIGFsbCBwcmV2aW91c2x5IHNldCBvcmRlciBieXMuXG4gICAgICovXG4gICAgb3JkZXJCeSgpOiB0aGlzXG5cbiAgICAvKipcbiAgICAgKiBTZXRzIE9SREVSIEJZIGNvbmRpdGlvbiBpbiB0aGUgcXVlcnkgYnVpbGRlci5cbiAgICAgKiBJZiB5b3UgaGFkIHByZXZpb3VzbHkgT1JERVIgQlkgZXhwcmVzc2lvbiBkZWZpbmVkLFxuICAgICAqIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiB3aWxsIG92ZXJyaWRlIHByZXZpb3VzbHkgc2V0IE9SREVSIEJZIGNvbmRpdGlvbnMuXG4gICAgICovXG4gICAgb3JkZXJCeShcbiAgICAgICAgc29ydDogc3RyaW5nLFxuICAgICAgICBvcmRlcj86IFwiQVNDXCIgfCBcIkRFU0NcIixcbiAgICAgICAgbnVsbHM/OiBcIk5VTExTIEZJUlNUXCIgfCBcIk5VTExTIExBU1RcIixcbiAgICApOiB0aGlzXG5cbiAgICAvKipcbiAgICAgKiBTZXRzIE9SREVSIEJZIGNvbmRpdGlvbiBpbiB0aGUgcXVlcnkgYnVpbGRlci5cbiAgICAgKiBJZiB5b3UgaGFkIHByZXZpb3VzbHkgT1JERVIgQlkgZXhwcmVzc2lvbiBkZWZpbmVkLFxuICAgICAqIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiB3aWxsIG92ZXJyaWRlIHByZXZpb3VzbHkgc2V0IE9SREVSIEJZIGNvbmRpdGlvbnMuXG4gICAgICovXG4gICAgb3JkZXJCeShvcmRlcjogT3JkZXJCeUNvbmRpdGlvbik6IHRoaXNcblxuICAgIC8qKlxuICAgICAqIFNldHMgT1JERVIgQlkgY29uZGl0aW9uIGluIHRoZSBxdWVyeSBidWlsZGVyLlxuICAgICAqIElmIHlvdSBoYWQgcHJldmlvdXNseSBPUkRFUiBCWSBleHByZXNzaW9uIGRlZmluZWQsXG4gICAgICogY2FsbGluZyB0aGlzIGZ1bmN0aW9uIHdpbGwgb3ZlcnJpZGUgcHJldmlvdXNseSBzZXQgT1JERVIgQlkgY29uZGl0aW9ucy5cbiAgICAgKi9cbiAgICBvcmRlckJ5KFxuICAgICAgICBzb3J0Pzogc3RyaW5nIHwgT3JkZXJCeUNvbmRpdGlvbixcbiAgICAgICAgb3JkZXI6IFwiQVNDXCIgfCBcIkRFU0NcIiA9IFwiQVNDXCIsXG4gICAgICAgIG51bGxzPzogXCJOVUxMUyBGSVJTVFwiIHwgXCJOVUxMUyBMQVNUXCIsXG4gICAgKTogdGhpcyB7XG4gICAgICAgIGlmIChvcmRlciAhPT0gdW5kZWZpbmVkICYmIG9yZGVyICE9PSBcIkFTQ1wiICYmIG9yZGVyICE9PSBcIkRFU0NcIilcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXG4gICAgICAgICAgICAgICAgYFNlbGVjdFF1ZXJ5QnVpbGRlci5hZGRPcmRlckJ5IFwib3JkZXJcIiBjYW4gYWNjZXB0IG9ubHkgXCJBU0NcIiBhbmQgXCJERVNDXCIgdmFsdWVzLmAsXG4gICAgICAgICAgICApXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIG51bGxzICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIG51bGxzICE9PSBcIk5VTExTIEZJUlNUXCIgJiZcbiAgICAgICAgICAgIG51bGxzICE9PSBcIk5VTExTIExBU1RcIlxuICAgICAgICApXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFxuICAgICAgICAgICAgICAgIGBTZWxlY3RRdWVyeUJ1aWxkZXIuYWRkT3JkZXJCeSBcIm51bGxzXCIgY2FuIGFjY2VwdCBvbmx5IFwiTlVMTFMgRklSU1RcIiBhbmQgXCJOVUxMUyBMQVNUXCIgdmFsdWVzLmAsXG4gICAgICAgICAgICApXG5cbiAgICAgICAgaWYgKHNvcnQpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygc29ydCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5vcmRlckJ5cyA9IHNvcnQgYXMgT3JkZXJCeUNvbmRpdGlvblxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAobnVsbHMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLm9yZGVyQnlzID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgW3NvcnQgYXMgc3RyaW5nXTogeyBvcmRlciwgbnVsbHMgfSxcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5vcmRlckJ5cyA9IHsgW3NvcnQgYXMgc3RyaW5nXTogb3JkZXIgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5vcmRlckJ5cyA9IHt9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGRzIE9SREVSIEJZIGNvbmRpdGlvbiBpbiB0aGUgcXVlcnkgYnVpbGRlci5cbiAgICAgKi9cbiAgICBhZGRPcmRlckJ5KFxuICAgICAgICBzb3J0OiBzdHJpbmcsXG4gICAgICAgIG9yZGVyOiBcIkFTQ1wiIHwgXCJERVNDXCIgPSBcIkFTQ1wiLFxuICAgICAgICBudWxscz86IFwiTlVMTFMgRklSU1RcIiB8IFwiTlVMTFMgTEFTVFwiLFxuICAgICk6IHRoaXMge1xuICAgICAgICBpZiAob3JkZXIgIT09IHVuZGVmaW5lZCAmJiBvcmRlciAhPT0gXCJBU0NcIiAmJiBvcmRlciAhPT0gXCJERVNDXCIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFxuICAgICAgICAgICAgICAgIGBTZWxlY3RRdWVyeUJ1aWxkZXIuYWRkT3JkZXJCeSBcIm9yZGVyXCIgY2FuIGFjY2VwdCBvbmx5IFwiQVNDXCIgYW5kIFwiREVTQ1wiIHZhbHVlcy5gLFxuICAgICAgICAgICAgKVxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBudWxscyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICBudWxscyAhPT0gXCJOVUxMUyBGSVJTVFwiICYmXG4gICAgICAgICAgICBudWxscyAhPT0gXCJOVUxMUyBMQVNUXCJcbiAgICAgICAgKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcbiAgICAgICAgICAgICAgICBgU2VsZWN0UXVlcnlCdWlsZGVyLmFkZE9yZGVyQnkgXCJudWxsc1wiIGNhbiBhY2NlcHQgb25seSBcIk5VTExTIEZJUlNUXCIgYW5kIFwiTlVMTFMgTEFTVFwiIHZhbHVlcy5gLFxuICAgICAgICAgICAgKVxuXG4gICAgICAgIGlmIChudWxscykge1xuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLm9yZGVyQnlzW3NvcnRdID0geyBvcmRlciwgbnVsbHMgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLm9yZGVyQnlzW3NvcnRdID0gb3JkZXJcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCdzIExJTUlUIC0gbWF4aW11bSBudW1iZXIgb2Ygcm93cyB0byBiZSBzZWxlY3RlZC5cbiAgICAgKiBOT1RFIHRoYXQgaXQgbWF5IG5vdCB3b3JrIGFzIHlvdSBleHBlY3QgaWYgeW91IGFyZSB1c2luZyBqb2lucy5cbiAgICAgKiBJZiB5b3Ugd2FudCB0byBpbXBsZW1lbnQgcGFnaW5hdGlvbiwgYW5kIHlvdSBhcmUgaGF2aW5nIGpvaW4gaW4geW91ciBxdWVyeSxcbiAgICAgKiB0aGVuIHVzZSBpbnN0ZWFkIHRha2UgbWV0aG9kIGluc3RlYWQuXG4gICAgICovXG4gICAgbGltaXQobGltaXQ/OiBudW1iZXIpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmxpbWl0ID0gdGhpcy5ub3JtYWxpemVOdW1iZXIobGltaXQpXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5saW1pdCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICBpc05hTih0aGlzLmV4cHJlc3Npb25NYXAubGltaXQpXG4gICAgICAgIClcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXG4gICAgICAgICAgICAgICAgYFByb3ZpZGVkIFwibGltaXRcIiB2YWx1ZSBpcyBub3QgYSBudW1iZXIuIFBsZWFzZSBwcm92aWRlIGEgbnVtZXJpYyB2YWx1ZS5gLFxuICAgICAgICAgICAgKVxuXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0J3MgT0ZGU0VUIC0gc2VsZWN0aW9uIG9mZnNldC5cbiAgICAgKiBOT1RFIHRoYXQgaXQgbWF5IG5vdCB3b3JrIGFzIHlvdSBleHBlY3QgaWYgeW91IGFyZSB1c2luZyBqb2lucy5cbiAgICAgKiBJZiB5b3Ugd2FudCB0byBpbXBsZW1lbnQgcGFnaW5hdGlvbiwgYW5kIHlvdSBhcmUgaGF2aW5nIGpvaW4gaW4geW91ciBxdWVyeSxcbiAgICAgKiB0aGVuIHVzZSBpbnN0ZWFkIHNraXAgbWV0aG9kIGluc3RlYWQuXG4gICAgICovXG4gICAgb2Zmc2V0KG9mZnNldD86IG51bWJlcik6IHRoaXMge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAub2Zmc2V0ID0gdGhpcy5ub3JtYWxpemVOdW1iZXIob2Zmc2V0KVxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAub2Zmc2V0ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgIGlzTmFOKHRoaXMuZXhwcmVzc2lvbk1hcC5vZmZzZXQpXG4gICAgICAgIClcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXG4gICAgICAgICAgICAgICAgYFByb3ZpZGVkIFwib2Zmc2V0XCIgdmFsdWUgaXMgbm90IGEgbnVtYmVyLiBQbGVhc2UgcHJvdmlkZSBhIG51bWVyaWMgdmFsdWUuYCxcbiAgICAgICAgICAgIClcblxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgbWF4aW1hbCBudW1iZXIgb2YgZW50aXRpZXMgdG8gdGFrZS5cbiAgICAgKi9cbiAgICB0YWtlKHRha2U/OiBudW1iZXIpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLnRha2UgPSB0aGlzLm5vcm1hbGl6ZU51bWJlcih0YWtlKVxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAudGFrZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICBpc05hTih0aGlzLmV4cHJlc3Npb25NYXAudGFrZSlcbiAgICAgICAgKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcbiAgICAgICAgICAgICAgICBgUHJvdmlkZWQgXCJ0YWtlXCIgdmFsdWUgaXMgbm90IGEgbnVtYmVyLiBQbGVhc2UgcHJvdmlkZSBhIG51bWVyaWMgdmFsdWUuYCxcbiAgICAgICAgICAgIClcblxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgbnVtYmVyIG9mIGVudGl0aWVzIHRvIHNraXAuXG4gICAgICovXG4gICAgc2tpcChza2lwPzogbnVtYmVyKTogdGhpcyB7XG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5za2lwID0gdGhpcy5ub3JtYWxpemVOdW1iZXIoc2tpcClcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLnNraXAgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgaXNOYU4odGhpcy5leHByZXNzaW9uTWFwLnNraXApXG4gICAgICAgIClcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXG4gICAgICAgICAgICAgICAgYFByb3ZpZGVkIFwic2tpcFwiIHZhbHVlIGlzIG5vdCBhIG51bWJlci4gUGxlYXNlIHByb3ZpZGUgYSBudW1lcmljIHZhbHVlLmAsXG4gICAgICAgICAgICApXG5cbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgY2VydGFpbiBpbmRleCB0byBiZSB1c2VkIGJ5IHRoZSBxdWVyeS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpbmRleCBOYW1lIG9mIGluZGV4IHRvIGJlIHVzZWQuXG4gICAgICovXG4gICAgdXNlSW5kZXgoaW5kZXg6IHN0cmluZyk6IHRoaXMge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAudXNlSW5kZXggPSBpbmRleFxuXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBsb2NraW5nIG1vZGUuXG4gICAgICovXG4gICAgc2V0TG9jayhsb2NrTW9kZTogXCJvcHRpbWlzdGljXCIsIGxvY2tWZXJzaW9uOiBudW1iZXIgfCBEYXRlKTogdGhpc1xuXG4gICAgLyoqXG4gICAgICogU2V0cyBsb2NraW5nIG1vZGUuXG4gICAgICovXG4gICAgc2V0TG9jayhcbiAgICAgICAgbG9ja01vZGU6XG4gICAgICAgICAgICB8IFwicGVzc2ltaXN0aWNfcmVhZFwiXG4gICAgICAgICAgICB8IFwicGVzc2ltaXN0aWNfd3JpdGVcIlxuICAgICAgICAgICAgfCBcImRpcnR5X3JlYWRcIlxuICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAgICBcInBlc3NpbWlzdGljX3BhcnRpYWxfd3JpdGVcIiBhbmQgXCJwZXNzaW1pc3RpY193cml0ZV9vcl9mYWlsXCIgYXJlIGRlcHJlY2F0ZWQgYW5kXG4gICAgICAgICAgICAgICAgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHZlcnNpb24uXG5cbiAgICAgICAgICAgICAgICBVc2Ugc2V0T25Mb2NrZWQgaW5zdGVhZC5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgfCBcInBlc3NpbWlzdGljX3BhcnRpYWxfd3JpdGVcIlxuICAgICAgICAgICAgfCBcInBlc3NpbWlzdGljX3dyaXRlX29yX2ZhaWxcIlxuICAgICAgICAgICAgfCBcImZvcl9ub19rZXlfdXBkYXRlXCJcbiAgICAgICAgICAgIHwgXCJmb3Jfa2V5X3NoYXJlXCIsXG4gICAgICAgIGxvY2tWZXJzaW9uPzogdW5kZWZpbmVkLFxuICAgICAgICBsb2NrVGFibGVzPzogc3RyaW5nW10sXG4gICAgKTogdGhpc1xuXG4gICAgLyoqXG4gICAgICogU2V0cyBsb2NraW5nIG1vZGUuXG4gICAgICovXG4gICAgc2V0TG9jayhcbiAgICAgICAgbG9ja01vZGU6XG4gICAgICAgICAgICB8IFwib3B0aW1pc3RpY1wiXG4gICAgICAgICAgICB8IFwicGVzc2ltaXN0aWNfcmVhZFwiXG4gICAgICAgICAgICB8IFwicGVzc2ltaXN0aWNfd3JpdGVcIlxuICAgICAgICAgICAgfCBcImRpcnR5X3JlYWRcIlxuICAgICAgICAgICAgLypcbiAgICAgICAgICAgICAgICBcInBlc3NpbWlzdGljX3BhcnRpYWxfd3JpdGVcIiBhbmQgXCJwZXNzaW1pc3RpY193cml0ZV9vcl9mYWlsXCIgYXJlIGRlcHJlY2F0ZWQgYW5kXG4gICAgICAgICAgICAgICAgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHZlcnNpb24uXG5cbiAgICAgICAgICAgICAgICBVc2Ugc2V0T25Mb2NrZWQgaW5zdGVhZC5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgfCBcInBlc3NpbWlzdGljX3BhcnRpYWxfd3JpdGVcIlxuICAgICAgICAgICAgfCBcInBlc3NpbWlzdGljX3dyaXRlX29yX2ZhaWxcIlxuICAgICAgICAgICAgfCBcImZvcl9ub19rZXlfdXBkYXRlXCJcbiAgICAgICAgICAgIHwgXCJmb3Jfa2V5X3NoYXJlXCIsXG4gICAgICAgIGxvY2tWZXJzaW9uPzogbnVtYmVyIHwgRGF0ZSxcbiAgICAgICAgbG9ja1RhYmxlcz86IHN0cmluZ1tdLFxuICAgICk6IHRoaXMge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAubG9ja01vZGUgPSBsb2NrTW9kZVxuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAubG9ja1ZlcnNpb24gPSBsb2NrVmVyc2lvblxuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAubG9ja1RhYmxlcyA9IGxvY2tUYWJsZXNcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIGxvY2sgaGFuZGxpbmcgYnkgYWRkaW5nIE5PIFdBSVQgb3IgU0tJUCBMT0NLRUQuXG4gICAgICovXG4gICAgc2V0T25Mb2NrZWQob25Mb2NrZWQ6IFwibm93YWl0XCIgfCBcInNraXBfbG9ja2VkXCIpOiB0aGlzIHtcbiAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLm9uTG9ja2VkID0gb25Mb2NrZWRcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNhYmxlcyB0aGUgZ2xvYmFsIGNvbmRpdGlvbiBvZiBcIm5vbi1kZWxldGVkXCIgZm9yIHRoZSBlbnRpdHkgd2l0aCBkZWxldGUgZGF0ZSBjb2x1bW5zLlxuICAgICAqL1xuICAgIHdpdGhEZWxldGVkKCk6IHRoaXMge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAud2l0aERlbGV0ZWQgPSB0cnVlXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBmaXJzdCByYXcgcmVzdWx0IHJldHVybmVkIGJ5IGV4ZWN1dGlvbiBvZiBnZW5lcmF0ZWQgcXVlcnkgYnVpbGRlciBzcWwuXG4gICAgICovXG4gICAgYXN5bmMgZ2V0UmF3T25lPFQgPSBhbnk+KCk6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICAgICAgICByZXR1cm4gKGF3YWl0IHRoaXMuZ2V0UmF3TWFueSgpKVswXVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYWxsIHJhdyByZXN1bHRzIHJldHVybmVkIGJ5IGV4ZWN1dGlvbiBvZiBnZW5lcmF0ZWQgcXVlcnkgYnVpbGRlciBzcWwuXG4gICAgICovXG4gICAgYXN5bmMgZ2V0UmF3TWFueTxUID0gYW55PigpOiBQcm9taXNlPFRbXT4ge1xuICAgICAgICBpZiAodGhpcy5leHByZXNzaW9uTWFwLmxvY2tNb2RlID09PSBcIm9wdGltaXN0aWNcIilcbiAgICAgICAgICAgIHRocm93IG5ldyBPcHRpbWlzdGljTG9ja0Nhbk5vdEJlVXNlZEVycm9yKClcblxuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAucXVlcnlFbnRpdHkgPSBmYWxzZVxuICAgICAgICBjb25zdCBxdWVyeVJ1bm5lciA9IHRoaXMub2J0YWluUXVlcnlSdW5uZXIoKVxuICAgICAgICBsZXQgdHJhbnNhY3Rpb25TdGFydGVkQnlVczogYm9vbGVhbiA9IGZhbHNlXG4gICAgICAgIHRyeSB7XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAudXNlVHJhbnNhY3Rpb24gPT09IHRydWUgJiZcbiAgICAgICAgICAgICAgICBxdWVyeVJ1bm5lci5pc1RyYW5zYWN0aW9uQWN0aXZlID09PSBmYWxzZVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgcXVlcnlSdW5uZXIuc3RhcnRUcmFuc2FjdGlvbigpXG4gICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25TdGFydGVkQnlVcyA9IHRydWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMubG9hZFJhd1Jlc3VsdHMocXVlcnlSdW5uZXIpXG5cblxuICAgICAgICAgICAgaWYgKHRyYW5zYWN0aW9uU3RhcnRlZEJ5VXMpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBxdWVyeVJ1bm5lci5jb21taXRUcmFuc2FjdGlvbigpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiByZXN1bHRzXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG5cbiAgICAgICAgICAgIGlmICh0cmFuc2FjdGlvblN0YXJ0ZWRCeVVzKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgcXVlcnlSdW5uZXIucm9sbGJhY2tUcmFuc2FjdGlvbigpXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAocm9sbGJhY2tFcnJvcikge31cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yXG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBpZiAocXVlcnlSdW5uZXIgIT09IHRoaXMucXVlcnlSdW5uZXIpIHtcblxuICAgICAgICAgICAgICAgIGF3YWl0IHF1ZXJ5UnVubmVyLnJlbGVhc2UoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgc3FsIGdlbmVyYXRlZCBieSBxdWVyeSBidWlsZGVyIGFuZCByZXR1cm5zIG9iamVjdCB3aXRoIHJhdyByZXN1bHRzIGFuZCBlbnRpdGllcyBjcmVhdGVkIGZyb20gdGhlbS5cbiAgICAgKi9cbiAgICBhc3luYyBnZXRSYXdBbmRFbnRpdGllczxUID0gYW55PigpOiBQcm9taXNlPHtcbiAgICAgICAgZW50aXRpZXM6IEVudGl0eVtdXG4gICAgICAgIHJhdzogVFtdXG4gICAgfT4ge1xuICAgICAgICBjb25zdCBxdWVyeVJ1bm5lciA9IHRoaXMub2J0YWluUXVlcnlSdW5uZXIoKVxuICAgICAgICBsZXQgdHJhbnNhY3Rpb25TdGFydGVkQnlVczogYm9vbGVhbiA9IGZhbHNlXG4gICAgICAgIHRyeSB7XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAudXNlVHJhbnNhY3Rpb24gPT09IHRydWUgJiZcbiAgICAgICAgICAgICAgICBxdWVyeVJ1bm5lci5pc1RyYW5zYWN0aW9uQWN0aXZlID09PSBmYWxzZVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgcXVlcnlSdW5uZXIuc3RhcnRUcmFuc2FjdGlvbigpXG4gICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25TdGFydGVkQnlVcyA9IHRydWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLnF1ZXJ5RW50aXR5ID0gdHJ1ZVxuICAgICAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMuZXhlY3V0ZUVudGl0aWVzQW5kUmF3UmVzdWx0cyhxdWVyeVJ1bm5lcilcblxuXG4gICAgICAgICAgICBpZiAodHJhbnNhY3Rpb25TdGFydGVkQnlVcykge1xuICAgICAgICAgICAgICAgIGF3YWl0IHF1ZXJ5UnVubmVyLmNvbW1pdFRyYW5zYWN0aW9uKClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHNcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcblxuICAgICAgICAgICAgaWYgKHRyYW5zYWN0aW9uU3RhcnRlZEJ5VXMpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBxdWVyeVJ1bm5lci5yb2xsYmFja1RyYW5zYWN0aW9uKClcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChyb2xsYmFja0Vycm9yKSB7fVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGlmIChxdWVyeVJ1bm5lciAhPT0gdGhpcy5xdWVyeVJ1bm5lcilcblxuICAgICAgICAgICAgICAgIGF3YWl0IHF1ZXJ5UnVubmVyLnJlbGVhc2UoKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyBzaW5nbGUgZW50aXR5IHJldHVybmVkIGJ5IGV4ZWN1dGlvbiBvZiBnZW5lcmF0ZWQgcXVlcnkgYnVpbGRlciBzcWwuXG4gICAgICovXG4gICAgYXN5bmMgZ2V0T25lKCk6IFByb21pc2U8RW50aXR5IHwgbnVsbD4ge1xuICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgdGhpcy5nZXRSYXdBbmRFbnRpdGllcygpXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc3VsdHMuZW50aXRpZXNbMF0gYXMgYW55XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgcmVzdWx0ICYmXG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAubG9ja01vZGUgPT09IFwib3B0aW1pc3RpY1wiICYmXG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAubG9ja1ZlcnNpb25cbiAgICAgICAgKSB7XG4gICAgICAgICAgICBjb25zdCBtZXRhZGF0YSA9IHRoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMhLm1ldGFkYXRhXG5cbiAgICAgICAgICAgIGlmICh0aGlzLmV4cHJlc3Npb25NYXAubG9ja1ZlcnNpb24gaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYWN0dWFsVmVyc2lvbiA9XG4gICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLnVwZGF0ZURhdGVDb2x1bW4hLmdldEVudGl0eVZhbHVlKHJlc3VsdCkgLy8gd2hhdCBpZiBjb2x1bW5zIGFyZW50IHNldD9cbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGFjdHVhbFZlcnNpb24uZ2V0VGltZSgpICE9PVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAubG9ja1ZlcnNpb24uZ2V0VGltZSgpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3B0aW1pc3RpY0xvY2tWZXJzaW9uTWlzbWF0Y2hFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAubG9ja1ZlcnNpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxWZXJzaW9uLFxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFjdHVhbFZlcnNpb24gPVxuICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YS52ZXJzaW9uQ29sdW1uIS5nZXRFbnRpdHlWYWx1ZShyZXN1bHQpIC8vIHdoYXQgaWYgY29sdW1ucyBhcmVudCBzZXQ/XG4gICAgICAgICAgICAgICAgaWYgKGFjdHVhbFZlcnNpb24gIT09IHRoaXMuZXhwcmVzc2lvbk1hcC5sb2NrVmVyc2lvbilcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wdGltaXN0aWNMb2NrVmVyc2lvbk1pc21hdGNoRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YS5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmxvY2tWZXJzaW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsVmVyc2lvbixcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHRcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBmaXJzdCBlbnRpdHkgcmV0dXJuZWQgYnkgZXhlY3V0aW9uIG9mIGdlbmVyYXRlZCBxdWVyeSBidWlsZGVyIHNxbCBvciByZWplY3RzIHRoZSByZXR1cm5lZCBwcm9taXNlIG9uIGVycm9yLlxuICAgICAqL1xuICAgIGFzeW5jIGdldE9uZU9yRmFpbCgpOiBQcm9taXNlPEVudGl0eT4ge1xuICAgICAgICBjb25zdCBlbnRpdHkgPSBhd2FpdCB0aGlzLmdldE9uZSgpXG5cbiAgICAgICAgaWYgKCFlbnRpdHkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFbnRpdHlOb3RGb3VuZEVycm9yKFxuICAgICAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMhLnRhcmdldCxcbiAgICAgICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVudGl0eVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgZW50aXRpZXMgcmV0dXJuZWQgYnkgZXhlY3V0aW9uIG9mIGdlbmVyYXRlZCBxdWVyeSBidWlsZGVyIHNxbC5cbiAgICAgKi9cbiAgICBhc3luYyBnZXRNYW55KCk6IFByb21pc2U8RW50aXR5W10+IHtcbiAgICAgICAgaWYgKHRoaXMuZXhwcmVzc2lvbk1hcC5sb2NrTW9kZSA9PT0gXCJvcHRpbWlzdGljXCIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3B0aW1pc3RpY0xvY2tDYW5Ob3RCZVVzZWRFcnJvcigpXG5cbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMuZ2V0UmF3QW5kRW50aXRpZXMoKVxuICAgICAgICByZXR1cm4gcmVzdWx0cy5lbnRpdGllc1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgY291bnQgLSBudW1iZXIgb2YgZW50aXRpZXMgc2VsZWN0ZWQgYnkgc3FsIGdlbmVyYXRlZCBieSB0aGlzIHF1ZXJ5IGJ1aWxkZXIuXG4gICAgICogQ291bnQgZXhjbHVkZXMgYWxsIGxpbWl0YXRpb25zIHNldCBieSBzZXRGaXJzdFJlc3VsdCBhbmQgc2V0TWF4UmVzdWx0cyBtZXRob2RzIGNhbGwuXG4gICAgICovXG4gICAgYXN5bmMgZ2V0Q291bnQoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICAgICAgaWYgKHRoaXMuZXhwcmVzc2lvbk1hcC5sb2NrTW9kZSA9PT0gXCJvcHRpbWlzdGljXCIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3B0aW1pc3RpY0xvY2tDYW5Ob3RCZVVzZWRFcnJvcigpXG5cbiAgICAgICAgY29uc3QgcXVlcnlSdW5uZXIgPSB0aGlzLm9idGFpblF1ZXJ5UnVubmVyKClcbiAgICAgICAgbGV0IHRyYW5zYWN0aW9uU3RhcnRlZEJ5VXM6IGJvb2xlYW4gPSBmYWxzZVxuICAgICAgICB0cnkge1xuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLnVzZVRyYW5zYWN0aW9uID09PSB0cnVlICYmXG4gICAgICAgICAgICAgICAgcXVlcnlSdW5uZXIuaXNUcmFuc2FjdGlvbkFjdGl2ZSA9PT0gZmFsc2VcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHF1ZXJ5UnVubmVyLnN0YXJ0VHJhbnNhY3Rpb24oKVxuICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uU3RhcnRlZEJ5VXMgPSB0cnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5xdWVyeUVudGl0eSA9IGZhbHNlXG4gICAgICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgdGhpcy5leGVjdXRlQ291bnRRdWVyeShxdWVyeVJ1bm5lcilcblxuXG4gICAgICAgICAgICBpZiAodHJhbnNhY3Rpb25TdGFydGVkQnlVcykge1xuICAgICAgICAgICAgICAgIGF3YWl0IHF1ZXJ5UnVubmVyLmNvbW1pdFRyYW5zYWN0aW9uKClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHNcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcblxuICAgICAgICAgICAgaWYgKHRyYW5zYWN0aW9uU3RhcnRlZEJ5VXMpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBxdWVyeVJ1bm5lci5yb2xsYmFja1RyYW5zYWN0aW9uKClcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChyb2xsYmFja0Vycm9yKSB7fVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGlmIChxdWVyeVJ1bm5lciAhPT0gdGhpcy5xdWVyeVJ1bm5lcilcblxuICAgICAgICAgICAgICAgIGF3YWl0IHF1ZXJ5UnVubmVyLnJlbGVhc2UoKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhlY3V0ZXMgYnVpbHQgU1FMIHF1ZXJ5IGFuZCByZXR1cm5zIGVudGl0aWVzIGFuZCBvdmVyYWxsIGVudGl0aWVzIGNvdW50ICh3aXRob3V0IGxpbWl0YXRpb24pLlxuICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWZ1bCB0byBidWlsZCBwYWdpbmF0aW9uLlxuICAgICAqL1xuICAgIGFzeW5jIGdldE1hbnlBbmRDb3VudCgpOiBQcm9taXNlPFtFbnRpdHlbXSwgbnVtYmVyXT4ge1xuICAgICAgICBpZiAodGhpcy5leHByZXNzaW9uTWFwLmxvY2tNb2RlID09PSBcIm9wdGltaXN0aWNcIilcbiAgICAgICAgICAgIHRocm93IG5ldyBPcHRpbWlzdGljTG9ja0Nhbk5vdEJlVXNlZEVycm9yKClcblxuICAgICAgICBjb25zdCBxdWVyeVJ1bm5lciA9IHRoaXMub2J0YWluUXVlcnlSdW5uZXIoKVxuICAgICAgICBsZXQgdHJhbnNhY3Rpb25TdGFydGVkQnlVczogYm9vbGVhbiA9IGZhbHNlXG4gICAgICAgIHRyeSB7XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAudXNlVHJhbnNhY3Rpb24gPT09IHRydWUgJiZcbiAgICAgICAgICAgICAgICBxdWVyeVJ1bm5lci5pc1RyYW5zYWN0aW9uQWN0aXZlID09PSBmYWxzZVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgcXVlcnlSdW5uZXIuc3RhcnRUcmFuc2FjdGlvbigpXG4gICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25TdGFydGVkQnlVcyA9IHRydWVcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLnF1ZXJ5RW50aXR5ID0gdHJ1ZVxuICAgICAgICAgICAgY29uc3QgZW50aXRpZXNBbmRSYXcgPSBhd2FpdCB0aGlzLmV4ZWN1dGVFbnRpdGllc0FuZFJhd1Jlc3VsdHMoXG4gICAgICAgICAgICAgICAgcXVlcnlSdW5uZXIsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAucXVlcnlFbnRpdHkgPSBmYWxzZVxuICAgICAgICAgICAgY29uc3QgY2FjaGVJZCA9IHRoaXMuZXhwcmVzc2lvbk1hcC5jYWNoZUlkXG5cblxuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmNhY2hlSWQgPSBjYWNoZUlkID8gYCR7Y2FjaGVJZH0tY291bnRgIDogY2FjaGVJZFxuICAgICAgICAgICAgY29uc3QgY291bnQgPSBhd2FpdCB0aGlzLmV4ZWN1dGVDb3VudFF1ZXJ5KHF1ZXJ5UnVubmVyKVxuICAgICAgICAgICAgY29uc3QgcmVzdWx0czogW0VudGl0eVtdLCBudW1iZXJdID0gW2VudGl0aWVzQW5kUmF3LmVudGl0aWVzLCBjb3VudF1cblxuXG4gICAgICAgICAgICBpZiAodHJhbnNhY3Rpb25TdGFydGVkQnlVcykge1xuICAgICAgICAgICAgICAgIGF3YWl0IHF1ZXJ5UnVubmVyLmNvbW1pdFRyYW5zYWN0aW9uKClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHNcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcblxuICAgICAgICAgICAgaWYgKHRyYW5zYWN0aW9uU3RhcnRlZEJ5VXMpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBxdWVyeVJ1bm5lci5yb2xsYmFja1RyYW5zYWN0aW9uKClcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChyb2xsYmFja0Vycm9yKSB7fVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3JcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGlmIChxdWVyeVJ1bm5lciAhPT0gdGhpcy5xdWVyeVJ1bm5lcilcblxuICAgICAgICAgICAgICAgIGF3YWl0IHF1ZXJ5UnVubmVyLnJlbGVhc2UoKVxuICAgICAgICB9XG4gICAgfVxuXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4gIFxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyBvciBkaXNhYmxlcyBxdWVyeSByZXN1bHQgY2FjaGluZy5cbiAgICAgKi9cbiAgICBjYWNoZShlbmFibGVkOiBib29sZWFuKTogdGhpc1xuXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyBxdWVyeSByZXN1bHQgY2FjaGluZyBhbmQgc2V0cyBpbiBtaWxsaXNlY29uZHMgaW4gd2hpY2ggY2FjaGUgd2lsbCBleHBpcmUuXG4gICAgICogSWYgbm90IHNldCB0aGVuIGdsb2JhbCBjYWNoaW5nIHRpbWUgd2lsbCBiZSB1c2VkLlxuICAgICAqL1xuICAgIGNhY2hlKG1pbGxpc2Vjb25kczogbnVtYmVyKTogdGhpc1xuXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyBxdWVyeSByZXN1bHQgY2FjaGluZyBhbmQgc2V0cyBjYWNoZSBpZCBhbmQgbWlsbGlzZWNvbmRzIGluIHdoaWNoIGNhY2hlIHdpbGwgZXhwaXJlLlxuICAgICAqL1xuICAgIGNhY2hlKGlkOiBhbnksIG1pbGxpc2Vjb25kcz86IG51bWJlcik6IHRoaXNcblxuICAgIC8qKlxuICAgICAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgcXVlcnkgcmVzdWx0IGNhY2hpbmcuXG4gICAgICovXG4gICAgY2FjaGUoXG4gICAgICAgIGVuYWJsZWRPck1pbGxpc2Vjb25kc09ySWQ6IGJvb2xlYW4gfCBudW1iZXIgfCBzdHJpbmcsXG4gICAgICAgIG1heWJlTWlsbGlzZWNvbmRzPzogbnVtYmVyLFxuICAgICk6IHRoaXMge1xuICAgICAgICBpZiAodHlwZW9mIGVuYWJsZWRPck1pbGxpc2Vjb25kc09ySWQgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAuY2FjaGUgPSBlbmFibGVkT3JNaWxsaXNlY29uZHNPcklkXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGVuYWJsZWRPck1pbGxpc2Vjb25kc09ySWQgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5jYWNoZSA9IHRydWVcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5jYWNoZUR1cmF0aW9uID0gZW5hYmxlZE9yTWlsbGlzZWNvbmRzT3JJZFxuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgdHlwZW9mIGVuYWJsZWRPck1pbGxpc2Vjb25kc09ySWQgPT09IFwic3RyaW5nXCIgfHxcbiAgICAgICAgICAgIHR5cGVvZiBlbmFibGVkT3JNaWxsaXNlY29uZHNPcklkID09PSBcIm51bWJlclwiXG4gICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmNhY2hlID0gdHJ1ZVxuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmNhY2hlSWQgPSBlbmFibGVkT3JNaWxsaXNlY29uZHNPcklkXG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWF5YmVNaWxsaXNlY29uZHMpIHtcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5jYWNoZUR1cmF0aW9uID0gbWF5YmVNaWxsaXNlY29uZHNcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBleHRyYSBvcHRpb25zIHRoYXQgY2FuIGJlIHVzZWQgdG8gY29uZmlndXJlIGhvdyBxdWVyeSBidWlsZGVyIHdvcmtzLlxuICAgICAqL1xuICAgIHNldE9wdGlvbihvcHRpb246IFNlbGVjdFF1ZXJ5QnVpbGRlck9wdGlvbik6IHRoaXMge1xuICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAub3B0aW9ucy5wdXNoKG9wdGlvbilcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cblxuXG5cblxuICAgIHByb3RlY3RlZCBqb2luKFxuICAgICAgICBkaXJlY3Rpb246IFwiSU5ORVJcIiB8IFwiTEVGVFwiLFxuICAgICAgICBlbnRpdHlPclByb3BlcnR5OlxuICAgICAgICAgICAgfCBGdW5jdGlvblxuICAgICAgICAgICAgfCBzdHJpbmdcbiAgICAgICAgICAgIHwgKChxYjogU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4pID0+IFNlbGVjdFF1ZXJ5QnVpbGRlcjxhbnk+KSxcbiAgICAgICAgYWxpYXNOYW1lOiBzdHJpbmcsXG4gICAgICAgIGNvbmRpdGlvbj86IHN0cmluZyxcbiAgICAgICAgcGFyYW1ldGVycz86IE9iamVjdExpdGVyYWwsXG4gICAgICAgIG1hcFRvUHJvcGVydHk/OiBzdHJpbmcsXG4gICAgICAgIGlzTWFwcGluZ01hbnk/OiBib29sZWFuLFxuICAgICk6IHZvaWQge1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcnMocGFyYW1ldGVycyB8fCB7fSlcblxuICAgICAgICBjb25zdCBqb2luQXR0cmlidXRlID0gbmV3IEpvaW5BdHRyaWJ1dGUoXG4gICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24sXG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAsXG4gICAgICAgIClcbiAgICAgICAgam9pbkF0dHJpYnV0ZS5kaXJlY3Rpb24gPSBkaXJlY3Rpb25cbiAgICAgICAgam9pbkF0dHJpYnV0ZS5tYXBUb1Byb3BlcnR5ID0gbWFwVG9Qcm9wZXJ0eVxuICAgICAgICBqb2luQXR0cmlidXRlLmlzTWFwcGluZ01hbnkgPSBpc01hcHBpbmdNYW55XG4gICAgICAgIGpvaW5BdHRyaWJ1dGUuZW50aXR5T3JQcm9wZXJ0eSA9IGVudGl0eU9yUHJvcGVydHkgLy8gcmVsYXRpb25OYW1lXG4gICAgICAgIGpvaW5BdHRyaWJ1dGUuY29uZGl0aW9uID0gY29uZGl0aW9uID8gY29uZGl0aW9uIDogdW5kZWZpbmVkIC8vIGpvaW5JbnZlcnNlU2lkZUNvbmRpdGlvblxuXG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5qb2luQXR0cmlidXRlcy5wdXNoKGpvaW5BdHRyaWJ1dGUpXG5cbiAgICAgICAgaWYgKGpvaW5BdHRyaWJ1dGUubWV0YWRhdGEpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBqb2luQXR0cmlidXRlLm1ldGFkYXRhLmRlbGV0ZURhdGVDb2x1bW4gJiZcbiAgICAgICAgICAgICAgICAhdGhpcy5leHByZXNzaW9uTWFwLndpdGhEZWxldGVkXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb25kaXRpb25EZWxldGVDb2x1bW4gPSBgJHthbGlhc05hbWV9LiR7am9pbkF0dHJpYnV0ZS5tZXRhZGF0YS5kZWxldGVEYXRlQ29sdW1uLnByb3BlcnR5TmFtZX0gSVMgTlVMTGBcbiAgICAgICAgICAgICAgICBqb2luQXR0cmlidXRlLmNvbmRpdGlvbiA9IGpvaW5BdHRyaWJ1dGUuY29uZGl0aW9uXG4gICAgICAgICAgICAgICAgICAgID8gYCAke2pvaW5BdHRyaWJ1dGUuY29uZGl0aW9ufSBBTkQgJHtjb25kaXRpb25EZWxldGVDb2x1bW59YFxuICAgICAgICAgICAgICAgICAgICA6IGAke2NvbmRpdGlvbkRlbGV0ZUNvbHVtbn1gXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGpvaW5BdHRyaWJ1dGUuYWxpYXMgPSB0aGlzLmV4cHJlc3Npb25NYXAuY3JlYXRlQWxpYXMoe1xuICAgICAgICAgICAgICAgIHR5cGU6IFwiam9pblwiLFxuICAgICAgICAgICAgICAgIG5hbWU6IGFsaWFzTmFtZSxcbiAgICAgICAgICAgICAgICBtZXRhZGF0YTogam9pbkF0dHJpYnV0ZS5tZXRhZGF0YSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgam9pbkF0dHJpYnV0ZS5yZWxhdGlvbiAmJlxuICAgICAgICAgICAgICAgIGpvaW5BdHRyaWJ1dGUucmVsYXRpb24uanVuY3Rpb25FbnRpdHlNZXRhZGF0YVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmNyZWF0ZUFsaWFzKHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJqb2luXCIsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IGpvaW5BdHRyaWJ1dGUuanVuY3Rpb25BbGlhcyxcbiAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGE6IGpvaW5BdHRyaWJ1dGUucmVsYXRpb24uanVuY3Rpb25FbnRpdHlNZXRhZGF0YSxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IHN1YlF1ZXJ5OiBzdHJpbmcgPSBcIlwiXG4gICAgICAgICAgICBpZiAodHlwZW9mIGVudGl0eU9yUHJvcGVydHkgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN1YlF1ZXJ5QnVpbGRlcjogU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4gPSAoXG4gICAgICAgICAgICAgICAgICAgIGVudGl0eU9yUHJvcGVydHkgYXMgYW55XG4gICAgICAgICAgICAgICAgKSgodGhpcyBhcyBhbnkgYXMgU2VsZWN0UXVlcnlCdWlsZGVyPGFueT4pLnN1YlF1ZXJ5KCkpXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRQYXJhbWV0ZXJzKHN1YlF1ZXJ5QnVpbGRlci5nZXRQYXJhbWV0ZXJzKCkpXG4gICAgICAgICAgICAgICAgc3ViUXVlcnkgPSBzdWJRdWVyeUJ1aWxkZXIuZ2V0UXVlcnkoKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzdWJRdWVyeSA9IGVudGl0eU9yUHJvcGVydHlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGlzU3ViUXVlcnkgPVxuICAgICAgICAgICAgICAgIHR5cGVvZiBlbnRpdHlPclByb3BlcnR5ID09PSBcImZ1bmN0aW9uXCIgfHxcbiAgICAgICAgICAgICAgICAoZW50aXR5T3JQcm9wZXJ0eS5zdWJzdHIoMCwgMSkgPT09IFwiKFwiICYmXG4gICAgICAgICAgICAgICAgICAgIGVudGl0eU9yUHJvcGVydHkuc3Vic3RyKC0xKSA9PT0gXCIpXCIpXG4gICAgICAgICAgICBqb2luQXR0cmlidXRlLmFsaWFzID0gdGhpcy5leHByZXNzaW9uTWFwLmNyZWF0ZUFsaWFzKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcImpvaW5cIixcbiAgICAgICAgICAgICAgICBuYW1lOiBhbGlhc05hbWUsXG4gICAgICAgICAgICAgICAgdGFibGVQYXRoOlxuICAgICAgICAgICAgICAgICAgICBpc1N1YlF1ZXJ5ID09PSBmYWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgPyAoZW50aXR5T3JQcm9wZXJ0eSBhcyBzdHJpbmcpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBzdWJRdWVyeTogaXNTdWJRdWVyeSA9PT0gdHJ1ZSA/IHN1YlF1ZXJ5IDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgXCJTRUxFQ1QgRlJPTVwiIHBhcnQgb2YgU1FMIHF1ZXJ5LlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBjcmVhdGVTZWxlY3RFeHByZXNzaW9uKCkge1xuICAgICAgICBpZiAoIXRoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMpXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFxuICAgICAgICAgICAgICAgIFwiQ2Fubm90IGJ1aWxkIHF1ZXJ5IGJlY2F1c2UgbWFpbiBhbGlhcyBpcyBub3Qgc2V0IChjYWxsIHFiI2Zyb20gbWV0aG9kKVwiLFxuICAgICAgICAgICAgKVxuXG5cblxuICAgICAgICBjb25zdCBhbGxTZWxlY3RzOiBTZWxlY3RRdWVyeVtdID0gW11cbiAgICAgICAgY29uc3QgZXhjbHVkZWRTZWxlY3RzOiBTZWxlY3RRdWVyeVtdID0gW11cblxuICAgICAgICBpZiAodGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcy5oYXNNZXRhZGF0YSkge1xuICAgICAgICAgICAgY29uc3QgbWV0YWRhdGEgPSB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLm1ldGFkYXRhXG4gICAgICAgICAgICBhbGxTZWxlY3RzLnB1c2goXG4gICAgICAgICAgICAgICAgLi4udGhpcy5idWlsZEVzY2FwZWRFbnRpdHlDb2x1bW5TZWxlY3RzKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBleGNsdWRlZFNlbGVjdHMucHVzaChcbiAgICAgICAgICAgICAgICAuLi50aGlzLmZpbmRFbnRpdHlDb2x1bW5TZWxlY3RzKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICApXG4gICAgICAgIH1cblxuXG4gICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5qb2luQXR0cmlidXRlcy5mb3JFYWNoKChqb2luKSA9PiB7XG4gICAgICAgICAgICBpZiAoam9pbi5tZXRhZGF0YSkge1xuICAgICAgICAgICAgICAgIGFsbFNlbGVjdHMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgLi4udGhpcy5idWlsZEVzY2FwZWRFbnRpdHlDb2x1bW5TZWxlY3RzKFxuICAgICAgICAgICAgICAgICAgICAgICAgam9pbi5hbGlhcy5uYW1lISxcbiAgICAgICAgICAgICAgICAgICAgICAgIGpvaW4ubWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIGV4Y2x1ZGVkU2VsZWN0cy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAuLi50aGlzLmZpbmRFbnRpdHlDb2x1bW5TZWxlY3RzKFxuICAgICAgICAgICAgICAgICAgICAgICAgam9pbi5hbGlhcy5uYW1lISxcbiAgICAgICAgICAgICAgICAgICAgICAgIGpvaW4ubWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBoYXNNYWluQWxpYXMgPSB0aGlzLmV4cHJlc3Npb25NYXAuc2VsZWN0cy5zb21lKFxuICAgICAgICAgICAgICAgICAgICAoc2VsZWN0KSA9PiBzZWxlY3Quc2VsZWN0aW9uID09PSBqb2luLmFsaWFzLm5hbWUsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIGlmIChoYXNNYWluQWxpYXMpIHtcbiAgICAgICAgICAgICAgICAgICAgYWxsU2VsZWN0cy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogdGhpcy5lc2NhcGUoam9pbi5hbGlhcy5uYW1lISkgKyBcIi4qXCIsXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4Y2x1ZGVkU2VsZWN0ID0gdGhpcy5leHByZXNzaW9uTWFwLnNlbGVjdHMuZmluZChcbiAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3QpID0+IHNlbGVjdC5zZWxlY3Rpb24gPT09IGpvaW4uYWxpYXMubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICBleGNsdWRlZFNlbGVjdHMucHVzaChleGNsdWRlZFNlbGVjdCEpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuXG5cbiAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLnNlbGVjdHNcbiAgICAgICAgICAgIC5maWx0ZXIoKHNlbGVjdCkgPT4gZXhjbHVkZWRTZWxlY3RzLmluZGV4T2Yoc2VsZWN0KSA9PT0gLTEpXG4gICAgICAgICAgICAuZm9yRWFjaCgoc2VsZWN0KSA9PlxuICAgICAgICAgICAgICAgIGFsbFNlbGVjdHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogdGhpcy5yZXBsYWNlUHJvcGVydHlOYW1lcyhzZWxlY3Quc2VsZWN0aW9uKSxcbiAgICAgICAgICAgICAgICAgICAgYWxpYXNOYW1lOiBzZWxlY3QuYWxpYXNOYW1lLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgKVxuXG5cbiAgICAgICAgaWYgKGFsbFNlbGVjdHMubGVuZ3RoID09PSAwKSBhbGxTZWxlY3RzLnB1c2goeyBzZWxlY3Rpb246IFwiKlwiIH0pXG5cblxuICAgICAgICBsZXQgdXNlSW5kZXg6IHN0cmluZyA9IFwiXCJcbiAgICAgICAgaWYgKHRoaXMuZXhwcmVzc2lvbk1hcC51c2VJbmRleCkge1xuICAgICAgICAgICAgaWYgKERyaXZlclV0aWxzLmlzTXlTUUxGYW1pbHkodGhpcy5jb25uZWN0aW9uLmRyaXZlcikpIHtcbiAgICAgICAgICAgICAgICB1c2VJbmRleCA9IGAgVVNFIElOREVYICgke3RoaXMuZXhwcmVzc2lvbk1hcC51c2VJbmRleH0pYFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cblxuICAgICAgICBjb25zdCBmcm9tcyA9IHRoaXMuZXhwcmVzc2lvbk1hcC5hbGlhc2VzXG4gICAgICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICAgICAgIChhbGlhcykgPT5cbiAgICAgICAgICAgICAgICAgICAgYWxpYXMudHlwZSA9PT0gXCJmcm9tXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgKGFsaWFzLnRhYmxlUGF0aCB8fCBhbGlhcy5zdWJRdWVyeSksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAubWFwKChhbGlhcykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChhbGlhcy5zdWJRdWVyeSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFsaWFzLnN1YlF1ZXJ5ICsgXCIgXCIgKyB0aGlzLmVzY2FwZShhbGlhcy5uYW1lKVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRUYWJsZU5hbWUoYWxpYXMudGFibGVQYXRoISkgK1xuICAgICAgICAgICAgICAgICAgICBcIiBcIiArXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXNjYXBlKGFsaWFzLm5hbWUpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfSlcblxuICAgICAgICBjb25zdCBzZWxlY3QgPSB0aGlzLmNyZWF0ZVNlbGVjdERpc3RpbmN0RXhwcmVzc2lvbigpXG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IGFsbFNlbGVjdHNcbiAgICAgICAgICAgIC5tYXAoXG4gICAgICAgICAgICAgICAgKHNlbGVjdCkgPT5cbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0LnNlbGVjdGlvbiArXG4gICAgICAgICAgICAgICAgICAgIChzZWxlY3QuYWxpYXNOYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICA/IFwiIEFTIFwiICsgdGhpcy5lc2NhcGUoc2VsZWN0LmFsaWFzTmFtZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIDogXCJcIiksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuam9pbihcIiwgXCIpXG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHNlbGVjdCArXG4gICAgICAgICAgICBzZWxlY3Rpb24gK1xuICAgICAgICAgICAgXCIgRlJPTSBcIiArXG4gICAgICAgICAgICBmcm9tcy5qb2luKFwiLCBcIikgK1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVUYWJsZUxvY2tFeHByZXNzaW9uKCkgK1xuICAgICAgICAgICAgdXNlSW5kZXhcbiAgICAgICAgKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgc2VsZWN0IHwgc2VsZWN0IGRpc3RpbmN0IHBhcnQgb2YgU1FMIHF1ZXJ5LlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBjcmVhdGVTZWxlY3REaXN0aW5jdEV4cHJlc3Npb24oKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgeyBzZWxlY3REaXN0aW5jdCwgc2VsZWN0RGlzdGluY3RPbiwgbWF4RXhlY3V0aW9uVGltZSB9ID1cbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcFxuICAgICAgICBjb25zdCB7IGRyaXZlciB9ID0gdGhpcy5jb25uZWN0aW9uXG5cbiAgICAgICAgbGV0IHNlbGVjdCA9IFwiU0VMRUNUIFwiXG5cbiAgICAgICAgaWYgKG1heEV4ZWN1dGlvblRpbWUgPiAwKSB7XG4gICAgICAgICAgICBpZiAoRHJpdmVyVXRpbHMuaXNNeVNRTEZhbWlseShkcml2ZXIpKSB7XG4gICAgICAgICAgICAgICAgc2VsZWN0ICs9IGAvKisgTUFYX0VYRUNVVElPTl9USU1FKCR7dGhpcy5leHByZXNzaW9uTWFwLm1heEV4ZWN1dGlvblRpbWV9KSAqLyBgXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBEcml2ZXJVdGlscy5pc1Bvc3RncmVzRmFtaWx5KGRyaXZlcikgJiZcbiAgICAgICAgICAgIHNlbGVjdERpc3RpbmN0T24ubGVuZ3RoID4gMFxuICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdERpc3RpbmN0T25NYXAgPSBzZWxlY3REaXN0aW5jdE9uXG4gICAgICAgICAgICAgICAgLm1hcCgob24pID0+IHRoaXMucmVwbGFjZVByb3BlcnR5TmFtZXMob24pKVxuICAgICAgICAgICAgICAgIC5qb2luKFwiLCBcIilcblxuICAgICAgICAgICAgc2VsZWN0ID0gYFNFTEVDVCBESVNUSU5DVCBPTiAoJHtzZWxlY3REaXN0aW5jdE9uTWFwfSkgYFxuICAgICAgICB9IGVsc2UgaWYgKHNlbGVjdERpc3RpbmN0KSB7XG4gICAgICAgICAgICBzZWxlY3QgPSBcIlNFTEVDVCBESVNUSU5DVCBcIlxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHNlbGVjdFxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgXCJKT0lOXCIgcGFydCBvZiBTUUwgcXVlcnkuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNyZWF0ZUpvaW5FeHByZXNzaW9uKCk6IHN0cmluZyB7XG5cblxuXG5cblxuXG5cblxuICAgICAgICBjb25zdCBqb2lucyA9IHRoaXMuZXhwcmVzc2lvbk1hcC5qb2luQXR0cmlidXRlcy5tYXAoKGpvaW5BdHRyKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZWxhdGlvbiA9IGpvaW5BdHRyLnJlbGF0aW9uXG4gICAgICAgICAgICBjb25zdCBkZXN0aW5hdGlvblRhYmxlTmFtZSA9IGpvaW5BdHRyLnRhYmxlUGF0aFxuICAgICAgICAgICAgY29uc3QgZGVzdGluYXRpb25UYWJsZUFsaWFzID0gam9pbkF0dHIuYWxpYXMubmFtZVxuICAgICAgICAgICAgbGV0IGFwcGVuZGVkQ29uZGl0aW9uID0gam9pbkF0dHIuY29uZGl0aW9uXG4gICAgICAgICAgICAgICAgPyBcIiBBTkQgKFwiICsgam9pbkF0dHIuY29uZGl0aW9uICsgXCIpXCJcbiAgICAgICAgICAgICAgICA6IFwiXCJcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudEFsaWFzID0gam9pbkF0dHIucGFyZW50QWxpYXNcblxuXG5cbiAgICAgICAgICAgIGlmICghcGFyZW50QWxpYXMgfHwgIXJlbGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVzdGluYXRpb25Kb2luID0gam9pbkF0dHIuYWxpYXMuc3ViUXVlcnlcbiAgICAgICAgICAgICAgICAgICAgPyBqb2luQXR0ci5hbGlhcy5zdWJRdWVyeVxuICAgICAgICAgICAgICAgICAgICA6IHRoaXMuZ2V0VGFibGVOYW1lKGRlc3RpbmF0aW9uVGFibGVOYW1lKVxuICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgIFwiIFwiICtcbiAgICAgICAgICAgICAgICAgICAgam9pbkF0dHIuZGlyZWN0aW9uICtcbiAgICAgICAgICAgICAgICAgICAgXCIgSk9JTiBcIiArXG4gICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uSm9pbiArXG4gICAgICAgICAgICAgICAgICAgIFwiIFwiICtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lc2NhcGUoZGVzdGluYXRpb25UYWJsZUFsaWFzKSArXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlVGFibGVMb2NrRXhwcmVzc2lvbigpICtcbiAgICAgICAgICAgICAgICAgICAgKGpvaW5BdHRyLmNvbmRpdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgPyBcIiBPTiBcIiArIHRoaXMucmVwbGFjZVByb3BlcnR5TmFtZXMoam9pbkF0dHIuY29uZGl0aW9uKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBcIlwiKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICBpZiAocmVsYXRpb24uaXNNYW55VG9PbmUgfHwgcmVsYXRpb24uaXNPbmVUb09uZU93bmVyKSB7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBjb25kaXRpb24gPSByZWxhdGlvbi5qb2luQ29sdW1uc1xuICAgICAgICAgICAgICAgICAgICAubWFwKChqb2luQ29sdW1uKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uVGFibGVBbGlhcyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIuXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvaW5Db2x1bW4ucmVmZXJlbmNlZENvbHVtbiEucHJvcGVydHlQYXRoICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIj1cIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50QWxpYXMgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiLlwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbi5wcm9wZXJ0eVBhdGggK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiLlwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2luQ29sdW1uLnJlZmVyZW5jZWRDb2x1bW4hLnByb3BlcnR5UGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAuam9pbihcIiBBTkQgXCIpXG5cbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICBcIiBcIiArXG4gICAgICAgICAgICAgICAgICAgIGpvaW5BdHRyLmRpcmVjdGlvbiArXG4gICAgICAgICAgICAgICAgICAgIFwiIEpPSU4gXCIgK1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFRhYmxlTmFtZShkZXN0aW5hdGlvblRhYmxlTmFtZSkgK1xuICAgICAgICAgICAgICAgICAgICBcIiBcIiArXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXNjYXBlKGRlc3RpbmF0aW9uVGFibGVBbGlhcykgK1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVRhYmxlTG9ja0V4cHJlc3Npb24oKSArXG4gICAgICAgICAgICAgICAgICAgIFwiIE9OIFwiICtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXBsYWNlUHJvcGVydHlOYW1lcyhjb25kaXRpb24gKyBhcHBlbmRlZENvbmRpdGlvbilcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJlbGF0aW9uLmlzT25lVG9NYW55IHx8IHJlbGF0aW9uLmlzT25lVG9PbmVOb3RPd25lcikge1xuXG4gICAgICAgICAgICAgICAgY29uc3QgY29uZGl0aW9uID0gcmVsYXRpb25cbiAgICAgICAgICAgICAgICAgICAgLmludmVyc2VSZWxhdGlvbiEuam9pbkNvbHVtbnMubWFwKChqb2luQ29sdW1uKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb24uaW52ZXJzZUVudGl0eU1ldGFkYXRhLnRhYmxlVHlwZSA9PT1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJlbnRpdHktY2hpbGRcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uLmludmVyc2VFbnRpdHlNZXRhZGF0YS5kaXNjcmltaW5hdG9yQ29sdW1uXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRlZENvbmRpdGlvbiArPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiBBTkQgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvblRhYmxlQWxpYXMgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIi5cIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uLmludmVyc2VFbnRpdHlNZXRhZGF0YVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmRpc2NyaW1pbmF0b3JDb2x1bW4uZGF0YWJhc2VOYW1lICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI9J1wiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb24uaW52ZXJzZUVudGl0eU1ldGFkYXRhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZGlzY3JpbWluYXRvclZhbHVlICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCInXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvblRhYmxlQWxpYXMgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiLlwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbi5pbnZlcnNlUmVsYXRpb24hLnByb3BlcnR5UGF0aCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIuXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvaW5Db2x1bW4ucmVmZXJlbmNlZENvbHVtbiEucHJvcGVydHlQYXRoICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIj1cIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50QWxpYXMgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiLlwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2luQ29sdW1uLnJlZmVyZW5jZWRDb2x1bW4hLnByb3BlcnR5UGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAuam9pbihcIiBBTkQgXCIpXG5cbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICBcIiBcIiArXG4gICAgICAgICAgICAgICAgICAgIGpvaW5BdHRyLmRpcmVjdGlvbiArXG4gICAgICAgICAgICAgICAgICAgIFwiIEpPSU4gXCIgK1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFRhYmxlTmFtZShkZXN0aW5hdGlvblRhYmxlTmFtZSkgK1xuICAgICAgICAgICAgICAgICAgICBcIiBcIiArXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXNjYXBlKGRlc3RpbmF0aW9uVGFibGVBbGlhcykgK1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVRhYmxlTG9ja0V4cHJlc3Npb24oKSArXG4gICAgICAgICAgICAgICAgICAgIFwiIE9OIFwiICtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXBsYWNlUHJvcGVydHlOYW1lcyhjb25kaXRpb24gKyBhcHBlbmRlZENvbmRpdGlvbilcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgICAgICAgY29uc3QganVuY3Rpb25UYWJsZU5hbWUgPVxuICAgICAgICAgICAgICAgICAgICByZWxhdGlvbi5qdW5jdGlvbkVudGl0eU1ldGFkYXRhIS50YWJsZVBhdGhcblxuICAgICAgICAgICAgICAgIGNvbnN0IGp1bmN0aW9uQWxpYXMgPSBqb2luQXR0ci5qdW5jdGlvbkFsaWFzXG4gICAgICAgICAgICAgICAgbGV0IGp1bmN0aW9uQ29uZGl0aW9uID0gXCJcIixcbiAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb25Db25kaXRpb24gPSBcIlwiXG5cbiAgICAgICAgICAgICAgICBpZiAocmVsYXRpb24uaXNPd25pbmcpIHtcbiAgICAgICAgICAgICAgICAgICAganVuY3Rpb25Db25kaXRpb24gPSByZWxhdGlvbi5qb2luQ29sdW1uc1xuICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgoam9pbkNvbHVtbikgPT4ge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganVuY3Rpb25BbGlhcyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiLlwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam9pbkNvbHVtbi5wcm9wZXJ0eVBhdGggK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIj1cIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudEFsaWFzICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIuXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2luQ29sdW1uLnJlZmVyZW5jZWRDb2x1bW4hLnByb3BlcnR5UGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAuam9pbihcIiBBTkQgXCIpXG5cbiAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb25Db25kaXRpb24gPSByZWxhdGlvbi5pbnZlcnNlSm9pbkNvbHVtbnNcbiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKGpvaW5Db2x1bW4pID0+IHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uVGFibGVBbGlhcyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiLlwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam9pbkNvbHVtbi5yZWZlcmVuY2VkQ29sdW1uIS5wcm9wZXJ0eVBhdGggK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIj1cIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGp1bmN0aW9uQWxpYXMgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIi5cIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvaW5Db2x1bW4ucHJvcGVydHlQYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5qb2luKFwiIEFORCBcIilcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBqdW5jdGlvbkNvbmRpdGlvbiA9IHJlbGF0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAuaW52ZXJzZVJlbGF0aW9uIS5pbnZlcnNlSm9pbkNvbHVtbnMubWFwKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChqb2luQ29sdW1uKSA9PiB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGp1bmN0aW9uQWxpYXMgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIuXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam9pbkNvbHVtbi5wcm9wZXJ0eVBhdGggK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI9XCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50QWxpYXMgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIuXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam9pbkNvbHVtbi5yZWZlcmVuY2VkQ29sdW1uIS5wcm9wZXJ0eVBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAuam9pbihcIiBBTkQgXCIpXG5cbiAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb25Db25kaXRpb24gPSByZWxhdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgLmludmVyc2VSZWxhdGlvbiEuam9pbkNvbHVtbnMubWFwKChqb2luQ29sdW1uKSA9PiB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvblRhYmxlQWxpYXMgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIi5cIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvaW5Db2x1bW4ucmVmZXJlbmNlZENvbHVtbiEucHJvcGVydHlQYXRoICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCI9XCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqdW5jdGlvbkFsaWFzICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIuXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2luQ29sdW1uLnByb3BlcnR5UGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAuam9pbihcIiBBTkQgXCIpXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgXCIgXCIgK1xuICAgICAgICAgICAgICAgICAgICBqb2luQXR0ci5kaXJlY3Rpb24gK1xuICAgICAgICAgICAgICAgICAgICBcIiBKT0lOIFwiICtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRUYWJsZU5hbWUoanVuY3Rpb25UYWJsZU5hbWUpICtcbiAgICAgICAgICAgICAgICAgICAgXCIgXCIgK1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVzY2FwZShqdW5jdGlvbkFsaWFzKSArXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlVGFibGVMb2NrRXhwcmVzc2lvbigpICtcbiAgICAgICAgICAgICAgICAgICAgXCIgT04gXCIgK1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlcGxhY2VQcm9wZXJ0eU5hbWVzKGp1bmN0aW9uQ29uZGl0aW9uKSArXG4gICAgICAgICAgICAgICAgICAgIFwiIFwiICtcbiAgICAgICAgICAgICAgICAgICAgam9pbkF0dHIuZGlyZWN0aW9uICtcbiAgICAgICAgICAgICAgICAgICAgXCIgSk9JTiBcIiArXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0VGFibGVOYW1lKGRlc3RpbmF0aW9uVGFibGVOYW1lKSArXG4gICAgICAgICAgICAgICAgICAgIFwiIFwiICtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lc2NhcGUoZGVzdGluYXRpb25UYWJsZUFsaWFzKSArXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlVGFibGVMb2NrRXhwcmVzc2lvbigpICtcbiAgICAgICAgICAgICAgICAgICAgXCIgT04gXCIgK1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlcGxhY2VQcm9wZXJ0eU5hbWVzKFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb25Db25kaXRpb24gKyBhcHBlbmRlZENvbmRpdGlvbixcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gam9pbnMuam9pbihcIiBcIilcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIFwiR1JPVVAgQllcIiBwYXJ0IG9mIFNRTCBxdWVyeS5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgY3JlYXRlR3JvdXBCeUV4cHJlc3Npb24oKSB7XG4gICAgICAgIGlmICghdGhpcy5leHByZXNzaW9uTWFwLmdyb3VwQnlzIHx8ICF0aGlzLmV4cHJlc3Npb25NYXAuZ3JvdXBCeXMubGVuZ3RoKVxuICAgICAgICAgICAgcmV0dXJuIFwiXCJcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIFwiIEdST1VQIEJZIFwiICtcbiAgICAgICAgICAgIHRoaXMucmVwbGFjZVByb3BlcnR5TmFtZXModGhpcy5leHByZXNzaW9uTWFwLmdyb3VwQnlzLmpvaW4oXCIsIFwiKSlcbiAgICAgICAgKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgXCJPUkRFUiBCWVwiIHBhcnQgb2YgU1FMIHF1ZXJ5LlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBjcmVhdGVPcmRlckJ5RXhwcmVzc2lvbigpIHtcbiAgICAgICAgY29uc3Qgb3JkZXJCeXMgPSB0aGlzLmV4cHJlc3Npb25NYXAuYWxsT3JkZXJCeXNcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKG9yZGVyQnlzKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICBcIiBPUkRFUiBCWSBcIiArXG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMob3JkZXJCeXMpXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoKGNvbHVtbk5hbWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygb3JkZXJCeXNbY29sdW1uTmFtZV0gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlcGxhY2VQcm9wZXJ0eU5hbWVzKGNvbHVtbk5hbWUpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlckJ5c1tjb2x1bW5OYW1lXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXBsYWNlUHJvcGVydHlOYW1lcyhjb2x1bW5OYW1lKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9yZGVyQnlzW2NvbHVtbk5hbWVdIGFzIGFueSkub3JkZXIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcmRlckJ5c1tjb2x1bW5OYW1lXSBhcyBhbnkpLm51bGxzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAuam9pbihcIiwgXCIpXG4gICAgICAgICAgICApXG5cbiAgICAgICAgcmV0dXJuIFwiXCJcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIFwiTElNSVRcIiBhbmQgXCJPRkZTRVRcIiBwYXJ0cyBvZiBTUUwgcXVlcnkuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNyZWF0ZUxpbWl0T2Zmc2V0RXhwcmVzc2lvbigpOiBzdHJpbmcge1xuXG5cbiAgICAgICAgbGV0IG9mZnNldDogbnVtYmVyIHwgdW5kZWZpbmVkID0gdGhpcy5leHByZXNzaW9uTWFwLm9mZnNldCxcbiAgICAgICAgICAgIGxpbWl0OiBudW1iZXIgfCB1bmRlZmluZWQgPSB0aGlzLmV4cHJlc3Npb25NYXAubGltaXRcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgIW9mZnNldCAmJlxuICAgICAgICAgICAgIWxpbWl0ICYmXG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAuam9pbkF0dHJpYnV0ZXMubGVuZ3RoID09PSAwXG4gICAgICAgICkge1xuICAgICAgICAgICAgb2Zmc2V0ID0gdGhpcy5leHByZXNzaW9uTWFwLnNraXBcbiAgICAgICAgICAgIGxpbWl0ID0gdGhpcy5leHByZXNzaW9uTWFwLnRha2VcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLm9wdGlvbnMudHlwZSA9PT0gXCJtc3NxbFwiKSB7XG5cblxuXG5cblxuICAgICAgICAgICAgbGV0IHByZWZpeCA9IFwiXCJcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAobGltaXQgfHwgb2Zmc2V0KSAmJlxuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHRoaXMuZXhwcmVzc2lvbk1hcC5hbGxPcmRlckJ5cykubGVuZ3RoIDw9IDBcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHByZWZpeCA9IFwiIE9SREVSIEJZIChTRUxFQ1QgTlVMTClcIlxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobGltaXQgJiYgb2Zmc2V0KVxuICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgIHByZWZpeCArXG4gICAgICAgICAgICAgICAgICAgIFwiIE9GRlNFVCBcIiArXG4gICAgICAgICAgICAgICAgICAgIG9mZnNldCArXG4gICAgICAgICAgICAgICAgICAgIFwiIFJPV1MgRkVUQ0ggTkVYVCBcIiArXG4gICAgICAgICAgICAgICAgICAgIGxpbWl0ICtcbiAgICAgICAgICAgICAgICAgICAgXCIgUk9XUyBPTkxZXCJcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICBpZiAobGltaXQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgcHJlZml4ICsgXCIgT0ZGU0VUIDAgUk9XUyBGRVRDSCBORVhUIFwiICsgbGltaXQgKyBcIiBST1dTIE9OTFlcIlxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIGlmIChvZmZzZXQpIHJldHVybiBwcmVmaXggKyBcIiBPRkZTRVQgXCIgKyBvZmZzZXQgKyBcIiBST1dTXCJcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgIERyaXZlclV0aWxzLmlzTXlTUUxGYW1pbHkodGhpcy5jb25uZWN0aW9uLmRyaXZlcikgfHxcbiAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbi5kcml2ZXIub3B0aW9ucy50eXBlID09PSBcImF1cm9yYS1teXNxbFwiIHx8XG4gICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLm9wdGlvbnMudHlwZSA9PT0gXCJzYXBcIiB8fFxuICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uLmRyaXZlci5vcHRpb25zLnR5cGUgPT09IFwic3Bhbm5lclwiXG4gICAgICAgICkge1xuICAgICAgICAgICAgaWYgKGxpbWl0ICYmIG9mZnNldCkgcmV0dXJuIFwiIExJTUlUIFwiICsgbGltaXQgKyBcIiBPRkZTRVQgXCIgKyBvZmZzZXRcbiAgICAgICAgICAgIGlmIChsaW1pdCkgcmV0dXJuIFwiIExJTUlUIFwiICsgbGltaXRcbiAgICAgICAgICAgIGlmIChvZmZzZXQpIHRocm93IG5ldyBPZmZzZXRXaXRob3V0TGltaXROb3RTdXBwb3J0ZWRFcnJvcigpXG4gICAgICAgIH0gZWxzZSBpZiAoRHJpdmVyVXRpbHMuaXNTUUxpdGVGYW1pbHkodGhpcy5jb25uZWN0aW9uLmRyaXZlcikpIHtcbiAgICAgICAgICAgIGlmIChsaW1pdCAmJiBvZmZzZXQpIHJldHVybiBcIiBMSU1JVCBcIiArIGxpbWl0ICsgXCIgT0ZGU0VUIFwiICsgb2Zmc2V0XG4gICAgICAgICAgICBpZiAobGltaXQpIHJldHVybiBcIiBMSU1JVCBcIiArIGxpbWl0XG4gICAgICAgICAgICBpZiAob2Zmc2V0KSByZXR1cm4gXCIgTElNSVQgLTEgT0ZGU0VUIFwiICsgb2Zmc2V0XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25uZWN0aW9uLmRyaXZlci5vcHRpb25zLnR5cGUgPT09IFwib3JhY2xlXCIpIHtcbiAgICAgICAgICAgIGlmIChsaW1pdCAmJiBvZmZzZXQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgXCIgT0ZGU0VUIFwiICtcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICtcbiAgICAgICAgICAgICAgICAgICAgXCIgUk9XUyBGRVRDSCBORVhUIFwiICtcbiAgICAgICAgICAgICAgICAgICAgbGltaXQgK1xuICAgICAgICAgICAgICAgICAgICBcIiBST1dTIE9OTFlcIlxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIGlmIChsaW1pdCkgcmV0dXJuIFwiIEZFVENIIE5FWFQgXCIgKyBsaW1pdCArIFwiIFJPV1MgT05MWVwiXG4gICAgICAgICAgICBpZiAob2Zmc2V0KSByZXR1cm4gXCIgT0ZGU0VUIFwiICsgb2Zmc2V0ICsgXCIgUk9XU1wiXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAobGltaXQgJiYgb2Zmc2V0KSByZXR1cm4gXCIgTElNSVQgXCIgKyBsaW1pdCArIFwiIE9GRlNFVCBcIiArIG9mZnNldFxuICAgICAgICAgICAgaWYgKGxpbWl0KSByZXR1cm4gXCIgTElNSVQgXCIgKyBsaW1pdFxuICAgICAgICAgICAgaWYgKG9mZnNldCkgcmV0dXJuIFwiIE9GRlNFVCBcIiArIG9mZnNldFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFwiXCJcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIFwiTE9DS1wiIHBhcnQgb2YgU0VMRUNUIFF1ZXJ5IGFmdGVyIHRhYmxlIENsYXVzZVxuICAgICAqIGV4LlxuICAgICAqICBTRUxFQ1QgMVxuICAgICAqICBGUk9NIFVTRVIgVSBXSVRIIChOT0xPQ0spXG4gICAgICogIEpPSU4gT1JERVIgTyBXSVRIIChOT0xPQ0spXG4gICAgICogICAgICBPTiBVLklEPU8uT3JkZXJJRFxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlVGFibGVMb2NrRXhwcmVzc2lvbigpOiBzdHJpbmcge1xuICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uLmRyaXZlci5vcHRpb25zLnR5cGUgPT09IFwibXNzcWxcIikge1xuICAgICAgICAgICAgc3dpdGNoICh0aGlzLmV4cHJlc3Npb25NYXAubG9ja01vZGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFwicGVzc2ltaXN0aWNfcmVhZFwiOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCIgV0lUSCAoSE9MRExPQ0ssIFJPV0xPQ0spXCJcbiAgICAgICAgICAgICAgICBjYXNlIFwicGVzc2ltaXN0aWNfd3JpdGVcIjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiIFdJVEggKFVQRExPQ0ssIFJPV0xPQ0spXCJcbiAgICAgICAgICAgICAgICBjYXNlIFwiZGlydHlfcmVhZFwiOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCIgV0lUSCAoTk9MT0NLKVwiXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gXCJcIlxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgXCJMT0NLXCIgcGFydCBvZiBTUUwgcXVlcnkuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNyZWF0ZUxvY2tFeHByZXNzaW9uKCk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IGRyaXZlciA9IHRoaXMuY29ubmVjdGlvbi5kcml2ZXJcblxuICAgICAgICBsZXQgbG9ja1RhYmxlc0NsYXVzZSA9IFwiXCJcblxuICAgICAgICBpZiAodGhpcy5leHByZXNzaW9uTWFwLmxvY2tUYWJsZXMpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAhKFxuICAgICAgICAgICAgICAgICAgICBEcml2ZXJVdGlscy5pc1Bvc3RncmVzRmFtaWx5KGRyaXZlcikgfHxcbiAgICAgICAgICAgICAgICAgICAgZHJpdmVyLm9wdGlvbnMudHlwZSA9PT0gXCJjb2Nrcm9hY2hkYlwiXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcbiAgICAgICAgICAgICAgICAgICAgXCJMb2NrIHRhYmxlcyBub3Qgc3VwcG9ydGVkIGluIHNlbGVjdGVkIGRyaXZlclwiLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmV4cHJlc3Npb25NYXAubG9ja1RhYmxlcy5sZW5ndGggPCAxKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcImxvY2tUYWJsZXMgY2Fubm90IGJlIGFuIGVtcHR5IGFycmF5XCIpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsb2NrVGFibGVzQ2xhdXNlID0gXCIgT0YgXCIgKyB0aGlzLmV4cHJlc3Npb25NYXAubG9ja1RhYmxlcy5qb2luKFwiLCBcIilcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBvbkxvY2tFeHByZXNzaW9uID0gXCJcIlxuICAgICAgICBpZiAodGhpcy5leHByZXNzaW9uTWFwLm9uTG9ja2VkID09PSBcIm5vd2FpdFwiKSB7XG4gICAgICAgICAgICBvbkxvY2tFeHByZXNzaW9uID0gXCIgTk9XQUlUXCJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmV4cHJlc3Npb25NYXAub25Mb2NrZWQgPT09IFwic2tpcF9sb2NrZWRcIikge1xuICAgICAgICAgICAgb25Mb2NrRXhwcmVzc2lvbiA9IFwiIFNLSVAgTE9DS0VEXCJcbiAgICAgICAgfVxuICAgICAgICBzd2l0Y2ggKHRoaXMuZXhwcmVzc2lvbk1hcC5sb2NrTW9kZSkge1xuICAgICAgICAgICAgY2FzZSBcInBlc3NpbWlzdGljX3JlYWRcIjpcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGRyaXZlci5vcHRpb25zLnR5cGUgPT09IFwibXlzcWxcIiB8fFxuICAgICAgICAgICAgICAgICAgICBkcml2ZXIub3B0aW9ucy50eXBlID09PSBcImF1cm9yYS1teXNxbFwiXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIERyaXZlclV0aWxzLmlzUmVsZWFzZVZlcnNpb25PckdyZWF0ZXIoZHJpdmVyLCBcIjguMC4wXCIpXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiBGT1IgU0hBUkVcIiArIGxvY2tUYWJsZXNDbGF1c2UgKyBvbkxvY2tFeHByZXNzaW9uXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCIgTE9DSyBJTiBTSEFSRSBNT0RFXCJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZHJpdmVyLm9wdGlvbnMudHlwZSA9PT0gXCJtYXJpYWRiXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiIExPQ0sgSU4gU0hBUkUgTU9ERVwiXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChEcml2ZXJVdGlscy5pc1Bvc3RncmVzRmFtaWx5KGRyaXZlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiIEZPUiBTSEFSRVwiICsgbG9ja1RhYmxlc0NsYXVzZSArIG9uTG9ja0V4cHJlc3Npb25cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRyaXZlci5vcHRpb25zLnR5cGUgPT09IFwib3JhY2xlXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiIEZPUiBVUERBVEVcIlxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZHJpdmVyLm9wdGlvbnMudHlwZSA9PT0gXCJtc3NxbFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIlwiXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IExvY2tOb3RTdXBwb3J0ZWRPbkdpdmVuRHJpdmVyRXJyb3IoKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgXCJwZXNzaW1pc3RpY193cml0ZVwiOlxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgRHJpdmVyVXRpbHMuaXNNeVNRTEZhbWlseShkcml2ZXIpIHx8XG4gICAgICAgICAgICAgICAgICAgIGRyaXZlci5vcHRpb25zLnR5cGUgPT09IFwiYXVyb3JhLW15c3FsXCIgfHxcbiAgICAgICAgICAgICAgICAgICAgZHJpdmVyLm9wdGlvbnMudHlwZSA9PT0gXCJvcmFjbGVcIlxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCIgRk9SIFVQREFURVwiICsgb25Mb2NrRXhwcmVzc2lvblxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICAgIERyaXZlclV0aWxzLmlzUG9zdGdyZXNGYW1pbHkoZHJpdmVyKSB8fFxuICAgICAgICAgICAgICAgICAgICBkcml2ZXIub3B0aW9ucy50eXBlID09PSBcImNvY2tyb2FjaGRiXCJcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiIEZPUiBVUERBVEVcIiArIGxvY2tUYWJsZXNDbGF1c2UgKyBvbkxvY2tFeHByZXNzaW9uXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkcml2ZXIub3B0aW9ucy50eXBlID09PSBcIm1zc3FsXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiXCJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTG9ja05vdFN1cHBvcnRlZE9uR2l2ZW5Ecml2ZXJFcnJvcigpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBcInBlc3NpbWlzdGljX3BhcnRpYWxfd3JpdGVcIjpcbiAgICAgICAgICAgICAgICBpZiAoRHJpdmVyVXRpbHMuaXNQb3N0Z3Jlc0ZhbWlseShkcml2ZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIiBGT1IgVVBEQVRFXCIgKyBsb2NrVGFibGVzQ2xhdXNlICsgXCIgU0tJUCBMT0NLRURcIlxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoRHJpdmVyVXRpbHMuaXNNeVNRTEZhbWlseShkcml2ZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIiBGT1IgVVBEQVRFIFNLSVAgTE9DS0VEXCJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTG9ja05vdFN1cHBvcnRlZE9uR2l2ZW5Ecml2ZXJFcnJvcigpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBcInBlc3NpbWlzdGljX3dyaXRlX29yX2ZhaWxcIjpcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIERyaXZlclV0aWxzLmlzUG9zdGdyZXNGYW1pbHkoZHJpdmVyKSB8fFxuICAgICAgICAgICAgICAgICAgICBkcml2ZXIub3B0aW9ucy50eXBlID09PSBcImNvY2tyb2FjaGRiXCJcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiIEZPUiBVUERBVEVcIiArIGxvY2tUYWJsZXNDbGF1c2UgKyBcIiBOT1dBSVRcIlxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoRHJpdmVyVXRpbHMuaXNNeVNRTEZhbWlseShkcml2ZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIiBGT1IgVVBEQVRFIE5PV0FJVFwiXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IExvY2tOb3RTdXBwb3J0ZWRPbkdpdmVuRHJpdmVyRXJyb3IoKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgXCJmb3Jfbm9fa2V5X3VwZGF0ZVwiOlxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgRHJpdmVyVXRpbHMuaXNQb3N0Z3Jlc0ZhbWlseShkcml2ZXIpIHx8XG4gICAgICAgICAgICAgICAgICAgIGRyaXZlci5vcHRpb25zLnR5cGUgPT09IFwiY29ja3JvYWNoZGJcIlxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgXCIgRk9SIE5PIEtFWSBVUERBVEVcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2NrVGFibGVzQ2xhdXNlICtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uTG9ja0V4cHJlc3Npb25cbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBMb2NrTm90U3VwcG9ydGVkT25HaXZlbkRyaXZlckVycm9yKClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFwiZm9yX2tleV9zaGFyZVwiOlxuICAgICAgICAgICAgICAgIGlmIChEcml2ZXJVdGlscy5pc1Bvc3RncmVzRmFtaWx5KGRyaXZlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiIEZPUiBLRVkgU0hBUkVcIiArIGxvY2tUYWJsZXNDbGF1c2UgKyBvbkxvY2tFeHByZXNzaW9uXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTG9ja05vdFN1cHBvcnRlZE9uR2l2ZW5Ecml2ZXJFcnJvcigpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJcIlxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBcIkhBVklOR1wiIHBhcnQgb2YgU1FMIHF1ZXJ5LlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBjcmVhdGVIYXZpbmdFeHByZXNzaW9uKCkge1xuICAgICAgICBpZiAoIXRoaXMuZXhwcmVzc2lvbk1hcC5oYXZpbmdzIHx8ICF0aGlzLmV4cHJlc3Npb25NYXAuaGF2aW5ncy5sZW5ndGgpXG4gICAgICAgICAgICByZXR1cm4gXCJcIlxuICAgICAgICBjb25zdCBjb25kaXRpb25zID0gdGhpcy5leHByZXNzaW9uTWFwLmhhdmluZ3NcbiAgICAgICAgICAgIC5tYXAoKGhhdmluZywgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGhhdmluZy50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJhbmRcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGluZGV4ID4gMCA/IFwiQU5EIFwiIDogXCJcIikgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVwbGFjZVByb3BlcnR5TmFtZXMoaGF2aW5nLmNvbmRpdGlvbilcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIm9yXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbmRleCA+IDAgPyBcIk9SIFwiIDogXCJcIikgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVwbGFjZVByb3BlcnR5TmFtZXMoaGF2aW5nLmNvbmRpdGlvbilcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlcGxhY2VQcm9wZXJ0eU5hbWVzKGhhdmluZy5jb25kaXRpb24pXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5qb2luKFwiIFwiKVxuXG4gICAgICAgIGlmICghY29uZGl0aW9ucy5sZW5ndGgpIHJldHVybiBcIlwiXG4gICAgICAgIHJldHVybiBcIiBIQVZJTkcgXCIgKyBjb25kaXRpb25zXG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGJ1aWxkRXNjYXBlZEVudGl0eUNvbHVtblNlbGVjdHMoXG4gICAgICAgIGFsaWFzTmFtZTogc3RyaW5nLFxuICAgICAgICBtZXRhZGF0YTogRW50aXR5TWV0YWRhdGEsXG4gICAgKTogU2VsZWN0UXVlcnlbXSB7XG4gICAgICAgIGNvbnN0IGhhc01haW5BbGlhcyA9IHRoaXMuZXhwcmVzc2lvbk1hcC5zZWxlY3RzLnNvbWUoXG4gICAgICAgICAgICAoc2VsZWN0KSA9PiBzZWxlY3Quc2VsZWN0aW9uID09PSBhbGlhc05hbWUsXG4gICAgICAgIClcblxuICAgICAgICBjb25zdCBjb2x1bW5zOiBDb2x1bW5NZXRhZGF0YVtdID0gW11cbiAgICAgICAgaWYgKGhhc01haW5BbGlhcykge1xuICAgICAgICAgICAgY29sdW1ucy5wdXNoKFxuICAgICAgICAgICAgICAgIC4uLm1ldGFkYXRhLmNvbHVtbnMuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgICAoY29sdW1uKSA9PiBjb2x1bW4uaXNTZWxlY3QgPT09IHRydWUsXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgfVxuICAgICAgICBjb2x1bW5zLnB1c2goXG4gICAgICAgICAgICAuLi5tZXRhZGF0YS5jb2x1bW5zLmZpbHRlcigoY29sdW1uKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXhwcmVzc2lvbk1hcC5zZWxlY3RzLnNvbWUoXG4gICAgICAgICAgICAgICAgICAgIChzZWxlY3QpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Quc2VsZWN0aW9uID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXNOYW1lICsgXCIuXCIgKyBjb2x1bW4ucHJvcGVydHlQYXRoLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH0pLFxuICAgICAgICApXG5cblxuXG5cbiAgICAgICAgaWYgKGNvbHVtbnMubGVuZ3RoID09PSAwKVxuXG4gICAgICAgICAgICByZXR1cm4gW11cblxuICAgICAgICBjb25zdCBub25TZWxlY3RlZFByaW1hcnlDb2x1bW5zID0gdGhpcy5leHByZXNzaW9uTWFwLnF1ZXJ5RW50aXR5XG4gICAgICAgICAgICA/IG1ldGFkYXRhLnByaW1hcnlDb2x1bW5zLmZpbHRlcihcbiAgICAgICAgICAgICAgICAgIChwcmltYXJ5Q29sdW1uKSA9PiBjb2x1bW5zLmluZGV4T2YocHJpbWFyeUNvbHVtbikgPT09IC0xLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICA6IFtdXG4gICAgICAgIGNvbnN0IGFsbENvbHVtbnMgPSBbLi4uY29sdW1ucywgLi4ubm9uU2VsZWN0ZWRQcmltYXJ5Q29sdW1uc11cbiAgICAgICAgY29uc3QgZmluYWxTZWxlY3RzOiBTZWxlY3RRdWVyeVtdID0gW11cblxuICAgICAgICBjb25zdCBlc2NhcGVkQWxpYXNOYW1lID0gdGhpcy5lc2NhcGUoYWxpYXNOYW1lKVxuICAgICAgICBhbGxDb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xuICAgICAgICAgICAgbGV0IHNlbGVjdGlvblBhdGggPVxuICAgICAgICAgICAgICAgIGVzY2FwZWRBbGlhc05hbWUgKyBcIi5cIiArIHRoaXMuZXNjYXBlKGNvbHVtbi5kYXRhYmFzZU5hbWUpXG5cbiAgICAgICAgICAgIGlmIChjb2x1bW4uaXNWaXJ0dWFsUHJvcGVydHkgJiYgY29sdW1uLnF1ZXJ5KSB7XG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uUGF0aCA9IGAoJHtjb2x1bW4ucXVlcnkoZXNjYXBlZEFsaWFzTmFtZSl9KWBcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbi5kcml2ZXIuc3BhdGlhbFR5cGVzLmluZGV4T2YoY29sdW1uLnR5cGUpICE9PSAtMVxuICAgICAgICAgICAgKSB7XG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuICBcblxuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbi8qICovXG4vKiAqL1xuLyogKi9cbiAgXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbnMgPSB0aGlzLmV4cHJlc3Npb25NYXAuc2VsZWN0cy5maWx0ZXIoXG4gICAgICAgICAgICAgICAgKHNlbGVjdCkgPT5cbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0LnNlbGVjdGlvbiA9PT0gYWxpYXNOYW1lICsgXCIuXCIgKyBjb2x1bW4ucHJvcGVydHlQYXRoLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgaWYgKHNlbGVjdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgc2VsZWN0aW9ucy5mb3JFYWNoKChzZWxlY3Rpb24pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZmluYWxTZWxlY3RzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiBzZWxlY3Rpb25QYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXNOYW1lOiBzZWxlY3Rpb24uYWxpYXNOYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBzZWxlY3Rpb24uYWxpYXNOYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBEcml2ZXJVdGlscy5idWlsZEFsaWFzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbi5kcml2ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXNOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbi5kYXRhYmFzZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuXG4gICAgICAgICAgICAgICAgICAgICAgICB2aXJ0dWFsOiBzZWxlY3Rpb24udmlydHVhbCxcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmaW5hbFNlbGVjdHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogc2VsZWN0aW9uUGF0aCxcbiAgICAgICAgICAgICAgICAgICAgYWxpYXNOYW1lOiBEcml2ZXJVdGlscy5idWlsZEFsaWFzKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uLmRyaXZlcixcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbi5kYXRhYmFzZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgICksXG5cbiAgICAgICAgICAgICAgICAgICAgdmlydHVhbDogaGFzTWFpbkFsaWFzLFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIHJldHVybiBmaW5hbFNlbGVjdHNcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZmluZEVudGl0eUNvbHVtblNlbGVjdHMoXG4gICAgICAgIGFsaWFzTmFtZTogc3RyaW5nLFxuICAgICAgICBtZXRhZGF0YTogRW50aXR5TWV0YWRhdGEsXG4gICAgKTogU2VsZWN0UXVlcnlbXSB7XG4gICAgICAgIGNvbnN0IG1haW5TZWxlY3QgPSB0aGlzLmV4cHJlc3Npb25NYXAuc2VsZWN0cy5maW5kKFxuICAgICAgICAgICAgKHNlbGVjdCkgPT4gc2VsZWN0LnNlbGVjdGlvbiA9PT0gYWxpYXNOYW1lLFxuICAgICAgICApXG4gICAgICAgIGlmIChtYWluU2VsZWN0KSByZXR1cm4gW21haW5TZWxlY3RdXG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZXhwcmVzc2lvbk1hcC5zZWxlY3RzLmZpbHRlcigoc2VsZWN0KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbWV0YWRhdGEuY29sdW1ucy5zb21lKFxuICAgICAgICAgICAgICAgIChjb2x1bW4pID0+XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdC5zZWxlY3Rpb24gPT09IGFsaWFzTmFtZSArIFwiLlwiICsgY29sdW1uLnByb3BlcnR5UGF0aCxcbiAgICAgICAgICAgIClcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwcml2YXRlIGNvbXB1dGVDb3VudEV4cHJlc3Npb24oKSB7XG4gICAgICAgIGNvbnN0IG1haW5BbGlhcyA9IHRoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMhLm5hbWUgLy8gdG9kbzogd2lsbCB0aGlzIHdvcmsgd2l0aCBcImZyb21UYWJsZU5hbWVcIj9cbiAgICAgICAgY29uc3QgbWV0YWRhdGEgPSB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzIS5tZXRhZGF0YVxuXG4gICAgICAgIGNvbnN0IHByaW1hcnlDb2x1bW5zID0gbWV0YWRhdGEucHJpbWFyeUNvbHVtbnNcbiAgICAgICAgY29uc3QgZGlzdGluY3RBbGlhcyA9IHRoaXMuZXNjYXBlKG1haW5BbGlhcylcblxuXG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmpvaW5BdHRyaWJ1dGVzLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLnJlbGF0aW9uSWRBdHRyaWJ1dGVzLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLnJlbGF0aW9uQ291bnRBdHRyaWJ1dGVzLmxlbmd0aCA9PT0gMFxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBcIkNPVU5UKDEpXCJcbiAgICAgICAgfVxuXG5cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLm9wdGlvbnMudHlwZSA9PT0gXCJjb2Nrcm9hY2hkYlwiIHx8XG4gICAgICAgICAgICBEcml2ZXJVdGlscy5pc1Bvc3RncmVzRmFtaWx5KHRoaXMuY29ubmVjdGlvbi5kcml2ZXIpXG4gICAgICAgICkge1xuXG5cbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgXCJDT1VOVChESVNUSU5DVChcIiArXG4gICAgICAgICAgICAgICAgcHJpbWFyeUNvbHVtbnNcbiAgICAgICAgICAgICAgICAgICAgLm1hcChcbiAgICAgICAgICAgICAgICAgICAgICAgIChjKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAke2Rpc3RpbmN0QWxpYXN9LiR7dGhpcy5lc2NhcGUoYy5kYXRhYmFzZU5hbWUpfWAsXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgLmpvaW4oXCIsIFwiKSArXG4gICAgICAgICAgICAgICAgXCIpKVwiXG4gICAgICAgICAgICApXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoRHJpdmVyVXRpbHMuaXNNeVNRTEZhbWlseSh0aGlzLmNvbm5lY3Rpb24uZHJpdmVyKSkge1xuXG5cbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgXCJDT1VOVChESVNUSU5DVCBcIiArXG4gICAgICAgICAgICAgICAgcHJpbWFyeUNvbHVtbnNcbiAgICAgICAgICAgICAgICAgICAgLm1hcChcbiAgICAgICAgICAgICAgICAgICAgICAgIChjKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAke2Rpc3RpbmN0QWxpYXN9LiR7dGhpcy5lc2NhcGUoYy5kYXRhYmFzZU5hbWUpfWAsXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgLmpvaW4oXCIsIFwiKSArXG4gICAgICAgICAgICAgICAgXCIpXCJcbiAgICAgICAgICAgIClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLm9wdGlvbnMudHlwZSA9PT0gXCJtc3NxbFwiKSB7XG5cblxuXG5cblxuICAgICAgICAgICAgY29uc3QgY29sdW1uc0V4cHJlc3Npb24gPSBwcmltYXJ5Q29sdW1uc1xuICAgICAgICAgICAgICAgIC5tYXAoXG4gICAgICAgICAgICAgICAgICAgIChwcmltYXJ5Q29sdW1uKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgYCR7ZGlzdGluY3RBbGlhc30uJHt0aGlzLmVzY2FwZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5Q29sdW1uLmRhdGFiYXNlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICl9YCxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLmpvaW4oXCIsICd8O3wnLCBcIilcblxuICAgICAgICAgICAgaWYgKHByaW1hcnlDb2x1bW5zLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBgQ09VTlQoRElTVElOQ1QoJHtjb2x1bW5zRXhwcmVzc2lvbn0pKWBcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGBDT1VOVChESVNUSU5DVChDT05DQVQoJHtjb2x1bW5zRXhwcmVzc2lvbn0pKSlgXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jb25uZWN0aW9uLmRyaXZlci5vcHRpb25zLnR5cGUgPT09IFwic3Bhbm5lclwiKSB7XG5cblxuXG4gICAgICAgICAgICBpZiAocHJpbWFyeUNvbHVtbnMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBDT1VOVChESVNUSU5DVCgke2Rpc3RpbmN0QWxpYXN9LiR7dGhpcy5lc2NhcGUoXG4gICAgICAgICAgICAgICAgICAgIHByaW1hcnlDb2x1bW5zWzBdLmRhdGFiYXNlTmFtZSxcbiAgICAgICAgICAgICAgICApfSkpYFxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBjb2x1bW5zRXhwcmVzc2lvbiA9IHByaW1hcnlDb2x1bW5zXG4gICAgICAgICAgICAgICAgLm1hcChcbiAgICAgICAgICAgICAgICAgICAgKHByaW1hcnlDb2x1bW4pID0+XG4gICAgICAgICAgICAgICAgICAgICAgICBgQ0FTVCgke2Rpc3RpbmN0QWxpYXN9LiR7dGhpcy5lc2NhcGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeUNvbHVtbi5kYXRhYmFzZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICApfSBBUyBTVFJJTkcpYCxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLmpvaW4oXCIsICd8O3wnLCBcIilcbiAgICAgICAgICAgIHJldHVybiBgQ09VTlQoRElTVElOQ1QoQ09OQ0FUKCR7Y29sdW1uc0V4cHJlc3Npb259KSkpYFxuICAgICAgICB9XG5cblxuXG5cblxuXG5cblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgYENPVU5UKERJU1RJTkNUKGAgK1xuICAgICAgICAgICAgcHJpbWFyeUNvbHVtbnNcbiAgICAgICAgICAgICAgICAubWFwKChjKSA9PiBgJHtkaXN0aW5jdEFsaWFzfS4ke3RoaXMuZXNjYXBlKGMuZGF0YWJhc2VOYW1lKX1gKVxuICAgICAgICAgICAgICAgIC5qb2luKFwiIHx8ICd8O3wnIHx8IFwiKSArXG4gICAgICAgICAgICBcIikpXCJcbiAgICAgICAgKVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBhc3luYyBleGVjdXRlQ291bnRRdWVyeShcbiAgICAgICAgcXVlcnlSdW5uZXI6IFF1ZXJ5UnVubmVyLFxuICAgICk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgICAgIGNvbnN0IGNvdW50U3FsID0gdGhpcy5jb21wdXRlQ291bnRFeHByZXNzaW9uKClcblxuICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgdGhpcy5jbG9uZSgpXG4gICAgICAgICAgICAub3JkZXJCeSgpXG4gICAgICAgICAgICAuZ3JvdXBCeSgpXG4gICAgICAgICAgICAub2Zmc2V0KHVuZGVmaW5lZClcbiAgICAgICAgICAgIC5saW1pdCh1bmRlZmluZWQpXG4gICAgICAgICAgICAuc2tpcCh1bmRlZmluZWQpXG4gICAgICAgICAgICAudGFrZSh1bmRlZmluZWQpXG4gICAgICAgICAgICAuc2VsZWN0KGNvdW50U3FsLCBcImNudFwiKVxuICAgICAgICAgICAgLnNldE9wdGlvbihcImRpc2FibGUtZ2xvYmFsLW9yZGVyXCIpXG4gICAgICAgICAgICAubG9hZFJhd1Jlc3VsdHMocXVlcnlSdW5uZXIpXG5cbiAgICAgICAgaWYgKCFyZXN1bHRzIHx8ICFyZXN1bHRzWzBdIHx8ICFyZXN1bHRzWzBdW1wiY250XCJdKSByZXR1cm4gMFxuXG4gICAgICAgIHJldHVybiBwYXJzZUludChyZXN1bHRzWzBdW1wiY250XCJdKVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBhcHBseUZpbmRPcHRpb25zKCkge1xuXG5cblxuICAgICAgICBpZiAodGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcyEubWV0YWRhdGEpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZpbmRPcHRpb25zLnJlbGF0aW9uTG9hZFN0cmF0ZWd5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLnJlbGF0aW9uTG9hZFN0cmF0ZWd5ID1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maW5kT3B0aW9ucy5yZWxhdGlvbkxvYWRTdHJhdGVneVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5maW5kT3B0aW9ucy5jb21tZW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb21tZW50KHRoaXMuZmluZE9wdGlvbnMuY29tbWVudClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuZmluZE9wdGlvbnMud2l0aERlbGV0ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLndpdGhEZWxldGVkKClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuZmluZE9wdGlvbnMuc2VsZWN0KSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ID0gQXJyYXkuaXNBcnJheSh0aGlzLmZpbmRPcHRpb25zLnNlbGVjdClcbiAgICAgICAgICAgICAgICAgICAgPyBPcm1VdGlscy5wcm9wZXJ0eVBhdGhzVG9UcnV0aHlPYmplY3QoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmluZE9wdGlvbnMuc2VsZWN0IGFzIHN0cmluZ1tdLFxuICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgOiB0aGlzLmZpbmRPcHRpb25zLnNlbGVjdFxuXG4gICAgICAgICAgICAgICAgdGhpcy5idWlsZFNlbGVjdChcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0LFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzIS5tZXRhZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcyEubmFtZSxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3QodGhpcy5zZWxlY3RzKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnNlbGVjdHMgPSBbXVxuICAgICAgICAgICAgaWYgKHRoaXMuZmluZE9wdGlvbnMucmVsYXRpb25zKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVsYXRpb25zID0gQXJyYXkuaXNBcnJheSh0aGlzLmZpbmRPcHRpb25zLnJlbGF0aW9ucylcbiAgICAgICAgICAgICAgICAgICAgPyBPcm1VdGlscy5wcm9wZXJ0eVBhdGhzVG9UcnV0aHlPYmplY3QoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmluZE9wdGlvbnMucmVsYXRpb25zLFxuICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgOiB0aGlzLmZpbmRPcHRpb25zLnJlbGF0aW9uc1xuXG4gICAgICAgICAgICAgICAgdGhpcy5idWlsZFJlbGF0aW9ucyhcbiAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25zLFxuICAgICAgICAgICAgICAgICAgICB0eXBlb2YgdGhpcy5maW5kT3B0aW9ucy5zZWxlY3QgPT09IFwib2JqZWN0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgID8gKHRoaXMuZmluZE9wdGlvbnMuc2VsZWN0IGFzIEZpbmRPcHRpb25zU2VsZWN0PGFueT4pXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcyEubWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMhLm5hbWUsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maW5kT3B0aW9ucy5sb2FkRWFnZXJSZWxhdGlvbnMgIT09IGZhbHNlICYmXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5yZWxhdGlvbkxvYWRTdHJhdGVneSA9PT0gXCJqb2luXCJcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5idWlsZEVhZ2VyUmVsYXRpb25zKFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25zLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHRoaXMuZmluZE9wdGlvbnMuc2VsZWN0ID09PSBcIm9iamVjdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAodGhpcy5maW5kT3B0aW9uc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZWxlY3QgYXMgRmluZE9wdGlvbnNTZWxlY3Q8YW55PilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMhLm1ldGFkYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcyEubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRTZWxlY3QodGhpcy5zZWxlY3RzKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5maW5kT3B0aW9ucy53aGVyZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29uZGl0aW9ucyA9IHRoaXMuYnVpbGRXaGVyZShcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maW5kT3B0aW9ucy53aGVyZSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcyEubWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMhLm5hbWUsXG4gICAgICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY29uZGl0aW9ucy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYW5kV2hlcmUoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmRpdGlvbnMuc3Vic3RyKDAsIDEpICE9PSBcIihcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gXCIoXCIgKyB0aGlzLmNvbmRpdGlvbnMgKyBcIilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdGhpcy5jb25kaXRpb25zLFxuICAgICAgICAgICAgICAgICAgICApIC8vIHRlbXBvcmFyeSBhbmQgd2hlcmUgYW5kIGJyYWNlc1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5maW5kT3B0aW9ucy5vcmRlcikge1xuICAgICAgICAgICAgICAgIHRoaXMuYnVpbGRPcmRlcihcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maW5kT3B0aW9ucy5vcmRlcixcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcyEubWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMhLm5hbWUsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgIGlmICh0aGlzLmpvaW5zLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMuam9pbnMuZm9yRWFjaCgoam9pbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoam9pbi5zZWxlY3QgJiYgIWpvaW4uc2VsZWN0aW9uKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqb2luLnR5cGUgPT09IFwiaW5uZXJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5uZXJKb2luQW5kU2VsZWN0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgJHtqb2luLnBhcmVudEFsaWFzfS4ke2pvaW4ucmVsYXRpb25NZXRhZGF0YS5wcm9wZXJ0eVBhdGh9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam9pbi5hbGlhcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGVmdEpvaW5BbmRTZWxlY3QoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAke2pvaW4ucGFyZW50QWxpYXN9LiR7am9pbi5yZWxhdGlvbk1ldGFkYXRhLnByb3BlcnR5UGF0aH1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2luLmFsaWFzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpvaW4udHlwZSA9PT0gXCJpbm5lclwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbm5lckpvaW4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAke2pvaW4ucGFyZW50QWxpYXN9LiR7am9pbi5yZWxhdGlvbk1ldGFkYXRhLnByb3BlcnR5UGF0aH1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2luLmFsaWFzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sZWZ0Sm9pbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYCR7am9pbi5wYXJlbnRBbGlhc30uJHtqb2luLnJlbGF0aW9uTWV0YWRhdGEucHJvcGVydHlQYXRofWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvaW4uYWxpYXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cblxuXG5cblxuXG5cblxuXG5cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuXG5cblxuXG5cblxuICAgICAgICAgICAgaWYgKHRoaXMuZmluZE9wdGlvbnMuc2tpcCAhPT0gdW5kZWZpbmVkKSB7XG5cblxuXG4gICAgICAgICAgICAgICAgdGhpcy5za2lwKHRoaXMuZmluZE9wdGlvbnMuc2tpcClcblxuICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgIGlmICh0aGlzLmZpbmRPcHRpb25zLnRha2UgIT09IHVuZGVmaW5lZCkge1xuXG5cblxuICAgICAgICAgICAgICAgIHRoaXMudGFrZSh0aGlzLmZpbmRPcHRpb25zLnRha2UpXG5cbiAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuZmluZE9wdGlvbnMuY2FjaGUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNhY2hlKHRoaXMuZmluZE9wdGlvbnMuY2FjaGUpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzLmZpbmRPcHRpb25zLmNhY2hlID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICAgICAgICAgIHRoaXMuY2FjaGUodGhpcy5maW5kT3B0aW9ucy5jYWNoZSlcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMuZmluZE9wdGlvbnMuY2FjaGUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNhY2hlKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbmRPcHRpb25zLmNhY2hlLmlkLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbmRPcHRpb25zLmNhY2hlLm1pbGxpc2Vjb25kcyxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmZpbmRPcHRpb25zLmpvaW4pIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5maW5kT3B0aW9ucy5qb2luLmxlZnRKb2luKVxuICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyh0aGlzLmZpbmRPcHRpb25zLmpvaW4ubGVmdEpvaW4pLmZvckVhY2goXG4gICAgICAgICAgICAgICAgICAgICAgICAoa2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sZWZ0Sm9pbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maW5kT3B0aW9ucy5qb2luIS5sZWZ0Sm9pbiFba2V5XSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIClcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpbmRPcHRpb25zLmpvaW4uaW5uZXJKb2luKVxuICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyh0aGlzLmZpbmRPcHRpb25zLmpvaW4uaW5uZXJKb2luKS5mb3JFYWNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgKGtleSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5uZXJKb2luKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbmRPcHRpb25zLmpvaW4hLmlubmVySm9pbiFba2V5XSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIClcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpbmRPcHRpb25zLmpvaW4ubGVmdEpvaW5BbmRTZWxlY3QpXG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maW5kT3B0aW9ucy5qb2luLmxlZnRKb2luQW5kU2VsZWN0LFxuICAgICAgICAgICAgICAgICAgICApLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sZWZ0Sm9pbkFuZFNlbGVjdChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbmRPcHRpb25zLmpvaW4hLmxlZnRKb2luQW5kU2VsZWN0IVtrZXldLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmZpbmRPcHRpb25zLmpvaW4uaW5uZXJKb2luQW5kU2VsZWN0KVxuICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmluZE9wdGlvbnMuam9pbi5pbm5lckpvaW5BbmRTZWxlY3QsXG4gICAgICAgICAgICAgICAgICAgICkuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlubmVySm9pbkFuZFNlbGVjdChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbmRPcHRpb25zLmpvaW4hLmlubmVySm9pbkFuZFNlbGVjdCFba2V5XSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmZpbmRPcHRpb25zLmxvY2spIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5maW5kT3B0aW9ucy5sb2NrLm1vZGUgPT09IFwib3B0aW1pc3RpY1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0TG9jayhcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmluZE9wdGlvbnMubG9jay5tb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maW5kT3B0aW9ucy5sb2NrLnZlcnNpb24sXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbmRPcHRpb25zLmxvY2subW9kZSA9PT0gXCJwZXNzaW1pc3RpY19yZWFkXCIgfHxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maW5kT3B0aW9ucy5sb2NrLm1vZGUgPT09IFwicGVzc2ltaXN0aWNfd3JpdGVcIiB8fFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbmRPcHRpb25zLmxvY2subW9kZSA9PT0gXCJkaXJ0eV9yZWFkXCIgfHxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maW5kT3B0aW9ucy5sb2NrLm1vZGUgPT09XG4gICAgICAgICAgICAgICAgICAgICAgICBcInBlc3NpbWlzdGljX3BhcnRpYWxfd3JpdGVcIiB8fFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbmRPcHRpb25zLmxvY2subW9kZSA9PT1cbiAgICAgICAgICAgICAgICAgICAgICAgIFwicGVzc2ltaXN0aWNfd3JpdGVfb3JfZmFpbFwiIHx8XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmluZE9wdGlvbnMubG9jay5tb2RlID09PSBcImZvcl9ub19rZXlfdXBkYXRlXCIgfHxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maW5kT3B0aW9ucy5sb2NrLm1vZGUgPT09IFwiZm9yX2tleV9zaGFyZVwiXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhYmxlTmFtZXMgPSB0aGlzLmZpbmRPcHRpb25zLmxvY2sudGFibGVzXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHRoaXMuZmluZE9wdGlvbnMubG9jay50YWJsZXMubWFwKCh0YWJsZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFibGVBbGlhcyA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmFsaWFzZXMuZmluZCgoYWxpYXMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzLm1ldGFkYXRhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRhYmxlTmFtZVdpdGhvdXRQcmVmaXggPT09IHRhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YWJsZUFsaWFzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYFwiJHt0YWJsZX1cIiBpcyBub3QgcGFydCBvZiB0aGlzIHF1ZXJ5YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5lc2NhcGUodGFibGVBbGlhcy5uYW1lKVxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRMb2NrKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maW5kT3B0aW9ucy5sb2NrLm1vZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZU5hbWVzLFxuICAgICAgICAgICAgICAgICAgICApXG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZmluZE9wdGlvbnMubG9jay5vbkxvY2tlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRPbkxvY2tlZCh0aGlzLmZpbmRPcHRpb25zLmxvY2sub25Mb2NrZWQpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmZpbmRPcHRpb25zLmxvYWRSZWxhdGlvbklkcyA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZEFsbFJlbGF0aW9uSWRzKClcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMuZmluZE9wdGlvbnMubG9hZFJlbGF0aW9uSWRzID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkQWxsUmVsYXRpb25JZHModGhpcy5maW5kT3B0aW9ucy5sb2FkUmVsYXRpb25JZHMgYXMgYW55KVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5maW5kT3B0aW9ucy5sb2FkRWFnZXJSZWxhdGlvbnMgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgRmluZE9wdGlvbnNVdGlscy5qb2luRWFnZXJSZWxhdGlvbnMoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMhLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5tYWluQWxpYXMhLm1ldGFkYXRhLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuZmluZE9wdGlvbnMudHJhbnNhY3Rpb24gPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAudXNlVHJhbnNhY3Rpb24gPSB0cnVlXG4gICAgICAgICAgICB9XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGVzIHNxbCBnZW5lcmF0ZWQgYnkgcXVlcnkgYnVpbGRlciBhbmQgcmV0dXJucyBvYmplY3Qgd2l0aCByYXcgcmVzdWx0cyBhbmQgZW50aXRpZXMgY3JlYXRlZCBmcm9tIHRoZW0uXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGFzeW5jIGV4ZWN1dGVFbnRpdGllc0FuZFJhd1Jlc3VsdHMoXG4gICAgICAgIHF1ZXJ5UnVubmVyOiBRdWVyeVJ1bm5lcixcbiAgICApOiBQcm9taXNlPHsgZW50aXRpZXM6IEVudGl0eVtdOyByYXc6IGFueVtdIH0+IHtcbiAgICAgICAgaWYgKCF0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcbiAgICAgICAgICAgICAgICBgQWxpYXMgaXMgbm90IHNldC4gVXNlIFwiZnJvbVwiIG1ldGhvZCB0byBzZXQgYW4gYWxpYXMuYCxcbiAgICAgICAgICAgIClcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICAodGhpcy5leHByZXNzaW9uTWFwLmxvY2tNb2RlID09PSBcInBlc3NpbWlzdGljX3JlYWRcIiB8fFxuICAgICAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5sb2NrTW9kZSA9PT0gXCJwZXNzaW1pc3RpY193cml0ZVwiIHx8XG4gICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmxvY2tNb2RlID09PSBcInBlc3NpbWlzdGljX3BhcnRpYWxfd3JpdGVcIiB8fFxuICAgICAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5sb2NrTW9kZSA9PT0gXCJwZXNzaW1pc3RpY193cml0ZV9vcl9mYWlsXCIgfHxcbiAgICAgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAubG9ja01vZGUgPT09IFwiZm9yX25vX2tleV91cGRhdGVcIiB8fFxuICAgICAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5sb2NrTW9kZSA9PT0gXCJmb3Jfa2V5X3NoYXJlXCIpICYmXG4gICAgICAgICAgICAhcXVlcnlSdW5uZXIuaXNUcmFuc2FjdGlvbkFjdGl2ZVxuICAgICAgICApXG4gICAgICAgICAgICB0aHJvdyBuZXcgUGVzc2ltaXN0aWNMb2NrVHJhbnNhY3Rpb25SZXF1aXJlZEVycm9yKClcblxuICAgICAgICBpZiAodGhpcy5leHByZXNzaW9uTWFwLmxvY2tNb2RlID09PSBcIm9wdGltaXN0aWNcIikge1xuICAgICAgICAgICAgY29uc3QgbWV0YWRhdGEgPSB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLm1ldGFkYXRhXG4gICAgICAgICAgICBpZiAoIW1ldGFkYXRhLnZlcnNpb25Db2x1bW4gJiYgIW1ldGFkYXRhLnVwZGF0ZURhdGVDb2x1bW4pXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vVmVyc2lvbk9yVXBkYXRlRGF0ZUNvbHVtbkVycm9yKG1ldGFkYXRhLm5hbWUpXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZWxhdGlvbklkTG9hZGVyID0gbmV3IFJlbGF0aW9uSWRMb2FkZXIoXG4gICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24sXG4gICAgICAgICAgICBxdWVyeVJ1bm5lcixcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5yZWxhdGlvbklkQXR0cmlidXRlcyxcbiAgICAgICAgKVxuICAgICAgICBjb25zdCByZWxhdGlvbkNvdW50TG9hZGVyID0gbmV3IFJlbGF0aW9uQ291bnRMb2FkZXIoXG4gICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24sXG4gICAgICAgICAgICBxdWVyeVJ1bm5lcixcbiAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5yZWxhdGlvbkNvdW50QXR0cmlidXRlcyxcbiAgICAgICAgKVxuICAgICAgICBjb25zdCByZWxhdGlvbklkTWV0YWRhdGFUcmFuc2Zvcm1lciA9XG4gICAgICAgICAgICBuZXcgUmVsYXRpb25JZE1ldGFkYXRhVG9BdHRyaWJ1dGVUcmFuc2Zvcm1lcih0aGlzLmV4cHJlc3Npb25NYXApXG4gICAgICAgIHJlbGF0aW9uSWRNZXRhZGF0YVRyYW5zZm9ybWVyLnRyYW5zZm9ybSgpXG4gICAgICAgIGNvbnN0IHJlbGF0aW9uQ291bnRNZXRhZGF0YVRyYW5zZm9ybWVyID1cbiAgICAgICAgICAgIG5ldyBSZWxhdGlvbkNvdW50TWV0YWRhdGFUb0F0dHJpYnV0ZVRyYW5zZm9ybWVyKHRoaXMuZXhwcmVzc2lvbk1hcClcbiAgICAgICAgcmVsYXRpb25Db3VudE1ldGFkYXRhVHJhbnNmb3JtZXIudHJhbnNmb3JtKClcblxuICAgICAgICBsZXQgcmF3UmVzdWx0czogYW55W10gPSBbXSxcbiAgICAgICAgICAgIGVudGl0aWVzOiBhbnlbXSA9IFtdXG5cblxuXG5cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICAodGhpcy5leHByZXNzaW9uTWFwLnNraXAgfHwgdGhpcy5leHByZXNzaW9uTWFwLnRha2UpICYmXG4gICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAuam9pbkF0dHJpYnV0ZXMubGVuZ3RoID4gMFxuICAgICAgICApIHtcblxuXG4gICAgICAgICAgICBjb25zdCBbc2VsZWN0cywgb3JkZXJCeXNdID1cbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZU9yZGVyQnlDb21iaW5lZFdpdGhTZWxlY3RFeHByZXNzaW9uKFwiZGlzdGluY3RBbGlhc1wiKVxuICAgICAgICAgICAgY29uc3QgbWV0YWRhdGEgPSB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLm1ldGFkYXRhXG4gICAgICAgICAgICBjb25zdCBtYWluQWxpYXNOYW1lID0gdGhpcy5leHByZXNzaW9uTWFwLm1haW5BbGlhcy5uYW1lXG5cbiAgICAgICAgICAgIGNvbnN0IHF1ZXJ5U2VsZWN0cyA9IG1ldGFkYXRhLnByaW1hcnlDb2x1bW5zLm1hcChcbiAgICAgICAgICAgICAgICAocHJpbWFyeUNvbHVtbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkaXN0aW5jdEFsaWFzID0gdGhpcy5lc2NhcGUoXCJkaXN0aW5jdEFsaWFzXCIpXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbHVtbkFsaWFzID0gdGhpcy5lc2NhcGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBEcml2ZXJVdGlscy5idWlsZEFsaWFzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbi5kcml2ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFpbkFsaWFzTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5Q29sdW1uLmRhdGFiYXNlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFvcmRlckJ5c1tjb2x1bW5BbGlhc10pXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyQnlzW2NvbHVtbkFsaWFzXSA9IFwiQVNDXCJcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBhbGlhcyA9IERyaXZlclV0aWxzLmJ1aWxkQWxpYXMoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJpZHNfXCIgKyBtYWluQWxpYXNOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeUNvbHVtbi5kYXRhYmFzZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgIClcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7ZGlzdGluY3RBbGlhc30uJHtjb2x1bW5BbGlhc30gQVMgJHt0aGlzLmVzY2FwZShcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzLFxuICAgICAgICAgICAgICAgICAgICApfWBcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICByYXdSZXN1bHRzID0gYXdhaXQgbmV3IFNlbGVjdFF1ZXJ5QnVpbGRlcihcbiAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24sXG4gICAgICAgICAgICAgICAgcXVlcnlSdW5uZXIsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLnNlbGVjdChgRElTVElOQ1QgJHtxdWVyeVNlbGVjdHMuam9pbihcIiwgXCIpfWApXG4gICAgICAgICAgICAgICAgLmFkZFNlbGVjdChzZWxlY3RzKVxuICAgICAgICAgICAgICAgIC5mcm9tKGAoJHt0aGlzLmNsb25lKCkub3JkZXJCeSgpLmdldFF1ZXJ5KCl9KWAsIFwiZGlzdGluY3RBbGlhc1wiKVxuICAgICAgICAgICAgICAgIC5vZmZzZXQodGhpcy5leHByZXNzaW9uTWFwLnNraXApXG4gICAgICAgICAgICAgICAgLmxpbWl0KHRoaXMuZXhwcmVzc2lvbk1hcC50YWtlKVxuICAgICAgICAgICAgICAgIC5vcmRlckJ5KG9yZGVyQnlzKVxuICAgICAgICAgICAgICAgIC5jYWNoZShcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmNhY2hlXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHRoaXMuZXhwcmVzc2lvbk1hcC5jYWNoZVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLmV4cHJlc3Npb25NYXAuY2FjaGVJZCxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmNhY2hlRHVyYXRpb24sXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC5zZXRQYXJhbWV0ZXJzKHRoaXMuZ2V0UGFyYW1ldGVycygpKVxuICAgICAgICAgICAgICAgIC5zZXROYXRpdmVQYXJhbWV0ZXJzKHRoaXMuZXhwcmVzc2lvbk1hcC5uYXRpdmVQYXJhbWV0ZXJzKVxuICAgICAgICAgICAgICAgIC5nZXRSYXdNYW55KClcblxuICAgICAgICAgICAgaWYgKHJhd1Jlc3VsdHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCBjb25kaXRpb24gPSBcIlwiXG4gICAgICAgICAgICAgICAgY29uc3QgcGFyYW1ldGVyczogT2JqZWN0TGl0ZXJhbCA9IHt9XG4gICAgICAgICAgICAgICAgaWYgKG1ldGFkYXRhLmhhc011bHRpcGxlUHJpbWFyeUtleXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uID0gcmF3UmVzdWx0c1xuICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgocmVzdWx0LCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtZXRhZGF0YS5wcmltYXJ5Q29sdW1uc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKChwcmltYXJ5Q29sdW1uKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJhbUtleSA9IGBvcm1fZGlzdGluY3RfaWRzXyR7aW5kZXh9XyR7cHJpbWFyeUNvbHVtbi5kYXRhYmFzZU5hbWV9YFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyc1twYXJhbUtleV0gPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGlkc18ke21haW5BbGlhc05hbWV9XyR7cHJpbWFyeUNvbHVtbi5kYXRhYmFzZU5hbWV9YFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgJHttYWluQWxpYXNOYW1lfS4ke3ByaW1hcnlDb2x1bW4ucHJvcGVydHlQYXRofT06JHtwYXJhbUtleX1gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5qb2luKFwiIEFORCBcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAuam9pbihcIiBPUiBcIilcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhbGlhcyA9IERyaXZlclV0aWxzLmJ1aWxkQWxpYXMoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJpZHNfXCIgKyBtYWluQWxpYXNOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEucHJpbWFyeUNvbHVtbnNbMF0uZGF0YWJhc2VOYW1lLFxuICAgICAgICAgICAgICAgICAgICApXG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaWRzID0gcmF3UmVzdWx0cy5tYXAoKHJlc3VsdCkgPT4gcmVzdWx0W2FsaWFzXSlcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJlQWxsTnVtYmVycyA9IGlkcy5ldmVyeShcbiAgICAgICAgICAgICAgICAgICAgICAgIChpZDogYW55KSA9PiB0eXBlb2YgaWQgPT09IFwibnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFyZUFsbE51bWJlcnMpIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uID0gYCR7bWFpbkFsaWFzTmFtZX0uJHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YS5wcmltYXJ5Q29sdW1uc1swXS5wcm9wZXJ0eVBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gSU4gKCR7aWRzLmpvaW4oXCIsIFwiKX0pYFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyc1tcIm9ybV9kaXN0aW5jdF9pZHNcIl0gPSBpZHNcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbiA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFpbkFsaWFzTmFtZSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIuXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLnByaW1hcnlDb2x1bW5zWzBdLnByb3BlcnR5UGF0aCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIgSU4gKDouLi5vcm1fZGlzdGluY3RfaWRzKVwiXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmF3UmVzdWx0cyA9IGF3YWl0IHRoaXMuY2xvbmUoKVxuICAgICAgICAgICAgICAgICAgICAubWVyZ2VFeHByZXNzaW9uTWFwKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhQXBwZW5kZWRBbmRXaGVyZUNvbmRpdGlvbjogY29uZGl0aW9uLFxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAuc2V0UGFyYW1ldGVycyhwYXJhbWV0ZXJzKVxuICAgICAgICAgICAgICAgICAgICAubG9hZFJhd1Jlc3VsdHMocXVlcnlSdW5uZXIpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByYXdSZXN1bHRzID0gYXdhaXQgdGhpcy5sb2FkUmF3UmVzdWx0cyhxdWVyeVJ1bm5lcilcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyYXdSZXN1bHRzLmxlbmd0aCA+IDApIHtcblxuICAgICAgICAgICAgY29uc3QgcmF3UmVsYXRpb25JZFJlc3VsdHMgPSBhd2FpdCByZWxhdGlvbklkTG9hZGVyLmxvYWQocmF3UmVzdWx0cylcbiAgICAgICAgICAgIGNvbnN0IHJhd1JlbGF0aW9uQ291bnRSZXN1bHRzID0gYXdhaXQgcmVsYXRpb25Db3VudExvYWRlci5sb2FkKFxuICAgICAgICAgICAgICAgIHJhd1Jlc3VsdHMsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBjb25zdCB0cmFuc2Zvcm1lciA9IG5ldyBSYXdTcWxSZXN1bHRzVG9FbnRpdHlUcmFuc2Zvcm1lcihcbiAgICAgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAsXG4gICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uLmRyaXZlcixcbiAgICAgICAgICAgICAgICByYXdSZWxhdGlvbklkUmVzdWx0cyxcbiAgICAgICAgICAgICAgICByYXdSZWxhdGlvbkNvdW50UmVzdWx0cyxcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXJ5UnVubmVyLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgZW50aXRpZXMgPSB0cmFuc2Zvcm1lci50cmFuc2Zvcm0oXG4gICAgICAgICAgICAgICAgcmF3UmVzdWx0cyxcbiAgICAgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzISxcbiAgICAgICAgICAgIClcblxuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmNhbGxMaXN0ZW5lcnMgPT09IHRydWUgJiZcbiAgICAgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLmhhc01ldGFkYXRhXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBxdWVyeVJ1bm5lci5icm9hZGNhc3Rlci5icm9hZGNhc3QoXG4gICAgICAgICAgICAgICAgICAgIFwiTG9hZFwiLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cHJlc3Npb25NYXAubWFpbkFsaWFzLm1ldGFkYXRhLFxuICAgICAgICAgICAgICAgICAgICBlbnRpdGllcyxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5leHByZXNzaW9uTWFwLnJlbGF0aW9uTG9hZFN0cmF0ZWd5ID09PSBcInF1ZXJ5XCIpIHtcbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgICAgICAgIHRoaXMucmVsYXRpb25NZXRhZGF0YXMubWFwKGFzeW5jIChyZWxhdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZWxhdGlvblRhcmdldCA9IHJlbGF0aW9uLmludmVyc2VFbnRpdHlNZXRhZGF0YS50YXJnZXRcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVsYXRpb25BbGlhcyA9XG4gICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbi5pbnZlcnNlRW50aXR5TWV0YWRhdGEudGFyZ2V0TmFtZVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdCA9IEFycmF5LmlzQXJyYXkodGhpcy5maW5kT3B0aW9ucy5zZWxlY3QpXG4gICAgICAgICAgICAgICAgICAgICAgICA/IE9ybVV0aWxzLnByb3BlcnR5UGF0aHNUb1RydXRoeU9iamVjdChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmluZE9wdGlvbnMuc2VsZWN0IGFzIHN0cmluZ1tdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuZmluZE9wdGlvbnMuc2VsZWN0XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlbGF0aW9ucyA9IEFycmF5LmlzQXJyYXkodGhpcy5maW5kT3B0aW9ucy5yZWxhdGlvbnMpXG4gICAgICAgICAgICAgICAgICAgICAgICA/IE9ybVV0aWxzLnByb3BlcnR5UGF0aHNUb1RydXRoeU9iamVjdChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmluZE9wdGlvbnMucmVsYXRpb25zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuZmluZE9wdGlvbnMucmVsYXRpb25zXG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcXVlcnlCdWlsZGVyID0gdGhpcy5jcmVhdGVRdWVyeUJ1aWxkZXIoKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnNlbGVjdChyZWxhdGlvbkFsaWFzKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmZyb20ocmVsYXRpb25UYXJnZXQsIHJlbGF0aW9uQWxpYXMpXG4gICAgICAgICAgICAgICAgICAgICAgICAuc2V0RmluZE9wdGlvbnMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdDogc2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gT3JtVXRpbHMuZGVlcFZhbHVlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uLnByb3BlcnR5UGF0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyOiB0aGlzLmZpbmRPcHRpb25zLm9yZGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gT3JtVXRpbHMuZGVlcFZhbHVlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbmRPcHRpb25zLm9yZGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbi5wcm9wZXJ0eVBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbnM6IHJlbGF0aW9uc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IE9ybVV0aWxzLmRlZXBWYWx1ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbi5wcm9wZXJ0eVBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoRGVsZXRlZDogdGhpcy5maW5kT3B0aW9ucy53aXRoRGVsZXRlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbkxvYWRTdHJhdGVneTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maW5kT3B0aW9ucy5yZWxhdGlvbkxvYWRTdHJhdGVneSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIGlmIChlbnRpdGllcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWxhdGVkRW50aXR5R3JvdXBzOiBhbnlbXSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5jb25uZWN0aW9uLnJlbGF0aW9uSWRMb2FkZXIubG9hZE1hbnlUb01hbnlSZWxhdGlvbklkc0FuZEdyb3VwKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50aXRpZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlCdWlsZGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0aWVzLmZvckVhY2goKGVudGl0eSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRFbnRpdHlHcm91cCA9IHJlbGF0ZWRFbnRpdHlHcm91cHMuZmluZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdyb3VwKSA9PiBncm91cC5lbnRpdHkgPT09IGVudGl0eSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlbGF0ZWRFbnRpdHlHcm91cCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGVkRW50aXR5R3JvdXAucmVsYXRlZCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiByZWxhdGVkRW50aXR5R3JvdXAucmVsYXRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbi5zZXRFbnRpdHlWYWx1ZShlbnRpdHksIHZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIClcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByYXc6IHJhd1Jlc3VsdHMsXG4gICAgICAgICAgICBlbnRpdGllczogZW50aXRpZXMsXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgY3JlYXRlT3JkZXJCeUNvbWJpbmVkV2l0aFNlbGVjdEV4cHJlc3Npb24oXG4gICAgICAgIHBhcmVudEFsaWFzOiBzdHJpbmcsXG4gICAgKTogW3N0cmluZywgT3JkZXJCeUNvbmRpdGlvbl0ge1xuXG4gICAgICAgIGNvbnN0IG9yZGVyQnlzID0gdGhpcy5leHByZXNzaW9uTWFwLmFsbE9yZGVyQnlzXG4gICAgICAgIGNvbnN0IHNlbGVjdFN0cmluZyA9IE9iamVjdC5rZXlzKG9yZGVyQnlzKVxuICAgICAgICAgICAgLm1hcCgob3JkZXJDcml0ZXJpYSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChvcmRlckNyaXRlcmlhLmluZGV4T2YoXCIuXCIpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjcml0ZXJpYVBhcnRzID0gb3JkZXJDcml0ZXJpYS5zcGxpdChcIi5cIilcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWxpYXNOYW1lID0gY3JpdGVyaWFQYXJ0c1swXVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9wZXJ0eVBhdGggPSBjcml0ZXJpYVBhcnRzLnNsaWNlKDEpLmpvaW4oXCIuXCIpXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFsaWFzID0gdGhpcy5leHByZXNzaW9uTWFwLmZpbmRBbGlhc0J5TmFtZShhbGlhc05hbWUpXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbHVtbiA9XG4gICAgICAgICAgICAgICAgICAgICAgICBhbGlhcy5tZXRhZGF0YS5maW5kQ29sdW1uV2l0aFByb3BlcnR5UGF0aChwcm9wZXJ0eVBhdGgpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVzY2FwZShwYXJlbnRBbGlhcykgK1xuICAgICAgICAgICAgICAgICAgICAgICAgXCIuXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lc2NhcGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJpdmVyVXRpbHMuYnVpbGRBbGlhcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uLmRyaXZlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXNOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4hLmRhdGFiYXNlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLnNlbGVjdHMuZmluZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Quc2VsZWN0aW9uID09PSBvcmRlckNyaXRlcmlhIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdC5hbGlhc05hbWUgPT09IG9yZGVyQ3JpdGVyaWEsXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmVzY2FwZShwYXJlbnRBbGlhcykgKyBcIi5cIiArIG9yZGVyQ3JpdGVyaWFcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuam9pbihcIiwgXCIpXG5cbiAgICAgICAgY29uc3Qgb3JkZXJCeU9iamVjdDogT3JkZXJCeUNvbmRpdGlvbiA9IHt9XG4gICAgICAgIE9iamVjdC5rZXlzKG9yZGVyQnlzKS5mb3JFYWNoKChvcmRlckNyaXRlcmlhKSA9PiB7XG4gICAgICAgICAgICBpZiAob3JkZXJDcml0ZXJpYS5pbmRleE9mKFwiLlwiKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjcml0ZXJpYVBhcnRzID0gb3JkZXJDcml0ZXJpYS5zcGxpdChcIi5cIilcbiAgICAgICAgICAgICAgICBjb25zdCBhbGlhc05hbWUgPSBjcml0ZXJpYVBhcnRzWzBdXG4gICAgICAgICAgICAgICAgY29uc3QgcHJvcGVydHlQYXRoID0gY3JpdGVyaWFQYXJ0cy5zbGljZSgxKS5qb2luKFwiLlwiKVxuICAgICAgICAgICAgICAgIGNvbnN0IGFsaWFzID0gdGhpcy5leHByZXNzaW9uTWFwLmZpbmRBbGlhc0J5TmFtZShhbGlhc05hbWUpXG4gICAgICAgICAgICAgICAgY29uc3QgY29sdW1uID1cbiAgICAgICAgICAgICAgICAgICAgYWxpYXMubWV0YWRhdGEuZmluZENvbHVtbldpdGhQcm9wZXJ0eVBhdGgocHJvcGVydHlQYXRoKVxuICAgICAgICAgICAgICAgIG9yZGVyQnlPYmplY3RbXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXNjYXBlKHBhcmVudEFsaWFzKSArXG4gICAgICAgICAgICAgICAgICAgICAgICBcIi5cIiArXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVzY2FwZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcml2ZXJVdGlscy5idWlsZEFsaWFzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlhc05hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbiEuZGF0YWJhc2VOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgXSA9IG9yZGVyQnlzW29yZGVyQ3JpdGVyaWFdXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLnNlbGVjdHMuZmluZChcbiAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3QpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0LnNlbGVjdGlvbiA9PT0gb3JkZXJDcml0ZXJpYSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdC5hbGlhc05hbWUgPT09IG9yZGVyQ3JpdGVyaWEsXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgb3JkZXJCeU9iamVjdFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXNjYXBlKHBhcmVudEFsaWFzKSArIFwiLlwiICsgb3JkZXJDcml0ZXJpYVxuICAgICAgICAgICAgICAgICAgICBdID0gb3JkZXJCeXNbb3JkZXJDcml0ZXJpYV1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBvcmRlckJ5T2JqZWN0W29yZGVyQ3JpdGVyaWFdID0gb3JkZXJCeXNbb3JkZXJDcml0ZXJpYV1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuIFtzZWxlY3RTdHJpbmcsIG9yZGVyQnlPYmplY3RdXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZHMgcmF3IHJlc3VsdHMgZnJvbSB0aGUgZGF0YWJhc2UuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGFzeW5jIGxvYWRSYXdSZXN1bHRzKHF1ZXJ5UnVubmVyOiBRdWVyeVJ1bm5lcikge1xuICAgICAgICBjb25zdCBbc3FsLCBwYXJhbWV0ZXJzXSA9IHRoaXMuZ2V0UXVlcnlBbmRQYXJhbWV0ZXJzKClcbiAgICAgICAgY29uc3QgcXVlcnlJZCA9IHNxbCArIFwiIC0tIFBBUkFNRVRFUlM6IFwiICsgSlNPTi5zdHJpbmdpZnkocGFyYW1ldGVycylcbiAgICAgICAgY29uc3QgY2FjaGVPcHRpb25zID1cbiAgICAgICAgICAgIHR5cGVvZiB0aGlzLmNvbm5lY3Rpb24ub3B0aW9ucy5jYWNoZSA9PT0gXCJvYmplY3RcIlxuICAgICAgICAgICAgICAgID8gdGhpcy5jb25uZWN0aW9uLm9wdGlvbnMuY2FjaGVcbiAgICAgICAgICAgICAgICA6IHt9XG4gICAgICAgIGxldCBzYXZlZFF1ZXJ5UmVzdWx0Q2FjaGVPcHRpb25zOiBRdWVyeVJlc3VsdENhY2hlT3B0aW9ucyB8IHVuZGVmaW5lZCA9XG4gICAgICAgICAgICB1bmRlZmluZWRcbiAgICAgICAgbGV0IGNhY2hlRXJyb3IgPSBmYWxzZVxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24ucXVlcnlSZXN1bHRDYWNoZSAmJlxuICAgICAgICAgICAgKHRoaXMuZXhwcmVzc2lvbk1hcC5jYWNoZSB8fCBjYWNoZU9wdGlvbnMuYWx3YXlzRW5hYmxlZClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHNhdmVkUXVlcnlSZXN1bHRDYWNoZU9wdGlvbnMgPVxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmNvbm5lY3Rpb24ucXVlcnlSZXN1bHRDYWNoZS5nZXRGcm9tQ2FjaGUoXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllcjogdGhpcy5leHByZXNzaW9uTWFwLmNhY2hlSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnk6IHF1ZXJ5SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwcmVzc2lvbk1hcC5jYWNoZUR1cmF0aW9uIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlT3B0aW9ucy5kdXJhdGlvbiB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UnVubmVyLFxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBzYXZlZFF1ZXJ5UmVzdWx0Q2FjaGVPcHRpb25zICYmXG4gICAgICAgICAgICAgICAgICAgICF0aGlzLmNvbm5lY3Rpb24ucXVlcnlSZXN1bHRDYWNoZS5pc0V4cGlyZWQoXG4gICAgICAgICAgICAgICAgICAgICAgICBzYXZlZFF1ZXJ5UmVzdWx0Q2FjaGVPcHRpb25zLFxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKHNhdmVkUXVlcnlSZXN1bHRDYWNoZU9wdGlvbnMucmVzdWx0KVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjYWNoZU9wdGlvbnMuaWdub3JlRXJyb3JzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhY2hlRXJyb3IgPSB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgcXVlcnlSdW5uZXIucXVlcnkoc3FsLCBwYXJhbWV0ZXJzLCB0cnVlKVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgICFjYWNoZUVycm9yICYmXG4gICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24ucXVlcnlSZXN1bHRDYWNoZSAmJlxuICAgICAgICAgICAgKHRoaXMuZXhwcmVzc2lvbk1hcC5jYWNoZSB8fCBjYWNoZU9wdGlvbnMuYWx3YXlzRW5hYmxlZClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuY29ubmVjdGlvbi5xdWVyeVJlc3VsdENhY2hlLnN0b3JlSW5DYWNoZShcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllcjogdGhpcy5leHByZXNzaW9uTWFwLmNhY2hlSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVyeTogcXVlcnlJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpbWU6IG5ldyBEYXRlKCkuZ2V0VGltZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLmNhY2hlRHVyYXRpb24gfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZU9wdGlvbnMuZHVyYXRpb24gfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0OiBKU09OLnN0cmluZ2lmeShyZXN1bHRzLnJlY29yZHMpLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBzYXZlZFF1ZXJ5UmVzdWx0Q2FjaGVPcHRpb25zLFxuICAgICAgICAgICAgICAgICAgICBxdWVyeVJ1bm5lcixcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGlmICghY2FjaGVPcHRpb25zLmlnbm9yZUVycm9ycykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHRzLnJlY29yZHNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNZXJnZXMgaW50byBleHByZXNzaW9uIG1hcCBnaXZlbiBleHByZXNzaW9uIG1hcCBwcm9wZXJ0aWVzLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBtZXJnZUV4cHJlc3Npb25NYXAoXG4gICAgICAgIGV4cHJlc3Npb25NYXA6IFBhcnRpYWw8UXVlcnlFeHByZXNzaW9uTWFwPixcbiAgICApOiB0aGlzIHtcbiAgICAgICAgT2JqZWN0VXRpbHMuYXNzaWduKHRoaXMuZXhwcmVzc2lvbk1hcCwgZXhwcmVzc2lvbk1hcClcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOb3JtYWxpemVzIGEgZ2l2ZSBudW1iZXIgLSBjb252ZXJ0cyB0byBpbnQgaWYgcG9zc2libGUuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIG5vcm1hbGl6ZU51bWJlcihudW06IGFueSkge1xuICAgICAgICBpZiAodHlwZW9mIG51bSA9PT0gXCJudW1iZXJcIiB8fCBudW0gPT09IHVuZGVmaW5lZCB8fCBudW0gPT09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gbnVtXG5cbiAgICAgICAgcmV0dXJuIE51bWJlcihudW0pXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHF1ZXJ5IGJ1aWxkZXIgdXNlZCB0byBleGVjdXRlIHNxbCBxdWVyaWVzIGluc2lkZSB0aGlzIHF1ZXJ5IGJ1aWxkZXIuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIG9idGFpblF1ZXJ5UnVubmVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5xdWVyeVJ1bm5lciB8fCB0aGlzLmNvbm5lY3Rpb24uY3JlYXRlUXVlcnlSdW5uZXIoXCJzbGF2ZVwiKVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBidWlsZFNlbGVjdChcbiAgICAgICAgc2VsZWN0OiBGaW5kT3B0aW9uc1NlbGVjdDxhbnk+LFxuICAgICAgICBtZXRhZGF0YTogRW50aXR5TWV0YWRhdGEsXG4gICAgICAgIGFsaWFzOiBzdHJpbmcsXG4gICAgICAgIGVtYmVkUHJlZml4Pzogc3RyaW5nLFxuICAgICkge1xuICAgICAgICBmb3IgKGxldCBrZXkgaW4gc2VsZWN0KSB7XG4gICAgICAgICAgICBpZiAoc2VsZWN0W2tleV0gPT09IHVuZGVmaW5lZCB8fCBzZWxlY3Rba2V5XSA9PT0gZmFsc2UpIGNvbnRpbnVlXG5cbiAgICAgICAgICAgIGNvbnN0IHByb3BlcnR5UGF0aCA9IGVtYmVkUHJlZml4ID8gZW1iZWRQcmVmaXggKyBcIi5cIiArIGtleSA6IGtleVxuICAgICAgICAgICAgY29uc3QgY29sdW1uID1cbiAgICAgICAgICAgICAgICBtZXRhZGF0YS5maW5kQ29sdW1uV2l0aFByb3BlcnR5UGF0aFN0cmljdChwcm9wZXJ0eVBhdGgpXG4gICAgICAgICAgICBjb25zdCBlbWJlZCA9IG1ldGFkYXRhLmZpbmRFbWJlZGRlZFdpdGhQcm9wZXJ0eVBhdGgocHJvcGVydHlQYXRoKVxuICAgICAgICAgICAgY29uc3QgcmVsYXRpb24gPSBtZXRhZGF0YS5maW5kUmVsYXRpb25XaXRoUHJvcGVydHlQYXRoKHByb3BlcnR5UGF0aClcblxuICAgICAgICAgICAgaWYgKCFlbWJlZCAmJiAhY29sdW1uICYmICFyZWxhdGlvbilcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRW50aXR5UHJvcGVydHlOb3RGb3VuZEVycm9yKHByb3BlcnR5UGF0aCwgbWV0YWRhdGEpXG5cbiAgICAgICAgICAgIGlmIChjb2x1bW4pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdHMucHVzaChhbGlhcyArIFwiLlwiICsgcHJvcGVydHlQYXRoKVxuXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVtYmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5idWlsZFNlbGVjdCggLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBzZWxlY3Rba2V5XSBhcyBGaW5kT3B0aW9uc1NlbGVjdDxhbnk+LFxuICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgYWxpYXMsXG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5UGF0aCxcbiAgICAgICAgICAgICAgICApXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGJ1aWxkUmVsYXRpb25zKFxuICAgICAgICByZWxhdGlvbnM6IEZpbmRPcHRpb25zUmVsYXRpb25zPGFueT4sXG4gICAgICAgIHNlbGVjdGlvbjogRmluZE9wdGlvbnNTZWxlY3Q8YW55PiB8IHVuZGVmaW5lZCxcbiAgICAgICAgbWV0YWRhdGE6IEVudGl0eU1ldGFkYXRhLFxuICAgICAgICBhbGlhczogc3RyaW5nLFxuICAgICAgICBlbWJlZFByZWZpeD86IHN0cmluZyxcbiAgICApIHtcbiAgICAgICAgaWYgKCFyZWxhdGlvbnMpIHJldHVyblxuXG4gICAgICAgIE9iamVjdC5rZXlzKHJlbGF0aW9ucykuZm9yRWFjaCgocmVsYXRpb25OYW1lKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZWxhdGlvblZhbHVlID0gKHJlbGF0aW9ucyBhcyBhbnkpW3JlbGF0aW9uTmFtZV1cbiAgICAgICAgICAgIGNvbnN0IHByb3BlcnR5UGF0aCA9IGVtYmVkUHJlZml4XG4gICAgICAgICAgICAgICAgPyBlbWJlZFByZWZpeCArIFwiLlwiICsgcmVsYXRpb25OYW1lXG4gICAgICAgICAgICAgICAgOiByZWxhdGlvbk5hbWVcbiAgICAgICAgICAgIGNvbnN0IGVtYmVkID0gbWV0YWRhdGEuZmluZEVtYmVkZGVkV2l0aFByb3BlcnR5UGF0aChwcm9wZXJ0eVBhdGgpXG4gICAgICAgICAgICBjb25zdCByZWxhdGlvbiA9IG1ldGFkYXRhLmZpbmRSZWxhdGlvbldpdGhQcm9wZXJ0eVBhdGgocHJvcGVydHlQYXRoKVxuICAgICAgICAgICAgaWYgKCFlbWJlZCAmJiAhcmVsYXRpb24pXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVudGl0eVByb3BlcnR5Tm90Rm91bmRFcnJvcihwcm9wZXJ0eVBhdGgsIG1ldGFkYXRhKVxuXG4gICAgICAgICAgICBpZiAoZW1iZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkUmVsYXRpb25zKFxuICAgICAgICAgICAgICAgICAgICByZWxhdGlvblZhbHVlLFxuICAgICAgICAgICAgICAgICAgICB0eXBlb2Ygc2VsZWN0aW9uID09PSBcIm9iamVjdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA/IE9ybVV0aWxzLmRlZXBWYWx1ZShzZWxlY3Rpb24sIGVtYmVkLnByb3BlcnR5UGF0aClcbiAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgYWxpYXMsXG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5UGF0aCxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJlbGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgbGV0IGpvaW5BbGlhcyA9IGFsaWFzICsgXCJfXCIgKyBwcm9wZXJ0eVBhdGgucmVwbGFjZShcIi5cIiwgXCJfXCIpXG4gICAgICAgICAgICAgICAgam9pbkFsaWFzID0gRHJpdmVyVXRpbHMuYnVpbGRBbGlhcyhcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uLmRyaXZlcixcbiAgICAgICAgICAgICAgICAgICAgeyBqb2luZXI6IFwiX19cIiB9LFxuICAgICAgICAgICAgICAgICAgICBhbGlhcyxcbiAgICAgICAgICAgICAgICAgICAgam9pbkFsaWFzLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uVmFsdWUgPT09IHRydWUgfHxcbiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHJlbGF0aW9uVmFsdWUgPT09IFwib2JqZWN0XCJcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZXhwcmVzc2lvbk1hcC5yZWxhdGlvbkxvYWRTdHJhdGVneSA9PT0gXCJxdWVyeVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbGF0aW9uTWV0YWRhdGFzLnB1c2gocmVsYXRpb24pXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuam9pbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJsZWZ0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBzZWxlY3Rpb25bcmVsYXRpb25OYW1lXSA9PT0gXCJvYmplY3RcIiAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IChzZWxlY3Rpb25bXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbk5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSBhcyBGaW5kT3B0aW9uc1NlbGVjdDxhbnk+KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXM6IGpvaW5BbGlhcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRBbGlhczogYWxpYXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25NZXRhZGF0YTogcmVsYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHNlbGVjdGlvbltyZWxhdGlvbk5hbWVdID09PSBcIm9iamVjdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkU2VsZWN0KCAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbltcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uTmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdIGFzIEZpbmRPcHRpb25zU2VsZWN0PGFueT4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uLmludmVyc2VFbnRpdHlNZXRhZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam9pbkFsaWFzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHJlbGF0aW9uVmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5leHByZXNzaW9uTWFwLnJlbGF0aW9uTG9hZFN0cmF0ZWd5ID09PSBcImpvaW5cIlxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkUmVsYXRpb25zKFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25WYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBzZWxlY3Rpb24gPT09IFwib2JqZWN0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IE9ybVV0aWxzLmRlZXBWYWx1ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb24ucHJvcGVydHlQYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb24uaW52ZXJzZUVudGl0eU1ldGFkYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgam9pbkFsaWFzLFxuICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBidWlsZEVhZ2VyUmVsYXRpb25zKFxuICAgICAgICByZWxhdGlvbnM6IEZpbmRPcHRpb25zUmVsYXRpb25zPGFueT4sXG4gICAgICAgIHNlbGVjdGlvbjogRmluZE9wdGlvbnNTZWxlY3Q8YW55PiB8IHVuZGVmaW5lZCxcbiAgICAgICAgbWV0YWRhdGE6IEVudGl0eU1ldGFkYXRhLFxuICAgICAgICBhbGlhczogc3RyaW5nLFxuICAgICAgICBlbWJlZFByZWZpeD86IHN0cmluZyxcbiAgICApIHtcbiAgICAgICAgaWYgKCFyZWxhdGlvbnMpIHJldHVyblxuXG4gICAgICAgIE9iamVjdC5rZXlzKHJlbGF0aW9ucykuZm9yRWFjaCgocmVsYXRpb25OYW1lKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZWxhdGlvblZhbHVlID0gKHJlbGF0aW9ucyBhcyBhbnkpW3JlbGF0aW9uTmFtZV1cbiAgICAgICAgICAgIGNvbnN0IHByb3BlcnR5UGF0aCA9IGVtYmVkUHJlZml4XG4gICAgICAgICAgICAgICAgPyBlbWJlZFByZWZpeCArIFwiLlwiICsgcmVsYXRpb25OYW1lXG4gICAgICAgICAgICAgICAgOiByZWxhdGlvbk5hbWVcbiAgICAgICAgICAgIGNvbnN0IGVtYmVkID0gbWV0YWRhdGEuZmluZEVtYmVkZGVkV2l0aFByb3BlcnR5UGF0aChwcm9wZXJ0eVBhdGgpXG4gICAgICAgICAgICBjb25zdCByZWxhdGlvbiA9IG1ldGFkYXRhLmZpbmRSZWxhdGlvbldpdGhQcm9wZXJ0eVBhdGgocHJvcGVydHlQYXRoKVxuICAgICAgICAgICAgaWYgKCFlbWJlZCAmJiAhcmVsYXRpb24pXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVudGl0eVByb3BlcnR5Tm90Rm91bmRFcnJvcihwcm9wZXJ0eVBhdGgsIG1ldGFkYXRhKVxuXG4gICAgICAgICAgICBpZiAoZW1iZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkRWFnZXJSZWxhdGlvbnMoXG4gICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uVmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiBzZWxlY3Rpb24gPT09IFwib2JqZWN0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgID8gT3JtVXRpbHMuZGVlcFZhbHVlKHNlbGVjdGlvbiwgZW1iZWQucHJvcGVydHlQYXRoKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLFxuICAgICAgICAgICAgICAgICAgICBhbGlhcyxcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlQYXRoLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocmVsYXRpb24pIHtcbiAgICAgICAgICAgICAgICBsZXQgam9pbkFsaWFzID0gYWxpYXMgKyBcIl9cIiArIHByb3BlcnR5UGF0aC5yZXBsYWNlKFwiLlwiLCBcIl9cIilcbiAgICAgICAgICAgICAgICBqb2luQWxpYXMgPSBEcml2ZXJVdGlscy5idWlsZEFsaWFzKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24uZHJpdmVyLFxuICAgICAgICAgICAgICAgICAgICB7IGpvaW5lcjogXCJfX1wiIH0sXG4gICAgICAgICAgICAgICAgICAgIGFsaWFzLFxuICAgICAgICAgICAgICAgICAgICBqb2luQWxpYXMsXG4gICAgICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICByZWxhdGlvblZhbHVlID09PSB0cnVlIHx8XG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiByZWxhdGlvblZhbHVlID09PSBcIm9iamVjdFwiXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uLmludmVyc2VFbnRpdHlNZXRhZGF0YS5lYWdlclJlbGF0aW9ucy5mb3JFYWNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgKGVhZ2VyUmVsYXRpb24pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZWFnZXJSZWxhdGlvbkpvaW5BbGlhcyA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvaW5BbGlhcyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiX1wiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWFnZXJSZWxhdGlvbi5wcm9wZXJ0eVBhdGgucmVwbGFjZShcIi5cIiwgXCJfXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWFnZXJSZWxhdGlvbkpvaW5BbGlhcyA9IERyaXZlclV0aWxzLmJ1aWxkQWxpYXMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbi5kcml2ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgam9pbmVyOiBcIl9fXCIgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam9pbkFsaWFzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYWdlclJlbGF0aW9uSm9pbkFsaWFzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4aXN0Sm9pbiA9IHRoaXMuam9pbnMuZmluZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGpvaW4pID0+IGpvaW4uYWxpYXMgPT09IGVhZ2VyUmVsYXRpb25Kb2luQWxpYXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZXhpc3RKb2luKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuam9pbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImxlZnRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzOiBlYWdlclJlbGF0aW9uSm9pbkFsaWFzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50QWxpYXM6IGpvaW5BbGlhcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25NZXRhZGF0YTogZWFnZXJSZWxhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2Ygc2VsZWN0aW9uW3JlbGF0aW9uTmFtZV0gPT09IFwib2JqZWN0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5idWlsZFNlbGVjdCggLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uTmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSBhcyBGaW5kT3B0aW9uc1NlbGVjdDxhbnk+LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb24uaW52ZXJzZUVudGl0eU1ldGFkYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam9pbkFsaWFzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVsYXRpb25WYWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkRWFnZXJSZWxhdGlvbnMoXG4gICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvblZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHNlbGVjdGlvbiA9PT0gXCJvYmplY3RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gT3JtVXRpbHMuZGVlcFZhbHVlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbi5wcm9wZXJ0eVBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbi5pbnZlcnNlRW50aXR5TWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICBqb2luQWxpYXMsXG4gICAgICAgICAgICAgICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGJ1aWxkT3JkZXIoXG4gICAgICAgIG9yZGVyOiBGaW5kT3B0aW9uc09yZGVyPGFueT4sXG4gICAgICAgIG1ldGFkYXRhOiBFbnRpdHlNZXRhZGF0YSxcbiAgICAgICAgYWxpYXM6IHN0cmluZyxcbiAgICAgICAgZW1iZWRQcmVmaXg/OiBzdHJpbmcsXG4gICAgKSB7XG4gICAgICAgIGZvciAobGV0IGtleSBpbiBvcmRlcikge1xuICAgICAgICAgICAgaWYgKG9yZGVyW2tleV0gPT09IHVuZGVmaW5lZCkgY29udGludWVcblxuICAgICAgICAgICAgY29uc3QgcHJvcGVydHlQYXRoID0gZW1iZWRQcmVmaXggPyBlbWJlZFByZWZpeCArIFwiLlwiICsga2V5IDoga2V5XG4gICAgICAgICAgICBjb25zdCBjb2x1bW4gPVxuICAgICAgICAgICAgICAgIG1ldGFkYXRhLmZpbmRDb2x1bW5XaXRoUHJvcGVydHlQYXRoU3RyaWN0KHByb3BlcnR5UGF0aClcbiAgICAgICAgICAgIGNvbnN0IGVtYmVkID0gbWV0YWRhdGEuZmluZEVtYmVkZGVkV2l0aFByb3BlcnR5UGF0aChwcm9wZXJ0eVBhdGgpXG4gICAgICAgICAgICBjb25zdCByZWxhdGlvbiA9IG1ldGFkYXRhLmZpbmRSZWxhdGlvbldpdGhQcm9wZXJ0eVBhdGgocHJvcGVydHlQYXRoKVxuXG4gICAgICAgICAgICBpZiAoIWVtYmVkICYmICFjb2x1bW4gJiYgIXJlbGF0aW9uKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFbnRpdHlQcm9wZXJ0eU5vdEZvdW5kRXJyb3IocHJvcGVydHlQYXRoLCBtZXRhZGF0YSlcblxuICAgICAgICAgICAgaWYgKGNvbHVtbikge1xuICAgICAgICAgICAgICAgIGxldCBkaXJlY3Rpb24gPVxuICAgICAgICAgICAgICAgICAgICB0eXBlb2Ygb3JkZXJba2V5XSA9PT0gXCJvYmplY3RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPyAob3JkZXJba2V5XSBhcyBhbnkpLmRpcmVjdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgOiBvcmRlcltrZXldXG4gICAgICAgICAgICAgICAgZGlyZWN0aW9uID1cbiAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID09PSBcIkRFU0NcIiB8fFxuICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPT09IFwiZGVzY1wiIHx8XG4gICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9PT0gLTFcbiAgICAgICAgICAgICAgICAgICAgICAgID8gXCJERVNDXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIDogXCJBU0NcIlxuICAgICAgICAgICAgICAgIGxldCBudWxscyA9XG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiBvcmRlcltrZXldID09PSBcIm9iamVjdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA/IChvcmRlcltrZXldIGFzIGFueSkubnVsbHNcbiAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgbnVsbHMgPVxuICAgICAgICAgICAgICAgICAgICBudWxscz8udG9Mb3dlckNhc2UoKSA9PT0gXCJmaXJzdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA/IFwiTlVMTFMgRklSU1RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxscz8udG9Mb3dlckNhc2UoKSA9PT0gXCJsYXN0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgID8gXCJOVUxMUyBMQVNUXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkXG5cbiAgICAgICAgICAgICAgICBsZXQgYWxpYXNQYXRoID0gYCR7YWxpYXN9LiR7cHJvcGVydHlQYXRofWBcbiAgICAgICAgICAgICAgICBpZiAoY29sdW1uLmlzVmlydHVhbFByb3BlcnR5ICYmIGNvbHVtbi5xdWVyeSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB0aGlzLmV4cHJlc3Npb25NYXAuc2VsZWN0cy5maW5kKFxuICAgICAgICAgICAgICAgICAgICAgICAgKHMpID0+IHMuc2VsZWN0aW9uID09PSBhbGlhc1BhdGgsXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbikge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGlhc1BhdGggPSBEcml2ZXJVdGlscy5idWlsZEFsaWFzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbi5kcml2ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLmRhdGFiYXNlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbi5hbGlhc05hbWUgPSBhbGlhc1BhdGhcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzUGF0aCA9IGAoJHtjb2x1bW4ucXVlcnkoYWxpYXMpfSlgXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLmFkZE9yZGVyQnkoYWxpYXNQYXRoLCBkaXJlY3Rpb24sIG51bGxzKVxuXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVtYmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5idWlsZE9yZGVyKFxuICAgICAgICAgICAgICAgICAgICBvcmRlcltrZXldIGFzIEZpbmRPcHRpb25zT3JkZXI8YW55PixcbiAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgICAgIGFsaWFzLFxuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVBhdGgsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfSBlbHNlIGlmIChyZWxhdGlvbikge1xuICAgICAgICAgICAgICAgIGxldCBqb2luQWxpYXMgPSBhbGlhcyArIFwiX1wiICsgcHJvcGVydHlQYXRoLnJlcGxhY2UoXCIuXCIsIFwiX1wiKVxuICAgICAgICAgICAgICAgIGpvaW5BbGlhcyA9IERyaXZlclV0aWxzLmJ1aWxkQWxpYXMoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbi5kcml2ZXIsXG4gICAgICAgICAgICAgICAgICAgIHsgam9pbmVyOiBcIl9fXCIgfSxcbiAgICAgICAgICAgICAgICAgICAgYWxpYXMsXG4gICAgICAgICAgICAgICAgICAgIGpvaW5BbGlhcyxcbiAgICAgICAgICAgICAgICApXG5cblxuXG5cbiAgICAgICAgICAgICAgICBjb25zdCBleGlzdEpvaW4gPSB0aGlzLmpvaW5zLmZpbmQoXG4gICAgICAgICAgICAgICAgICAgIChqb2luKSA9PiBqb2luLmFsaWFzID09PSBqb2luQWxpYXMsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIGlmICghZXhpc3RKb2luKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuam9pbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImxlZnRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGlhczogam9pbkFsaWFzLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50QWxpYXM6IGFsaWFzLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbk1ldGFkYXRhOiByZWxhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5idWlsZE9yZGVyKFxuICAgICAgICAgICAgICAgICAgICBvcmRlcltrZXldIGFzIEZpbmRPcHRpb25zT3JkZXI8YW55PixcbiAgICAgICAgICAgICAgICAgICAgcmVsYXRpb24uaW52ZXJzZUVudGl0eU1ldGFkYXRhLFxuICAgICAgICAgICAgICAgICAgICBqb2luQWxpYXMsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGJ1aWxkV2hlcmUoXG4gICAgICAgIHdoZXJlOiBGaW5kT3B0aW9uc1doZXJlPGFueT4sXG4gICAgICAgIG1ldGFkYXRhOiBFbnRpdHlNZXRhZGF0YSxcbiAgICAgICAgYWxpYXM6IHN0cmluZyxcbiAgICAgICAgZW1iZWRQcmVmaXg/OiBzdHJpbmcsXG4gICAgKSB7XG4gICAgICAgIGxldCBjb25kaXRpb246IHN0cmluZyA9IFwiXCJcblxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh3aGVyZSkpIHtcbiAgICAgICAgICAgIGNvbmRpdGlvbiA9XG4gICAgICAgICAgICAgICAgXCIoXCIgK1xuICAgICAgICAgICAgICAgIHdoZXJlXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoKHdoZXJlSXRlbSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYnVpbGRXaGVyZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZUl0ZW0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1iZWRQcmVmaXgsXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKGNvbmRpdGlvbikgPT4gISFjb25kaXRpb24pXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoKGNvbmRpdGlvbikgPT4gXCIoXCIgKyBjb25kaXRpb24gKyBcIilcIilcbiAgICAgICAgICAgICAgICAgICAgLmpvaW4oXCIgT1IgXCIpICtcbiAgICAgICAgICAgICAgICBcIilcIlxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGFuZENvbmRpdGlvbnM6IHN0cmluZ1tdID0gW11cbiAgICAgICAgICAgIGZvciAobGV0IGtleSBpbiB3aGVyZSkge1xuICAgICAgICAgICAgICAgIGlmICh3aGVyZVtrZXldID09PSB1bmRlZmluZWQgfHwgd2hlcmVba2V5XSA9PT0gbnVsbCkgY29udGludWVcblxuICAgICAgICAgICAgICAgIGNvbnN0IHByb3BlcnR5UGF0aCA9IGVtYmVkUHJlZml4ID8gZW1iZWRQcmVmaXggKyBcIi5cIiArIGtleSA6IGtleVxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbHVtbiA9XG4gICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLmZpbmRDb2x1bW5XaXRoUHJvcGVydHlQYXRoU3RyaWN0KHByb3BlcnR5UGF0aClcbiAgICAgICAgICAgICAgICBjb25zdCBlbWJlZCA9XG4gICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhLmZpbmRFbWJlZGRlZFdpdGhQcm9wZXJ0eVBhdGgocHJvcGVydHlQYXRoKVxuICAgICAgICAgICAgICAgIGNvbnN0IHJlbGF0aW9uID1cbiAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEuZmluZFJlbGF0aW9uV2l0aFByb3BlcnR5UGF0aChwcm9wZXJ0eVBhdGgpXG5cbiAgICAgICAgICAgICAgICBpZiAoIWVtYmVkICYmICFjb2x1bW4gJiYgIXJlbGF0aW9uKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRW50aXR5UHJvcGVydHlOb3RGb3VuZEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlQYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgICAgIClcblxuICAgICAgICAgICAgICAgIGlmIChjb2x1bW4pIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFsaWFzUGF0aCA9IGAke2FsaWFzfS4ke3Byb3BlcnR5UGF0aH1gXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW4uaXNWaXJ0dWFsUHJvcGVydHkgJiYgY29sdW1uLnF1ZXJ5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbGlhc1BhdGggPSBgKCR7Y29sdW1uLnF1ZXJ5KGFsaWFzKX0pYFxuICAgICAgICAgICAgICAgICAgICB9XG5cblxuXG4gICAgICAgICAgICAgICAgICAgIGxldCBwYXJhbWV0ZXJWYWx1ZSA9IHdoZXJlW2tleV1cbiAgICAgICAgICAgICAgICAgICAgaWYgKEluc3RhbmNlQ2hlY2tlci5pc0VxdWFsT3BlcmF0b3Iod2hlcmVba2V5XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlclZhbHVlID0gd2hlcmVba2V5XS52YWx1ZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW4udHJhbnNmb3JtZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlclZhbHVlID0gQXBwbHlWYWx1ZVRyYW5zZm9ybWVycy50cmFuc2Zvcm1UbyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4udHJhbnNmb3JtZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyVmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIH1cblxuXG5cbiAgICAgICAgICAgICAgICAgICAgLy9cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICAgICAgICAgICAgICAgICAgLy9cblxuXG5cblxuXG5cblxuICAgICAgICAgICAgICAgICAgICBhbmRDb25kaXRpb25zLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVdoZXJlQ29uZGl0aW9uRXhwcmVzc2lvbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFdoZXJlUHJlZGljYXRlQ29uZGl0aW9uKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlhc1BhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlclZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxuXG4gICAgICAgICAgICAgICAgICAgIClcblxuXG5cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVtYmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbmRpdGlvbiA9IHRoaXMuYnVpbGRXaGVyZShcbiAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlW2tleV0sXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlQYXRoLFxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb25kaXRpb24pIGFuZENvbmRpdGlvbnMucHVzaChjb25kaXRpb24pXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZWxhdGlvbikge1xuXG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB3aGVyZVtrZXldID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbGxBbGxVbmRlZmluZWQgPSBPYmplY3Qua2V5cyh3aGVyZVtrZXldKS5ldmVyeShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaykgPT4gd2hlcmVba2V5XVtrXSA9PT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFsbEFsbFVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoSW5zdGFuY2VDaGVja2VyLmlzRmluZE9wZXJhdG9yKHdoZXJlW2tleV0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmVba2V5XS50eXBlID09PSBcIm1vcmVUaGFuXCIgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZVtrZXldLnR5cGUgPT09IFwibGVzc1RoYW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3FsT3BlcmF0b3IgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZVtrZXldLnR5cGUgPT09IFwibW9yZVRoYW5cIiA/IFwiPlwiIDogXCI8XCJcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHFiOiBRdWVyeUJ1aWxkZXI8YW55PiA9IHRoaXMuc3ViUXVlcnkoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWxhdGlvbi5pc01hbnlUb01hbnlPd25lcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxYi5zZWxlY3QoXCJDT1VOVCgqKVwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZyb20oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb24uam9pblRhYmxlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbi5qb2luVGFibGVOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndoZXJlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uLmpvaW5Db2x1bW5zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKGNvbHVtbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAke1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uLmpvaW5UYWJsZU5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0uJHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4ucHJvcGVydHlOYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ID0gJHthbGlhc30uJHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4ucmVmZXJlbmNlZENvbHVtbiFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByb3BlcnR5TmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmpvaW4oXCIgQU5EIFwiKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlbGF0aW9uLmlzTWFueVRvTWFueU5vdE93bmVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFiLnNlbGVjdChcIkNPVU5UKCopXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZnJvbShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbi5pbnZlcnNlUmVsYXRpb24hLmpvaW5UYWJsZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb24uaW52ZXJzZVJlbGF0aW9uIS5qb2luVGFibGVOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndoZXJlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbnZlcnNlUmVsYXRpb24hLmludmVyc2VKb2luQ29sdW1ucy5tYXAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29sdW1uKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAke1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbi5pbnZlcnNlUmVsYXRpb24hXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuam9pblRhYmxlTmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0uJHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLnByb3BlcnR5TmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gPSAke2FsaWFzfS4ke1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4ucmVmZXJlbmNlZENvbHVtbiFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wZXJ0eU5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9YFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuam9pbihcIiBBTkQgXCIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVsYXRpb24uaXNPbmVUb01hbnkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWIuc2VsZWN0KFwiQ09VTlQoKilcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mcm9tKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uLmludmVyc2VFbnRpdHlNZXRhZGF0YS50YXJnZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb24uaW52ZXJzZUVudGl0eU1ldGFkYXRhXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50YWJsZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAud2hlcmUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmludmVyc2VSZWxhdGlvbiEuam9pbkNvbHVtbnMubWFwKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbHVtbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgJHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbnZlcnNlRW50aXR5TWV0YWRhdGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50YWJsZU5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LiR7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbi5wcm9wZXJ0eU5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ID0gJHthbGlhc30uJHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLnJlZmVyZW5jZWRDb2x1bW4hXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHJvcGVydHlOYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmpvaW4oXCIgQU5EIFwiKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgVGhpcyByZWxhdGlvbiBpc24ndCBzdXBwb3J0ZWQgYnkgZ2l2ZW4gZmluZCBvcGVyYXRvcmAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cblxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hbmRXaGVyZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWIuZ2V0U3FsKCkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3FsT3BlcmF0b3IgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VJbnQod2hlcmVba2V5XS52YWx1ZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uLmlzTWFueVRvT25lIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZWxhdGlvbi5pc09uZVRvT25lICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbi5pc09uZVRvT25lT3duZXIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFsaWFzUGF0aCA9IGAke2FsaWFzfS4ke3Byb3BlcnR5UGF0aH1gXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kQ29uZGl0aW9ucy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVXaGVyZUNvbmRpdGlvbkV4cHJlc3Npb24oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRXaGVyZVByZWRpY2F0ZUNvbmRpdGlvbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXNQYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZVtrZXldLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYFRoaXMgcmVsYXRpb24gaXNuJ3Qgc3VwcG9ydGVkIGJ5IGdpdmVuIGZpbmQgb3BlcmF0b3JgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgam9pbkFsaWFzID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlhcyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJfXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uLnByb3BlcnR5UGF0aC5yZXBsYWNlKFwiLlwiLCBcIl9cIilcbiAgICAgICAgICAgICAgICAgICAgICAgIGpvaW5BbGlhcyA9IERyaXZlclV0aWxzLmJ1aWxkQWxpYXMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uLmRyaXZlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGpvaW5lcjogXCJfX1wiIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgam9pbkFsaWFzLFxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBleGlzdEpvaW4gPSB0aGlzLmpvaW5zLmZpbmQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGpvaW4pID0+IGpvaW4uYWxpYXMgPT09IGpvaW5BbGlhcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZXhpc3RKb2luKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5qb2lucy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJpbm5lclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Q6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb246IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXM6IGpvaW5BbGlhcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50QWxpYXM6IGFsaWFzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbk1ldGFkYXRhOiByZWxhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXhpc3RKb2luLnR5cGUgPT09IFwibGVmdFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdEpvaW4udHlwZSA9IFwiaW5uZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb25kaXRpb24gPSB0aGlzLmJ1aWxkV2hlcmUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmVba2V5XSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbi5pbnZlcnNlRW50aXR5TWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgam9pbkFsaWFzLFxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmRpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZENvbmRpdGlvbnMucHVzaChjb25kaXRpb24pXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbmRpdGlvbiA9IGFuZENvbmRpdGlvbnMuam9pbihcIiBBTkQgXCIpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbmRpdGlvblxuICAgIH1cbn1cblxuIDsoe30pOyAvLyBALS1lbmQtb2YtZmlsZS1mb3ItbW9kdWxlPXRhb24tdHlwZW9ybSBsaWIvdHlwZW9ybS9xdWVyeS1idWlsZGVyL1NlbGVjdFF1ZXJ5QnVpbGRlci50cyJdfQ==
|