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,1421 +0,0 @@
|
|
|
1
|
-
import { TransactionNotStartedError } from "../../error/TransactionNotStartedError";
|
|
2
|
-
import { TableColumn } from "../../schema-builder/table/TableColumn";
|
|
3
|
-
import { Table } from "../../schema-builder/table/Table";
|
|
4
|
-
import { TableIndex } from "../../schema-builder/table/TableIndex";
|
|
5
|
-
import { TableForeignKey } from "../../schema-builder/table/TableForeignKey";
|
|
6
|
-
import { View } from "../../schema-builder/view/View";
|
|
7
|
-
import { Query } from "../Query";
|
|
8
|
-
import { TableUnique } from "../../schema-builder/table/TableUnique";
|
|
9
|
-
import { BaseQueryRunner } from "../../query-runner/BaseQueryRunner";
|
|
10
|
-
import { OrmUtils } from "../../util/OrmUtils";
|
|
11
|
-
import { TableCheck } from "../../schema-builder/table/TableCheck";
|
|
12
|
-
import { TransactionAlreadyStartedError, TypeORMError } from "../../error";
|
|
13
|
-
import { MetadataTableType } from "../types/MetadataTableType";
|
|
14
|
-
import { InstanceChecker } from "../../util/InstanceChecker";
|
|
15
|
-
/**
|
|
16
|
-
* Runs queries on a single sqlite database connection.
|
|
17
|
-
*/
|
|
18
|
-
export class AbstractSqliteQueryRunner extends BaseQueryRunner {
|
|
19
|
-
constructor() {
|
|
20
|
-
super();
|
|
21
|
-
this.transactionPromise = null;
|
|
22
|
-
}
|
|
23
|
-
/**
|
|
24
|
-
* Creates/uses database connection from the connection pool to perform further operations.
|
|
25
|
-
* Returns obtained database connection.
|
|
26
|
-
*/
|
|
27
|
-
connect() {
|
|
28
|
-
return Promise.resolve(this.driver.databaseConnection);
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* Releases used database connection.
|
|
32
|
-
* We just clear loaded tables and sql in memory, because sqlite do not support multiple connections thus query runners.
|
|
33
|
-
*/
|
|
34
|
-
release() {
|
|
35
|
-
this.loadedTables = [];
|
|
36
|
-
this.clearSqlMemory();
|
|
37
|
-
return Promise.resolve();
|
|
38
|
-
}
|
|
39
|
-
/**
|
|
40
|
-
* Starts transaction.
|
|
41
|
-
*/
|
|
42
|
-
async startTransaction(isolationLevel) {
|
|
43
|
-
if (this.driver.transactionSupport === "none")
|
|
44
|
-
throw new TypeORMError(`Transactions aren't supported by ${this.connection.driver.options.type}.`);
|
|
45
|
-
if (this.isTransactionActive &&
|
|
46
|
-
this.driver.transactionSupport === "simple")
|
|
47
|
-
throw new TransactionAlreadyStartedError();
|
|
48
|
-
if (isolationLevel &&
|
|
49
|
-
isolationLevel !== "READ UNCOMMITTED" &&
|
|
50
|
-
isolationLevel !== "SERIALIZABLE")
|
|
51
|
-
throw new TypeORMError(`SQLite only supports SERIALIZABLE and READ UNCOMMITTED isolation`);
|
|
52
|
-
this.isTransactionActive = true;
|
|
53
|
-
try {
|
|
54
|
-
await this.broadcaster.broadcast("BeforeTransactionStart");
|
|
55
|
-
}
|
|
56
|
-
catch (err) {
|
|
57
|
-
this.isTransactionActive = false;
|
|
58
|
-
throw err;
|
|
59
|
-
}
|
|
60
|
-
if (this.transactionDepth === 0) {
|
|
61
|
-
if (isolationLevel) {
|
|
62
|
-
if (isolationLevel === "READ UNCOMMITTED") {
|
|
63
|
-
await this.query("PRAGMA read_uncommitted = true");
|
|
64
|
-
}
|
|
65
|
-
else {
|
|
66
|
-
await this.query("PRAGMA read_uncommitted = false");
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
await this.query("BEGIN TRANSACTION");
|
|
70
|
-
}
|
|
71
|
-
else {
|
|
72
|
-
await this.query(`SAVEPOINT typeorm_${this.transactionDepth}`);
|
|
73
|
-
}
|
|
74
|
-
this.transactionDepth += 1;
|
|
75
|
-
await this.broadcaster.broadcast("AfterTransactionStart");
|
|
76
|
-
}
|
|
77
|
-
/**
|
|
78
|
-
* Commits transaction.
|
|
79
|
-
* Error will be thrown if transaction was not started.
|
|
80
|
-
*/
|
|
81
|
-
async commitTransaction() {
|
|
82
|
-
if (!this.isTransactionActive)
|
|
83
|
-
throw new TransactionNotStartedError();
|
|
84
|
-
await this.broadcaster.broadcast("BeforeTransactionCommit");
|
|
85
|
-
if (this.transactionDepth > 1) {
|
|
86
|
-
await this.query(`RELEASE SAVEPOINT typeorm_${this.transactionDepth - 1}`);
|
|
87
|
-
}
|
|
88
|
-
else {
|
|
89
|
-
await this.query("COMMIT");
|
|
90
|
-
this.isTransactionActive = false;
|
|
91
|
-
}
|
|
92
|
-
this.transactionDepth -= 1;
|
|
93
|
-
await this.broadcaster.broadcast("AfterTransactionCommit");
|
|
94
|
-
}
|
|
95
|
-
/**
|
|
96
|
-
* Rollbacks transaction.
|
|
97
|
-
* Error will be thrown if transaction was not started.
|
|
98
|
-
*/
|
|
99
|
-
async rollbackTransaction() {
|
|
100
|
-
if (!this.isTransactionActive)
|
|
101
|
-
throw new TransactionNotStartedError();
|
|
102
|
-
await this.broadcaster.broadcast("BeforeTransactionRollback");
|
|
103
|
-
if (this.transactionDepth > 1) {
|
|
104
|
-
await this.query(`ROLLBACK TO SAVEPOINT typeorm_${this.transactionDepth - 1}`);
|
|
105
|
-
}
|
|
106
|
-
else {
|
|
107
|
-
await this.query("ROLLBACK");
|
|
108
|
-
this.isTransactionActive = false;
|
|
109
|
-
}
|
|
110
|
-
this.transactionDepth -= 1;
|
|
111
|
-
await this.broadcaster.broadcast("AfterTransactionRollback");
|
|
112
|
-
}
|
|
113
|
-
/**
|
|
114
|
-
* Returns raw data stream.
|
|
115
|
-
*/
|
|
116
|
-
stream(query, parameters, onEnd, onError) {
|
|
117
|
-
throw new TypeORMError(`Stream is not supported by sqlite driver.`);
|
|
118
|
-
}
|
|
119
|
-
/**
|
|
120
|
-
* Returns all available database names including system databases.
|
|
121
|
-
*/
|
|
122
|
-
async getDatabases() {
|
|
123
|
-
return Promise.resolve([]);
|
|
124
|
-
}
|
|
125
|
-
/**
|
|
126
|
-
* Returns all available schema names including system schemas.
|
|
127
|
-
* If database parameter specified, returns schemas of that database.
|
|
128
|
-
*/
|
|
129
|
-
async getSchemas(database) {
|
|
130
|
-
return Promise.resolve([]);
|
|
131
|
-
}
|
|
132
|
-
/**
|
|
133
|
-
* Checks if database with the given name exist.
|
|
134
|
-
*/
|
|
135
|
-
async hasDatabase(database) {
|
|
136
|
-
return Promise.resolve(false);
|
|
137
|
-
}
|
|
138
|
-
/**
|
|
139
|
-
* Loads currently using database
|
|
140
|
-
*/
|
|
141
|
-
async getCurrentDatabase() {
|
|
142
|
-
return Promise.resolve(undefined);
|
|
143
|
-
}
|
|
144
|
-
/**
|
|
145
|
-
* Checks if schema with the given name exist.
|
|
146
|
-
*/
|
|
147
|
-
async hasSchema(schema) {
|
|
148
|
-
throw new TypeORMError(`This driver does not support table schemas`);
|
|
149
|
-
}
|
|
150
|
-
/**
|
|
151
|
-
* Loads currently using database schema
|
|
152
|
-
*/
|
|
153
|
-
async getCurrentSchema() {
|
|
154
|
-
return Promise.resolve(undefined);
|
|
155
|
-
}
|
|
156
|
-
/**
|
|
157
|
-
* Checks if table with the given name exist in the database.
|
|
158
|
-
*/
|
|
159
|
-
async hasTable(tableOrName) {
|
|
160
|
-
const tableName = InstanceChecker.isTable(tableOrName)
|
|
161
|
-
? tableOrName.name
|
|
162
|
-
: tableOrName;
|
|
163
|
-
const sql = `SELECT * FROM "sqlite_master" WHERE "type" = 'table' AND "name" = '${tableName}'`;
|
|
164
|
-
const result = await this.query(sql);
|
|
165
|
-
return result.length ? true : false;
|
|
166
|
-
}
|
|
167
|
-
/**
|
|
168
|
-
* Checks if column with the given name exist in the given table.
|
|
169
|
-
*/
|
|
170
|
-
async hasColumn(tableOrName, columnName) {
|
|
171
|
-
const tableName = InstanceChecker.isTable(tableOrName)
|
|
172
|
-
? tableOrName.name
|
|
173
|
-
: tableOrName;
|
|
174
|
-
const sql = `PRAGMA table_xinfo(${this.escapePath(tableName)})`;
|
|
175
|
-
const columns = await this.query(sql);
|
|
176
|
-
return !!columns.find((column) => column["name"] === columnName);
|
|
177
|
-
}
|
|
178
|
-
/**
|
|
179
|
-
* Creates a new database.
|
|
180
|
-
*/
|
|
181
|
-
async createDatabase(database, ifNotExist) {
|
|
182
|
-
return Promise.resolve();
|
|
183
|
-
}
|
|
184
|
-
/**
|
|
185
|
-
* Drops database.
|
|
186
|
-
*/
|
|
187
|
-
async dropDatabase(database, ifExist) {
|
|
188
|
-
return Promise.resolve();
|
|
189
|
-
}
|
|
190
|
-
/**
|
|
191
|
-
* Creates a new table schema.
|
|
192
|
-
*/
|
|
193
|
-
async createSchema(schemaPath, ifNotExist) {
|
|
194
|
-
return Promise.resolve();
|
|
195
|
-
}
|
|
196
|
-
/**
|
|
197
|
-
* Drops table schema.
|
|
198
|
-
*/
|
|
199
|
-
async dropSchema(schemaPath, ifExist) {
|
|
200
|
-
return Promise.resolve();
|
|
201
|
-
}
|
|
202
|
-
/**
|
|
203
|
-
* Creates a new table.
|
|
204
|
-
*/
|
|
205
|
-
async createTable(table, ifNotExist = false, createForeignKeys = true, createIndices = true) {
|
|
206
|
-
const upQueries = [];
|
|
207
|
-
const downQueries = [];
|
|
208
|
-
if (ifNotExist) {
|
|
209
|
-
const isTableExist = await this.hasTable(table);
|
|
210
|
-
if (isTableExist)
|
|
211
|
-
return Promise.resolve();
|
|
212
|
-
}
|
|
213
|
-
upQueries.push(this.createTableSql(table, createForeignKeys));
|
|
214
|
-
downQueries.push(this.dropTableSql(table));
|
|
215
|
-
if (createIndices) {
|
|
216
|
-
table.indices.forEach((index) => {
|
|
217
|
-
if (!index.name)
|
|
218
|
-
index.name = this.connection.namingStrategy.indexName(table, index.columnNames, index.where);
|
|
219
|
-
upQueries.push(this.createIndexSql(table, index));
|
|
220
|
-
downQueries.push(this.dropIndexSql(index));
|
|
221
|
-
});
|
|
222
|
-
}
|
|
223
|
-
const generatedColumns = table.columns.filter((column) => column.generatedType && column.asExpression);
|
|
224
|
-
for (const column of generatedColumns) {
|
|
225
|
-
const insertQuery = this.insertTypeormMetadataSql({
|
|
226
|
-
table: table.name,
|
|
227
|
-
type: MetadataTableType.GENERATED_COLUMN,
|
|
228
|
-
name: column.name,
|
|
229
|
-
value: column.asExpression,
|
|
230
|
-
});
|
|
231
|
-
const deleteQuery = this.deleteTypeormMetadataSql({
|
|
232
|
-
table: table.name,
|
|
233
|
-
type: MetadataTableType.GENERATED_COLUMN,
|
|
234
|
-
name: column.name,
|
|
235
|
-
});
|
|
236
|
-
upQueries.push(insertQuery);
|
|
237
|
-
downQueries.push(deleteQuery);
|
|
238
|
-
}
|
|
239
|
-
await this.executeQueries(upQueries, downQueries);
|
|
240
|
-
}
|
|
241
|
-
/**
|
|
242
|
-
* Drops the table.
|
|
243
|
-
*/
|
|
244
|
-
async dropTable(tableOrName, ifExist, dropForeignKeys = true, dropIndices = true) {
|
|
245
|
-
if (ifExist) {
|
|
246
|
-
const isTableExist = await this.hasTable(tableOrName);
|
|
247
|
-
if (!isTableExist)
|
|
248
|
-
return Promise.resolve();
|
|
249
|
-
}
|
|
250
|
-
const createForeignKeys = dropForeignKeys;
|
|
251
|
-
const table = InstanceChecker.isTable(tableOrName)
|
|
252
|
-
? tableOrName
|
|
253
|
-
: await this.getCachedTable(tableOrName);
|
|
254
|
-
const upQueries = [];
|
|
255
|
-
const downQueries = [];
|
|
256
|
-
if (dropIndices) {
|
|
257
|
-
table.indices.forEach((index) => {
|
|
258
|
-
upQueries.push(this.dropIndexSql(index));
|
|
259
|
-
downQueries.push(this.createIndexSql(table, index));
|
|
260
|
-
});
|
|
261
|
-
}
|
|
262
|
-
upQueries.push(this.dropTableSql(table, ifExist));
|
|
263
|
-
downQueries.push(this.createTableSql(table, createForeignKeys));
|
|
264
|
-
const generatedColumns = table.columns.filter((column) => column.generatedType && column.asExpression);
|
|
265
|
-
for (const column of generatedColumns) {
|
|
266
|
-
const deleteQuery = this.deleteTypeormMetadataSql({
|
|
267
|
-
table: table.name,
|
|
268
|
-
type: MetadataTableType.GENERATED_COLUMN,
|
|
269
|
-
name: column.name,
|
|
270
|
-
});
|
|
271
|
-
const insertQuery = this.insertTypeormMetadataSql({
|
|
272
|
-
table: table.name,
|
|
273
|
-
type: MetadataTableType.GENERATED_COLUMN,
|
|
274
|
-
name: column.name,
|
|
275
|
-
value: column.asExpression,
|
|
276
|
-
});
|
|
277
|
-
upQueries.push(deleteQuery);
|
|
278
|
-
downQueries.push(insertQuery);
|
|
279
|
-
}
|
|
280
|
-
await this.executeQueries(upQueries, downQueries);
|
|
281
|
-
}
|
|
282
|
-
/**
|
|
283
|
-
* Creates a new view.
|
|
284
|
-
*/
|
|
285
|
-
async createView(view, syncWithMetadata = false) {
|
|
286
|
-
const upQueries = [];
|
|
287
|
-
const downQueries = [];
|
|
288
|
-
upQueries.push(this.createViewSql(view));
|
|
289
|
-
if (syncWithMetadata)
|
|
290
|
-
upQueries.push(this.insertViewDefinitionSql(view));
|
|
291
|
-
downQueries.push(this.dropViewSql(view));
|
|
292
|
-
if (syncWithMetadata)
|
|
293
|
-
downQueries.push(this.deleteViewDefinitionSql(view));
|
|
294
|
-
await this.executeQueries(upQueries, downQueries);
|
|
295
|
-
}
|
|
296
|
-
/**
|
|
297
|
-
* Drops the view.
|
|
298
|
-
*/
|
|
299
|
-
async dropView(target) {
|
|
300
|
-
const viewName = InstanceChecker.isView(target) ? target.name : target;
|
|
301
|
-
const view = await this.getCachedView(viewName);
|
|
302
|
-
const upQueries = [];
|
|
303
|
-
const downQueries = [];
|
|
304
|
-
upQueries.push(this.deleteViewDefinitionSql(view));
|
|
305
|
-
upQueries.push(this.dropViewSql(view));
|
|
306
|
-
downQueries.push(this.insertViewDefinitionSql(view));
|
|
307
|
-
downQueries.push(this.createViewSql(view));
|
|
308
|
-
await this.executeQueries(upQueries, downQueries);
|
|
309
|
-
}
|
|
310
|
-
/**
|
|
311
|
-
* Renames the given table.
|
|
312
|
-
*/
|
|
313
|
-
async renameTable(oldTableOrName, newTableName) {
|
|
314
|
-
const oldTable = InstanceChecker.isTable(oldTableOrName)
|
|
315
|
-
? oldTableOrName
|
|
316
|
-
: await this.getCachedTable(oldTableOrName);
|
|
317
|
-
const newTable = oldTable.clone();
|
|
318
|
-
newTable.name = newTableName;
|
|
319
|
-
const up = new Query(`ALTER TABLE ${this.escapePath(oldTable.name)} RENAME TO ${this.escapePath(newTableName)}`);
|
|
320
|
-
const down = new Query(`ALTER TABLE ${this.escapePath(newTableName)} RENAME TO ${this.escapePath(oldTable.name)}`);
|
|
321
|
-
await this.executeQueries(up, down);
|
|
322
|
-
newTable.uniques.forEach((unique) => {
|
|
323
|
-
const oldUniqueName = this.connection.namingStrategy.uniqueConstraintName(oldTable, unique.columnNames);
|
|
324
|
-
if (unique.name !== oldUniqueName)
|
|
325
|
-
return;
|
|
326
|
-
unique.name = this.connection.namingStrategy.uniqueConstraintName(newTable, unique.columnNames);
|
|
327
|
-
});
|
|
328
|
-
newTable.foreignKeys.forEach((foreignKey) => {
|
|
329
|
-
const oldForeignKeyName = this.connection.namingStrategy.foreignKeyName(oldTable, foreignKey.columnNames, this.getTablePath(foreignKey), foreignKey.referencedColumnNames);
|
|
330
|
-
if (foreignKey.name !== oldForeignKeyName)
|
|
331
|
-
return;
|
|
332
|
-
foreignKey.name = this.connection.namingStrategy.foreignKeyName(newTable, foreignKey.columnNames, this.getTablePath(foreignKey), foreignKey.referencedColumnNames);
|
|
333
|
-
});
|
|
334
|
-
newTable.indices.forEach((index) => {
|
|
335
|
-
const oldIndexName = this.connection.namingStrategy.indexName(oldTable, index.columnNames, index.where);
|
|
336
|
-
if (index.name !== oldIndexName)
|
|
337
|
-
return;
|
|
338
|
-
index.name = this.connection.namingStrategy.indexName(newTable, index.columnNames, index.where);
|
|
339
|
-
});
|
|
340
|
-
oldTable.name = newTable.name;
|
|
341
|
-
await this.recreateTable(newTable, oldTable);
|
|
342
|
-
}
|
|
343
|
-
/**
|
|
344
|
-
* Creates a new column from the column in the table.
|
|
345
|
-
*/
|
|
346
|
-
async addColumn(tableOrName, column) {
|
|
347
|
-
const table = InstanceChecker.isTable(tableOrName)
|
|
348
|
-
? tableOrName
|
|
349
|
-
: await this.getCachedTable(tableOrName);
|
|
350
|
-
return this.addColumns(table, [column]);
|
|
351
|
-
}
|
|
352
|
-
/**
|
|
353
|
-
* Creates a new columns from the column in the table.
|
|
354
|
-
*/
|
|
355
|
-
async addColumns(tableOrName, columns) {
|
|
356
|
-
const table = InstanceChecker.isTable(tableOrName)
|
|
357
|
-
? tableOrName
|
|
358
|
-
: await this.getCachedTable(tableOrName);
|
|
359
|
-
const changedTable = table.clone();
|
|
360
|
-
columns.forEach((column) => changedTable.addColumn(column));
|
|
361
|
-
await this.recreateTable(changedTable, table);
|
|
362
|
-
}
|
|
363
|
-
/**
|
|
364
|
-
* Renames column in the given table.
|
|
365
|
-
*/
|
|
366
|
-
async renameColumn(tableOrName, oldTableColumnOrName, newTableColumnOrName) {
|
|
367
|
-
const table = InstanceChecker.isTable(tableOrName)
|
|
368
|
-
? tableOrName
|
|
369
|
-
: await this.getCachedTable(tableOrName);
|
|
370
|
-
const oldColumn = InstanceChecker.isTableColumn(oldTableColumnOrName)
|
|
371
|
-
? oldTableColumnOrName
|
|
372
|
-
: table.columns.find((c) => c.name === oldTableColumnOrName);
|
|
373
|
-
if (!oldColumn)
|
|
374
|
-
throw new TypeORMError(`Column "${oldTableColumnOrName}" was not found in the "${table.name}" table.`);
|
|
375
|
-
let newColumn = undefined;
|
|
376
|
-
if (InstanceChecker.isTableColumn(newTableColumnOrName)) {
|
|
377
|
-
newColumn = newTableColumnOrName;
|
|
378
|
-
}
|
|
379
|
-
else {
|
|
380
|
-
newColumn = oldColumn.clone();
|
|
381
|
-
newColumn.name = newTableColumnOrName;
|
|
382
|
-
}
|
|
383
|
-
return this.changeColumn(table, oldColumn, newColumn);
|
|
384
|
-
}
|
|
385
|
-
/**
|
|
386
|
-
* Changes a column in the table.
|
|
387
|
-
*/
|
|
388
|
-
async changeColumn(tableOrName, oldTableColumnOrName, newColumn) {
|
|
389
|
-
const table = InstanceChecker.isTable(tableOrName)
|
|
390
|
-
? tableOrName
|
|
391
|
-
: await this.getCachedTable(tableOrName);
|
|
392
|
-
const oldColumn = InstanceChecker.isTableColumn(oldTableColumnOrName)
|
|
393
|
-
? oldTableColumnOrName
|
|
394
|
-
: table.columns.find((c) => c.name === oldTableColumnOrName);
|
|
395
|
-
if (!oldColumn)
|
|
396
|
-
throw new TypeORMError(`Column "${oldTableColumnOrName}" was not found in the "${table.name}" table.`);
|
|
397
|
-
await this.changeColumns(table, [{ oldColumn, newColumn }]);
|
|
398
|
-
}
|
|
399
|
-
/**
|
|
400
|
-
* Changes a column in the table.
|
|
401
|
-
* Changed column looses all its keys in the db.
|
|
402
|
-
*/
|
|
403
|
-
async changeColumns(tableOrName, changedColumns) {
|
|
404
|
-
const table = InstanceChecker.isTable(tableOrName)
|
|
405
|
-
? tableOrName
|
|
406
|
-
: await this.getCachedTable(tableOrName);
|
|
407
|
-
const changedTable = table.clone();
|
|
408
|
-
changedColumns.forEach((changedColumnSet) => {
|
|
409
|
-
if (changedColumnSet.newColumn.name !==
|
|
410
|
-
changedColumnSet.oldColumn.name) {
|
|
411
|
-
changedTable
|
|
412
|
-
.findColumnUniques(changedColumnSet.oldColumn)
|
|
413
|
-
.forEach((unique) => {
|
|
414
|
-
const uniqueName = this.connection.namingStrategy.uniqueConstraintName(table, unique.columnNames);
|
|
415
|
-
unique.columnNames.splice(unique.columnNames.indexOf(changedColumnSet.oldColumn.name), 1);
|
|
416
|
-
unique.columnNames.push(changedColumnSet.newColumn.name);
|
|
417
|
-
if (unique.name === uniqueName) {
|
|
418
|
-
unique.name =
|
|
419
|
-
this.connection.namingStrategy.uniqueConstraintName(changedTable, unique.columnNames);
|
|
420
|
-
}
|
|
421
|
-
});
|
|
422
|
-
changedTable
|
|
423
|
-
.findColumnForeignKeys(changedColumnSet.oldColumn)
|
|
424
|
-
.forEach((foreignKey) => {
|
|
425
|
-
const foreignKeyName = this.connection.namingStrategy.foreignKeyName(table, foreignKey.columnNames, this.getTablePath(foreignKey), foreignKey.referencedColumnNames);
|
|
426
|
-
foreignKey.columnNames.splice(foreignKey.columnNames.indexOf(changedColumnSet.oldColumn.name), 1);
|
|
427
|
-
foreignKey.columnNames.push(changedColumnSet.newColumn.name);
|
|
428
|
-
if (foreignKey.name === foreignKeyName) {
|
|
429
|
-
foreignKey.name =
|
|
430
|
-
this.connection.namingStrategy.foreignKeyName(changedTable, foreignKey.columnNames, this.getTablePath(foreignKey), foreignKey.referencedColumnNames);
|
|
431
|
-
}
|
|
432
|
-
});
|
|
433
|
-
changedTable
|
|
434
|
-
.findColumnIndices(changedColumnSet.oldColumn)
|
|
435
|
-
.forEach((index) => {
|
|
436
|
-
const indexName = this.connection.namingStrategy.indexName(table, index.columnNames, index.where);
|
|
437
|
-
index.columnNames.splice(index.columnNames.indexOf(changedColumnSet.oldColumn.name), 1);
|
|
438
|
-
index.columnNames.push(changedColumnSet.newColumn.name);
|
|
439
|
-
if (index.name === indexName) {
|
|
440
|
-
index.name =
|
|
441
|
-
this.connection.namingStrategy.indexName(changedTable, index.columnNames, index.where);
|
|
442
|
-
}
|
|
443
|
-
});
|
|
444
|
-
}
|
|
445
|
-
const originalColumn = changedTable.columns.find((column) => column.name === changedColumnSet.oldColumn.name);
|
|
446
|
-
if (originalColumn)
|
|
447
|
-
changedTable.columns[changedTable.columns.indexOf(originalColumn)] = changedColumnSet.newColumn;
|
|
448
|
-
});
|
|
449
|
-
await this.recreateTable(changedTable, table);
|
|
450
|
-
}
|
|
451
|
-
/**
|
|
452
|
-
* Drops column in the table.
|
|
453
|
-
*/
|
|
454
|
-
async dropColumn(tableOrName, columnOrName) {
|
|
455
|
-
const table = InstanceChecker.isTable(tableOrName)
|
|
456
|
-
? tableOrName
|
|
457
|
-
: await this.getCachedTable(tableOrName);
|
|
458
|
-
const column = InstanceChecker.isTableColumn(columnOrName)
|
|
459
|
-
? columnOrName
|
|
460
|
-
: table.findColumnByName(columnOrName);
|
|
461
|
-
if (!column)
|
|
462
|
-
throw new TypeORMError(`Column "${columnOrName}" was not found in table "${table.name}"`);
|
|
463
|
-
await this.dropColumns(table, [column]);
|
|
464
|
-
}
|
|
465
|
-
/**
|
|
466
|
-
* Drops the columns in the table.
|
|
467
|
-
*/
|
|
468
|
-
async dropColumns(tableOrName, columns) {
|
|
469
|
-
const table = InstanceChecker.isTable(tableOrName)
|
|
470
|
-
? tableOrName
|
|
471
|
-
: await this.getCachedTable(tableOrName);
|
|
472
|
-
const changedTable = table.clone();
|
|
473
|
-
columns.forEach((column) => {
|
|
474
|
-
const columnInstance = InstanceChecker.isTableColumn(column)
|
|
475
|
-
? column
|
|
476
|
-
: table.findColumnByName(column);
|
|
477
|
-
if (!columnInstance)
|
|
478
|
-
throw new Error(`Column "${column}" was not found in table "${table.name}"`);
|
|
479
|
-
changedTable.removeColumn(columnInstance);
|
|
480
|
-
changedTable
|
|
481
|
-
.findColumnUniques(columnInstance)
|
|
482
|
-
.forEach((unique) => changedTable.removeUniqueConstraint(unique));
|
|
483
|
-
changedTable
|
|
484
|
-
.findColumnIndices(columnInstance)
|
|
485
|
-
.forEach((index) => changedTable.removeIndex(index));
|
|
486
|
-
changedTable
|
|
487
|
-
.findColumnForeignKeys(columnInstance)
|
|
488
|
-
.forEach((fk) => changedTable.removeForeignKey(fk));
|
|
489
|
-
});
|
|
490
|
-
await this.recreateTable(changedTable, table);
|
|
491
|
-
}
|
|
492
|
-
/**
|
|
493
|
-
* Creates a new primary key.
|
|
494
|
-
*/
|
|
495
|
-
async createPrimaryKey(tableOrName, columnNames) {
|
|
496
|
-
const table = InstanceChecker.isTable(tableOrName)
|
|
497
|
-
? tableOrName
|
|
498
|
-
: await this.getCachedTable(tableOrName);
|
|
499
|
-
const changedTable = table.clone();
|
|
500
|
-
changedTable.columns.forEach((column) => {
|
|
501
|
-
if (columnNames.find((columnName) => columnName === column.name))
|
|
502
|
-
column.isPrimary = true;
|
|
503
|
-
});
|
|
504
|
-
await this.recreateTable(changedTable, table);
|
|
505
|
-
table.columns.forEach((column) => {
|
|
506
|
-
if (columnNames.find((columnName) => columnName === column.name))
|
|
507
|
-
column.isPrimary = true;
|
|
508
|
-
});
|
|
509
|
-
}
|
|
510
|
-
/**
|
|
511
|
-
* Updates composite primary keys.
|
|
512
|
-
*/
|
|
513
|
-
async updatePrimaryKeys(tableOrName, columns) {
|
|
514
|
-
await Promise.resolve();
|
|
515
|
-
}
|
|
516
|
-
/**
|
|
517
|
-
* Drops a primary key.
|
|
518
|
-
*/
|
|
519
|
-
async dropPrimaryKey(tableOrName) {
|
|
520
|
-
const table = InstanceChecker.isTable(tableOrName)
|
|
521
|
-
? tableOrName
|
|
522
|
-
: await this.getCachedTable(tableOrName);
|
|
523
|
-
const changedTable = table.clone();
|
|
524
|
-
changedTable.primaryColumns.forEach((column) => {
|
|
525
|
-
column.isPrimary = false;
|
|
526
|
-
});
|
|
527
|
-
await this.recreateTable(changedTable, table);
|
|
528
|
-
table.primaryColumns.forEach((column) => {
|
|
529
|
-
column.isPrimary = false;
|
|
530
|
-
});
|
|
531
|
-
}
|
|
532
|
-
/**
|
|
533
|
-
* Creates a new unique constraint.
|
|
534
|
-
*/
|
|
535
|
-
async createUniqueConstraint(tableOrName, uniqueConstraint) {
|
|
536
|
-
await this.createUniqueConstraints(tableOrName, [uniqueConstraint]);
|
|
537
|
-
}
|
|
538
|
-
/**
|
|
539
|
-
* Creates a new unique constraints.
|
|
540
|
-
*/
|
|
541
|
-
async createUniqueConstraints(tableOrName, uniqueConstraints) {
|
|
542
|
-
const table = InstanceChecker.isTable(tableOrName)
|
|
543
|
-
? tableOrName
|
|
544
|
-
: await this.getCachedTable(tableOrName);
|
|
545
|
-
const changedTable = table.clone();
|
|
546
|
-
uniqueConstraints.forEach((uniqueConstraint) => changedTable.addUniqueConstraint(uniqueConstraint));
|
|
547
|
-
await this.recreateTable(changedTable, table);
|
|
548
|
-
}
|
|
549
|
-
/**
|
|
550
|
-
* Drops an unique constraint.
|
|
551
|
-
*/
|
|
552
|
-
async dropUniqueConstraint(tableOrName, uniqueOrName) {
|
|
553
|
-
const table = InstanceChecker.isTable(tableOrName)
|
|
554
|
-
? tableOrName
|
|
555
|
-
: await this.getCachedTable(tableOrName);
|
|
556
|
-
const uniqueConstraint = InstanceChecker.isTableUnique(uniqueOrName)
|
|
557
|
-
? uniqueOrName
|
|
558
|
-
: table.uniques.find((u) => u.name === uniqueOrName);
|
|
559
|
-
if (!uniqueConstraint)
|
|
560
|
-
throw new TypeORMError(`Supplied unique constraint was not found in table ${table.name}`);
|
|
561
|
-
await this.dropUniqueConstraints(table, [uniqueConstraint]);
|
|
562
|
-
}
|
|
563
|
-
/**
|
|
564
|
-
* Creates an unique constraints.
|
|
565
|
-
*/
|
|
566
|
-
async dropUniqueConstraints(tableOrName, uniqueConstraints) {
|
|
567
|
-
const table = InstanceChecker.isTable(tableOrName)
|
|
568
|
-
? tableOrName
|
|
569
|
-
: await this.getCachedTable(tableOrName);
|
|
570
|
-
const changedTable = table.clone();
|
|
571
|
-
uniqueConstraints.forEach((uniqueConstraint) => changedTable.removeUniqueConstraint(uniqueConstraint));
|
|
572
|
-
await this.recreateTable(changedTable, table);
|
|
573
|
-
}
|
|
574
|
-
/**
|
|
575
|
-
* Creates new check constraint.
|
|
576
|
-
*/
|
|
577
|
-
async createCheckConstraint(tableOrName, checkConstraint) {
|
|
578
|
-
await this.createCheckConstraints(tableOrName, [checkConstraint]);
|
|
579
|
-
}
|
|
580
|
-
/**
|
|
581
|
-
* Creates new check constraints.
|
|
582
|
-
*/
|
|
583
|
-
async createCheckConstraints(tableOrName, checkConstraints) {
|
|
584
|
-
const table = InstanceChecker.isTable(tableOrName)
|
|
585
|
-
? tableOrName
|
|
586
|
-
: await this.getCachedTable(tableOrName);
|
|
587
|
-
const changedTable = table.clone();
|
|
588
|
-
checkConstraints.forEach((checkConstraint) => changedTable.addCheckConstraint(checkConstraint));
|
|
589
|
-
await this.recreateTable(changedTable, table);
|
|
590
|
-
}
|
|
591
|
-
/**
|
|
592
|
-
* Drops check constraint.
|
|
593
|
-
*/
|
|
594
|
-
async dropCheckConstraint(tableOrName, checkOrName) {
|
|
595
|
-
const table = InstanceChecker.isTable(tableOrName)
|
|
596
|
-
? tableOrName
|
|
597
|
-
: await this.getCachedTable(tableOrName);
|
|
598
|
-
const checkConstraint = InstanceChecker.isTableCheck(checkOrName)
|
|
599
|
-
? checkOrName
|
|
600
|
-
: table.checks.find((c) => c.name === checkOrName);
|
|
601
|
-
if (!checkConstraint)
|
|
602
|
-
throw new TypeORMError(`Supplied check constraint was not found in table ${table.name}`);
|
|
603
|
-
await this.dropCheckConstraints(table, [checkConstraint]);
|
|
604
|
-
}
|
|
605
|
-
/**
|
|
606
|
-
* Drops check constraints.
|
|
607
|
-
*/
|
|
608
|
-
async dropCheckConstraints(tableOrName, checkConstraints) {
|
|
609
|
-
const table = InstanceChecker.isTable(tableOrName)
|
|
610
|
-
? tableOrName
|
|
611
|
-
: await this.getCachedTable(tableOrName);
|
|
612
|
-
const changedTable = table.clone();
|
|
613
|
-
checkConstraints.forEach((checkConstraint) => changedTable.removeCheckConstraint(checkConstraint));
|
|
614
|
-
await this.recreateTable(changedTable, table);
|
|
615
|
-
}
|
|
616
|
-
/**
|
|
617
|
-
* Creates a new exclusion constraint.
|
|
618
|
-
*/
|
|
619
|
-
async createExclusionConstraint(tableOrName, exclusionConstraint) {
|
|
620
|
-
throw new TypeORMError(`Sqlite does not support exclusion constraints.`);
|
|
621
|
-
}
|
|
622
|
-
/**
|
|
623
|
-
* Creates a new exclusion constraints.
|
|
624
|
-
*/
|
|
625
|
-
async createExclusionConstraints(tableOrName, exclusionConstraints) {
|
|
626
|
-
throw new TypeORMError(`Sqlite does not support exclusion constraints.`);
|
|
627
|
-
}
|
|
628
|
-
/**
|
|
629
|
-
* Drops exclusion constraint.
|
|
630
|
-
*/
|
|
631
|
-
async dropExclusionConstraint(tableOrName, exclusionOrName) {
|
|
632
|
-
throw new TypeORMError(`Sqlite does not support exclusion constraints.`);
|
|
633
|
-
}
|
|
634
|
-
/**
|
|
635
|
-
* Drops exclusion constraints.
|
|
636
|
-
*/
|
|
637
|
-
async dropExclusionConstraints(tableOrName, exclusionConstraints) {
|
|
638
|
-
throw new TypeORMError(`Sqlite does not support exclusion constraints.`);
|
|
639
|
-
}
|
|
640
|
-
/**
|
|
641
|
-
* Creates a new foreign key.
|
|
642
|
-
*/
|
|
643
|
-
async createForeignKey(tableOrName, foreignKey) {
|
|
644
|
-
await this.createForeignKeys(tableOrName, [foreignKey]);
|
|
645
|
-
}
|
|
646
|
-
/**
|
|
647
|
-
* Creates a new foreign keys.
|
|
648
|
-
*/
|
|
649
|
-
async createForeignKeys(tableOrName, foreignKeys) {
|
|
650
|
-
const table = InstanceChecker.isTable(tableOrName)
|
|
651
|
-
? tableOrName
|
|
652
|
-
: await this.getCachedTable(tableOrName);
|
|
653
|
-
const changedTable = table.clone();
|
|
654
|
-
foreignKeys.forEach((foreignKey) => changedTable.addForeignKey(foreignKey));
|
|
655
|
-
await this.recreateTable(changedTable, table);
|
|
656
|
-
}
|
|
657
|
-
/**
|
|
658
|
-
* Drops a foreign key from the table.
|
|
659
|
-
*/
|
|
660
|
-
async dropForeignKey(tableOrName, foreignKeyOrName) {
|
|
661
|
-
const table = InstanceChecker.isTable(tableOrName)
|
|
662
|
-
? tableOrName
|
|
663
|
-
: await this.getCachedTable(tableOrName);
|
|
664
|
-
const foreignKey = InstanceChecker.isTableForeignKey(foreignKeyOrName)
|
|
665
|
-
? foreignKeyOrName
|
|
666
|
-
: table.foreignKeys.find((fk) => fk.name === foreignKeyOrName);
|
|
667
|
-
if (!foreignKey)
|
|
668
|
-
throw new TypeORMError(`Supplied foreign key was not found in table ${table.name}`);
|
|
669
|
-
await this.dropForeignKeys(tableOrName, [foreignKey]);
|
|
670
|
-
}
|
|
671
|
-
/**
|
|
672
|
-
* Drops a foreign keys from the table.
|
|
673
|
-
*/
|
|
674
|
-
async dropForeignKeys(tableOrName, foreignKeys) {
|
|
675
|
-
const table = InstanceChecker.isTable(tableOrName)
|
|
676
|
-
? tableOrName
|
|
677
|
-
: await this.getCachedTable(tableOrName);
|
|
678
|
-
const changedTable = table.clone();
|
|
679
|
-
foreignKeys.forEach((foreignKey) => changedTable.removeForeignKey(foreignKey));
|
|
680
|
-
await this.recreateTable(changedTable, table);
|
|
681
|
-
}
|
|
682
|
-
/**
|
|
683
|
-
* Creates a new index.
|
|
684
|
-
*/
|
|
685
|
-
async createIndex(tableOrName, index) {
|
|
686
|
-
const table = InstanceChecker.isTable(tableOrName)
|
|
687
|
-
? tableOrName
|
|
688
|
-
: await this.getCachedTable(tableOrName);
|
|
689
|
-
if (!index.name)
|
|
690
|
-
index.name = this.generateIndexName(table, index);
|
|
691
|
-
const up = this.createIndexSql(table, index);
|
|
692
|
-
const down = this.dropIndexSql(index);
|
|
693
|
-
await this.executeQueries(up, down);
|
|
694
|
-
table.addIndex(index);
|
|
695
|
-
}
|
|
696
|
-
/**
|
|
697
|
-
* Creates a new indices
|
|
698
|
-
*/
|
|
699
|
-
async createIndices(tableOrName, indices) {
|
|
700
|
-
const promises = indices.map((index) => this.createIndex(tableOrName, index));
|
|
701
|
-
await Promise.all(promises);
|
|
702
|
-
}
|
|
703
|
-
/**
|
|
704
|
-
* Drops an index from the table.
|
|
705
|
-
*/
|
|
706
|
-
async dropIndex(tableOrName, indexOrName) {
|
|
707
|
-
const table = InstanceChecker.isTable(tableOrName)
|
|
708
|
-
? tableOrName
|
|
709
|
-
: await this.getCachedTable(tableOrName);
|
|
710
|
-
const index = InstanceChecker.isTableIndex(indexOrName)
|
|
711
|
-
? indexOrName
|
|
712
|
-
: table.indices.find((i) => i.name === indexOrName);
|
|
713
|
-
if (!index)
|
|
714
|
-
throw new TypeORMError(`Supplied index ${indexOrName} was not found in table ${table.name}`);
|
|
715
|
-
if (!index.name)
|
|
716
|
-
index.name = this.generateIndexName(table, index);
|
|
717
|
-
const up = this.dropIndexSql(index);
|
|
718
|
-
const down = this.createIndexSql(table, index);
|
|
719
|
-
await this.executeQueries(up, down);
|
|
720
|
-
table.removeIndex(index);
|
|
721
|
-
}
|
|
722
|
-
/**
|
|
723
|
-
* Drops an indices from the table.
|
|
724
|
-
*/
|
|
725
|
-
async dropIndices(tableOrName, indices) {
|
|
726
|
-
const promises = indices.map((index) => this.dropIndex(tableOrName, index));
|
|
727
|
-
await Promise.all(promises);
|
|
728
|
-
}
|
|
729
|
-
/**
|
|
730
|
-
* Clears all table contents.
|
|
731
|
-
* Note: this operation uses SQL's TRUNCATE query which cannot be reverted in transactions.
|
|
732
|
-
*/
|
|
733
|
-
async clearTable(tableName) {
|
|
734
|
-
await this.query(`DELETE FROM ${this.escapePath(tableName)}`);
|
|
735
|
-
}
|
|
736
|
-
/**
|
|
737
|
-
* Removes all tables from the currently connected database.
|
|
738
|
-
*/
|
|
739
|
-
async clearDatabase(database) {
|
|
740
|
-
let dbPath = undefined;
|
|
741
|
-
if (database &&
|
|
742
|
-
this.driver.getAttachedDatabaseHandleByRelativePath(database)) {
|
|
743
|
-
dbPath =
|
|
744
|
-
this.driver.getAttachedDatabaseHandleByRelativePath(database);
|
|
745
|
-
}
|
|
746
|
-
await this.query(`PRAGMA foreign_keys = OFF`);
|
|
747
|
-
const isAnotherTransactionActive = this.isTransactionActive;
|
|
748
|
-
if (!isAnotherTransactionActive)
|
|
749
|
-
await this.startTransaction();
|
|
750
|
-
try {
|
|
751
|
-
const selectViewDropsQuery = dbPath
|
|
752
|
-
? `SELECT 'DROP VIEW "${dbPath}"."' || name || '";' as query FROM "${dbPath}"."sqlite_master" WHERE "type" = 'view'`
|
|
753
|
-
: `SELECT 'DROP VIEW "' || name || '";' as query FROM "sqlite_master" WHERE "type" = 'view'`;
|
|
754
|
-
const dropViewQueries = await this.query(selectViewDropsQuery);
|
|
755
|
-
await Promise.all(dropViewQueries.map((q) => this.query(q["query"])));
|
|
756
|
-
const selectTableDropsQuery = dbPath
|
|
757
|
-
? `SELECT 'DROP TABLE "${dbPath}"."' || name || '";' as query FROM "${dbPath}"."sqlite_master" WHERE "type" = 'table' AND "name" != 'sqlite_sequence'`
|
|
758
|
-
: `SELECT 'DROP TABLE "' || name || '";' as query FROM "sqlite_master" WHERE "type" = 'table' AND "name" != 'sqlite_sequence'`;
|
|
759
|
-
const dropTableQueries = await this.query(selectTableDropsQuery);
|
|
760
|
-
await Promise.all(dropTableQueries.map((q) => this.query(q["query"])));
|
|
761
|
-
if (!isAnotherTransactionActive)
|
|
762
|
-
await this.commitTransaction();
|
|
763
|
-
}
|
|
764
|
-
catch (error) {
|
|
765
|
-
try {
|
|
766
|
-
if (!isAnotherTransactionActive)
|
|
767
|
-
await this.rollbackTransaction();
|
|
768
|
-
}
|
|
769
|
-
catch (rollbackError) { }
|
|
770
|
-
throw error;
|
|
771
|
-
}
|
|
772
|
-
finally {
|
|
773
|
-
await this.query(`PRAGMA foreign_keys = ON`);
|
|
774
|
-
}
|
|
775
|
-
}
|
|
776
|
-
async loadViews(viewNames) {
|
|
777
|
-
const hasTable = await this.hasTable(this.getTypeormMetadataTableName());
|
|
778
|
-
if (!hasTable) {
|
|
779
|
-
return [];
|
|
780
|
-
}
|
|
781
|
-
if (!viewNames) {
|
|
782
|
-
viewNames = [];
|
|
783
|
-
}
|
|
784
|
-
const viewNamesString = viewNames
|
|
785
|
-
.map((name) => "'" + name + "'")
|
|
786
|
-
.join(", ");
|
|
787
|
-
let query = `SELECT "t".* FROM "${this.getTypeormMetadataTableName()}" "t" INNER JOIN "sqlite_master" s ON "s"."name" = "t"."name" AND "s"."type" = 'view' WHERE "t"."type" = '${MetadataTableType.VIEW}'`;
|
|
788
|
-
if (viewNamesString.length > 0)
|
|
789
|
-
query += ` AND "t"."name" IN (${viewNamesString})`;
|
|
790
|
-
const dbViews = await this.query(query);
|
|
791
|
-
return dbViews.map((dbView) => {
|
|
792
|
-
const view = new View();
|
|
793
|
-
view.name = dbView["name"];
|
|
794
|
-
view.expression = dbView["value"];
|
|
795
|
-
return view;
|
|
796
|
-
});
|
|
797
|
-
}
|
|
798
|
-
async loadTableRecords(tablePath, tableOrIndex) {
|
|
799
|
-
let database = undefined;
|
|
800
|
-
const [schema, tableName] = this.splitTablePath(tablePath);
|
|
801
|
-
if (schema &&
|
|
802
|
-
this.driver.getAttachedDatabasePathRelativeByHandle(schema)) {
|
|
803
|
-
database =
|
|
804
|
-
this.driver.getAttachedDatabasePathRelativeByHandle(schema);
|
|
805
|
-
}
|
|
806
|
-
const res = await this.query(`SELECT ${database ? `'${database}'` : null} as database, ${schema ? `'${schema}'` : null} as schema, * FROM ${schema ? `"${schema}".` : ""}${this.escapePath(`sqlite_master`)} WHERE "type" = '${tableOrIndex}' AND "${tableOrIndex === "table" ? "name" : "tbl_name"}" IN ('${tableName}')`);
|
|
807
|
-
return res;
|
|
808
|
-
}
|
|
809
|
-
async loadPragmaRecords(tablePath, pragma) {
|
|
810
|
-
const [, tableName] = this.splitTablePath(tablePath);
|
|
811
|
-
const res = await this.query(`PRAGMA ${pragma}("${tableName}")`);
|
|
812
|
-
return res;
|
|
813
|
-
}
|
|
814
|
-
/**
|
|
815
|
-
* Loads all tables (with given names) from the database and creates a Table from them.
|
|
816
|
-
*/
|
|
817
|
-
async loadTables(tableNames) {
|
|
818
|
-
if (tableNames && tableNames.length === 0) {
|
|
819
|
-
return [];
|
|
820
|
-
}
|
|
821
|
-
let dbTables = [];
|
|
822
|
-
let dbIndicesDef;
|
|
823
|
-
if (!tableNames) {
|
|
824
|
-
const tablesSql = `SELECT * FROM "sqlite_master" WHERE "type" = 'table'`;
|
|
825
|
-
dbTables.push(...(await this.query(tablesSql)));
|
|
826
|
-
const tableNamesString = dbTables
|
|
827
|
-
.map(({ name }) => `'${name}'`)
|
|
828
|
-
.join(", ");
|
|
829
|
-
dbIndicesDef = await this.query(`SELECT * FROM "sqlite_master" WHERE "type" = 'index' AND "tbl_name" IN (${tableNamesString})`);
|
|
830
|
-
}
|
|
831
|
-
else {
|
|
832
|
-
dbTables = (await Promise.all(tableNames.map((tableName) => this.loadTableRecords(tableName, "table"))))
|
|
833
|
-
.reduce((acc, res) => [...acc, ...res], [])
|
|
834
|
-
.filter(Boolean);
|
|
835
|
-
dbIndicesDef = (await Promise.all((tableNames ?? []).map((tableName) => this.loadTableRecords(tableName, "index"))))
|
|
836
|
-
.reduce((acc, res) => [...acc, ...res], [])
|
|
837
|
-
.filter(Boolean);
|
|
838
|
-
}
|
|
839
|
-
if (dbTables.length === 0) {
|
|
840
|
-
return [];
|
|
841
|
-
}
|
|
842
|
-
return Promise.all(dbTables.map(async (dbTable) => {
|
|
843
|
-
const tablePath = dbTable["database"] &&
|
|
844
|
-
this.driver.getAttachedDatabaseHandleByRelativePath(dbTable["database"])
|
|
845
|
-
? `${this.driver.getAttachedDatabaseHandleByRelativePath(dbTable["database"])}.${dbTable["name"]}`
|
|
846
|
-
: dbTable["name"];
|
|
847
|
-
const sql = dbTable["sql"];
|
|
848
|
-
const withoutRowid = sql.includes("WITHOUT ROWID");
|
|
849
|
-
const table = new Table({ name: tablePath, withoutRowid });
|
|
850
|
-
const [dbColumns, dbIndices, dbForeignKeys] = await Promise.all([
|
|
851
|
-
this.loadPragmaRecords(tablePath, `table_xinfo`),
|
|
852
|
-
this.loadPragmaRecords(tablePath, `index_list`),
|
|
853
|
-
this.loadPragmaRecords(tablePath, `foreign_key_list`),
|
|
854
|
-
]);
|
|
855
|
-
let autoIncrementColumnName = undefined;
|
|
856
|
-
const tableSql = dbTable["sql"];
|
|
857
|
-
let autoIncrementIndex = tableSql
|
|
858
|
-
.toUpperCase()
|
|
859
|
-
.indexOf("AUTOINCREMENT");
|
|
860
|
-
if (autoIncrementIndex !== -1) {
|
|
861
|
-
autoIncrementColumnName = tableSql.substr(0, autoIncrementIndex);
|
|
862
|
-
const comma = autoIncrementColumnName.lastIndexOf(",");
|
|
863
|
-
const bracket = autoIncrementColumnName.lastIndexOf("(");
|
|
864
|
-
if (comma !== -1) {
|
|
865
|
-
autoIncrementColumnName =
|
|
866
|
-
autoIncrementColumnName.substr(comma);
|
|
867
|
-
autoIncrementColumnName =
|
|
868
|
-
autoIncrementColumnName.substr(0, autoIncrementColumnName.lastIndexOf('"'));
|
|
869
|
-
autoIncrementColumnName =
|
|
870
|
-
autoIncrementColumnName.substr(autoIncrementColumnName.indexOf('"') + 1);
|
|
871
|
-
}
|
|
872
|
-
else if (bracket !== -1) {
|
|
873
|
-
autoIncrementColumnName =
|
|
874
|
-
autoIncrementColumnName.substr(bracket);
|
|
875
|
-
autoIncrementColumnName =
|
|
876
|
-
autoIncrementColumnName.substr(0, autoIncrementColumnName.lastIndexOf('"'));
|
|
877
|
-
autoIncrementColumnName =
|
|
878
|
-
autoIncrementColumnName.substr(autoIncrementColumnName.indexOf('"') + 1);
|
|
879
|
-
}
|
|
880
|
-
}
|
|
881
|
-
table.columns = await Promise.all(dbColumns.map(async (dbColumn) => {
|
|
882
|
-
const tableColumn = new TableColumn();
|
|
883
|
-
tableColumn.name = dbColumn["name"];
|
|
884
|
-
tableColumn.type = dbColumn["type"].toLowerCase();
|
|
885
|
-
tableColumn.default =
|
|
886
|
-
dbColumn["dflt_value"] !== null &&
|
|
887
|
-
dbColumn["dflt_value"] !== undefined
|
|
888
|
-
? dbColumn["dflt_value"]
|
|
889
|
-
: undefined;
|
|
890
|
-
tableColumn.isNullable = dbColumn["notnull"] === 0;
|
|
891
|
-
tableColumn.isPrimary = dbColumn["pk"] > 0;
|
|
892
|
-
tableColumn.comment = ""; // SQLite does not support column comments
|
|
893
|
-
tableColumn.isGenerated =
|
|
894
|
-
autoIncrementColumnName === dbColumn["name"];
|
|
895
|
-
if (tableColumn.isGenerated) {
|
|
896
|
-
tableColumn.generationStrategy = "increment";
|
|
897
|
-
}
|
|
898
|
-
if (dbColumn["hidden"] === 2 ||
|
|
899
|
-
dbColumn["hidden"] === 3) {
|
|
900
|
-
tableColumn.generatedType =
|
|
901
|
-
dbColumn["hidden"] === 2 ? "VIRTUAL" : "STORED";
|
|
902
|
-
const asExpressionQuery = await this.selectTypeormMetadataSql({
|
|
903
|
-
table: table.name,
|
|
904
|
-
type: MetadataTableType.GENERATED_COLUMN,
|
|
905
|
-
name: tableColumn.name,
|
|
906
|
-
});
|
|
907
|
-
const results = await this.query(asExpressionQuery.query, asExpressionQuery.parameters);
|
|
908
|
-
if (results[0] && results[0].value) {
|
|
909
|
-
tableColumn.asExpression = results[0].value;
|
|
910
|
-
}
|
|
911
|
-
else {
|
|
912
|
-
tableColumn.asExpression = "";
|
|
913
|
-
}
|
|
914
|
-
}
|
|
915
|
-
if (tableColumn.type === "varchar") {
|
|
916
|
-
const enumMatch = sql.match(new RegExp('"(' +
|
|
917
|
-
tableColumn.name +
|
|
918
|
-
")\" varchar CHECK\\s*\\(\\s*\"\\1\"\\s+IN\\s*\\(('[^']+'(?:\\s*,\\s*'[^']+')+)\\s*\\)\\s*\\)"));
|
|
919
|
-
if (enumMatch) {
|
|
920
|
-
tableColumn.enum = enumMatch[2]
|
|
921
|
-
.substr(1, enumMatch[2].length - 2)
|
|
922
|
-
.split("','");
|
|
923
|
-
}
|
|
924
|
-
}
|
|
925
|
-
let pos = tableColumn.type.indexOf("(");
|
|
926
|
-
if (pos !== -1) {
|
|
927
|
-
const fullType = tableColumn.type;
|
|
928
|
-
let dataType = fullType.substr(0, pos);
|
|
929
|
-
if (!!this.driver.withLengthColumnTypes.find((col) => col === dataType)) {
|
|
930
|
-
let len = parseInt(fullType.substring(pos + 1, fullType.length - 1));
|
|
931
|
-
if (len) {
|
|
932
|
-
tableColumn.length = len.toString();
|
|
933
|
-
tableColumn.type = dataType; // remove the length part from the datatype
|
|
934
|
-
}
|
|
935
|
-
}
|
|
936
|
-
if (!!this.driver.withPrecisionColumnTypes.find((col) => col === dataType)) {
|
|
937
|
-
const re = new RegExp(`^${dataType}\\((\\d+),?\\s?(\\d+)?\\)`);
|
|
938
|
-
const matches = fullType.match(re);
|
|
939
|
-
if (matches && matches[1]) {
|
|
940
|
-
tableColumn.precision = +matches[1];
|
|
941
|
-
}
|
|
942
|
-
if (!!this.driver.withScaleColumnTypes.find((col) => col === dataType)) {
|
|
943
|
-
if (matches && matches[2]) {
|
|
944
|
-
tableColumn.scale = +matches[2];
|
|
945
|
-
}
|
|
946
|
-
}
|
|
947
|
-
tableColumn.type = dataType; // remove the precision/scale part from the datatype
|
|
948
|
-
}
|
|
949
|
-
}
|
|
950
|
-
return tableColumn;
|
|
951
|
-
}));
|
|
952
|
-
let fkResult;
|
|
953
|
-
const fkMappings = [];
|
|
954
|
-
const fkRegex = /CONSTRAINT "([^"]*)" FOREIGN KEY ?\((.*?)\) REFERENCES "([^"]*)"/g;
|
|
955
|
-
while ((fkResult = fkRegex.exec(sql)) !== null) {
|
|
956
|
-
fkMappings.push({
|
|
957
|
-
name: fkResult[1],
|
|
958
|
-
columns: fkResult[2]
|
|
959
|
-
.substr(1, fkResult[2].length - 2)
|
|
960
|
-
.split(`", "`),
|
|
961
|
-
referencedTableName: fkResult[3],
|
|
962
|
-
});
|
|
963
|
-
}
|
|
964
|
-
const tableForeignKeyConstraints = OrmUtils.uniq(dbForeignKeys, (dbForeignKey) => dbForeignKey["id"]);
|
|
965
|
-
table.foreignKeys = tableForeignKeyConstraints.map((foreignKey) => {
|
|
966
|
-
const ownForeignKeys = dbForeignKeys.filter((dbForeignKey) => dbForeignKey["id"] === foreignKey["id"] &&
|
|
967
|
-
dbForeignKey["table"] === foreignKey["table"]);
|
|
968
|
-
const columnNames = ownForeignKeys.map((dbForeignKey) => dbForeignKey["from"]);
|
|
969
|
-
const referencedColumnNames = ownForeignKeys.map((dbForeignKey) => dbForeignKey["to"]);
|
|
970
|
-
const fkMapping = fkMappings.find((it) => it.referencedTableName ===
|
|
971
|
-
foreignKey["table"] &&
|
|
972
|
-
it.columns.every((column) => columnNames.indexOf(column) !== -1));
|
|
973
|
-
return new TableForeignKey({
|
|
974
|
-
name: fkMapping.name,
|
|
975
|
-
columnNames: columnNames,
|
|
976
|
-
referencedTableName: foreignKey["table"],
|
|
977
|
-
referencedColumnNames: referencedColumnNames,
|
|
978
|
-
onDelete: foreignKey["on_delete"],
|
|
979
|
-
onUpdate: foreignKey["on_update"],
|
|
980
|
-
});
|
|
981
|
-
});
|
|
982
|
-
let uniqueRegexResult;
|
|
983
|
-
const uniqueMappings = [];
|
|
984
|
-
const uniqueRegex = /CONSTRAINT "([^"]*)" UNIQUE ?\((.*?)\)/g;
|
|
985
|
-
while ((uniqueRegexResult = uniqueRegex.exec(sql)) !== null) {
|
|
986
|
-
uniqueMappings.push({
|
|
987
|
-
name: uniqueRegexResult[1],
|
|
988
|
-
columns: uniqueRegexResult[2]
|
|
989
|
-
.substr(1, uniqueRegexResult[2].length - 2)
|
|
990
|
-
.split(`", "`),
|
|
991
|
-
});
|
|
992
|
-
}
|
|
993
|
-
const tableUniquePromises = dbIndices
|
|
994
|
-
.filter((dbIndex) => dbIndex["origin"] === "u")
|
|
995
|
-
.map((dbIndex) => dbIndex["name"])
|
|
996
|
-
.filter((value, index, self) => self.indexOf(value) === index)
|
|
997
|
-
.map(async (dbIndexName) => {
|
|
998
|
-
const dbIndex = dbIndices.find((dbIndex) => dbIndex["name"] === dbIndexName);
|
|
999
|
-
const indexInfos = await this.query(`PRAGMA index_info("${dbIndex["name"]}")`);
|
|
1000
|
-
const indexColumns = indexInfos
|
|
1001
|
-
.sort((indexInfo1, indexInfo2) => parseInt(indexInfo1["seqno"]) -
|
|
1002
|
-
parseInt(indexInfo2["seqno"]))
|
|
1003
|
-
.map((indexInfo) => indexInfo["name"]);
|
|
1004
|
-
if (indexColumns.length === 1) {
|
|
1005
|
-
const column = table.columns.find((column) => {
|
|
1006
|
-
return !!indexColumns.find((indexColumn) => indexColumn === column.name);
|
|
1007
|
-
});
|
|
1008
|
-
if (column)
|
|
1009
|
-
column.isUnique = true;
|
|
1010
|
-
}
|
|
1011
|
-
const foundMapping = uniqueMappings.find((mapping) => {
|
|
1012
|
-
return mapping.columns.every((column) => indexColumns.indexOf(column) !== -1);
|
|
1013
|
-
});
|
|
1014
|
-
return new TableUnique({
|
|
1015
|
-
name: foundMapping
|
|
1016
|
-
? foundMapping.name
|
|
1017
|
-
: this.connection.namingStrategy.uniqueConstraintName(table, indexColumns),
|
|
1018
|
-
columnNames: indexColumns,
|
|
1019
|
-
});
|
|
1020
|
-
});
|
|
1021
|
-
table.uniques = (await Promise.all(tableUniquePromises));
|
|
1022
|
-
let result;
|
|
1023
|
-
const regexp = /CONSTRAINT "([^"]*)" CHECK ?(\(.*?\))([,]|[)]$)/g;
|
|
1024
|
-
while ((result = regexp.exec(sql)) !== null) {
|
|
1025
|
-
table.checks.push(new TableCheck({
|
|
1026
|
-
name: result[1],
|
|
1027
|
-
expression: result[2],
|
|
1028
|
-
}));
|
|
1029
|
-
}
|
|
1030
|
-
const indicesPromises = dbIndices
|
|
1031
|
-
.filter((dbIndex) => dbIndex["origin"] === "c")
|
|
1032
|
-
.map((dbIndex) => dbIndex["name"])
|
|
1033
|
-
.filter((value, index, self) => self.indexOf(value) === index) // unqiue
|
|
1034
|
-
.map(async (dbIndexName) => {
|
|
1035
|
-
const indexDef = dbIndicesDef.find((dbIndexDef) => dbIndexDef["name"] === dbIndexName);
|
|
1036
|
-
const condition = /WHERE (.*)/.exec(indexDef["sql"]);
|
|
1037
|
-
const dbIndex = dbIndices.find((dbIndex) => dbIndex["name"] === dbIndexName);
|
|
1038
|
-
const indexInfos = await this.query(`PRAGMA index_info("${dbIndex["name"]}")`);
|
|
1039
|
-
const indexColumns = indexInfos
|
|
1040
|
-
.sort((indexInfo1, indexInfo2) => parseInt(indexInfo1["seqno"]) -
|
|
1041
|
-
parseInt(indexInfo2["seqno"]))
|
|
1042
|
-
.map((indexInfo) => indexInfo["name"]);
|
|
1043
|
-
const dbIndexPath = `${dbTable["database"] ? `${dbTable["database"]}.` : ""}${dbIndex["name"]}`;
|
|
1044
|
-
const isUnique = dbIndex["unique"] === "1" ||
|
|
1045
|
-
dbIndex["unique"] === 1;
|
|
1046
|
-
return new TableIndex({
|
|
1047
|
-
table: table,
|
|
1048
|
-
name: dbIndexPath,
|
|
1049
|
-
columnNames: indexColumns,
|
|
1050
|
-
isUnique: isUnique,
|
|
1051
|
-
where: condition ? condition[1] : undefined,
|
|
1052
|
-
});
|
|
1053
|
-
});
|
|
1054
|
-
const indices = await Promise.all(indicesPromises);
|
|
1055
|
-
table.indices = indices.filter((index) => !!index);
|
|
1056
|
-
return table;
|
|
1057
|
-
}));
|
|
1058
|
-
}
|
|
1059
|
-
/**
|
|
1060
|
-
* Builds create table sql.
|
|
1061
|
-
*/
|
|
1062
|
-
createTableSql(table, createForeignKeys, temporaryTable) {
|
|
1063
|
-
const primaryColumns = table.columns.filter((column) => column.isPrimary);
|
|
1064
|
-
const hasAutoIncrement = primaryColumns.find((column) => column.isGenerated && column.generationStrategy === "increment");
|
|
1065
|
-
const skipPrimary = primaryColumns.length > 1;
|
|
1066
|
-
if (skipPrimary && hasAutoIncrement)
|
|
1067
|
-
throw new TypeORMError(`Sqlite does not support AUTOINCREMENT on composite primary key`);
|
|
1068
|
-
const columnDefinitions = table.columns
|
|
1069
|
-
.map((column) => this.buildCreateColumnSql(column, skipPrimary))
|
|
1070
|
-
.join(", ");
|
|
1071
|
-
const [database] = this.splitTablePath(table.name);
|
|
1072
|
-
let sql = `CREATE TABLE ${this.escapePath(table.name)} (${columnDefinitions}`;
|
|
1073
|
-
let [databaseNew, tableName] = this.splitTablePath(table.name);
|
|
1074
|
-
const newTableName = temporaryTable
|
|
1075
|
-
? `${databaseNew ? `${databaseNew}.` : ""}${tableName.replace(/^temporary_/, "")}`
|
|
1076
|
-
: table.name;
|
|
1077
|
-
table.columns
|
|
1078
|
-
.filter((column) => column.isUnique)
|
|
1079
|
-
.forEach((column) => {
|
|
1080
|
-
const isUniqueExist = table.uniques.some((unique) => unique.columnNames.length === 1 &&
|
|
1081
|
-
unique.columnNames[0] === column.name);
|
|
1082
|
-
if (!isUniqueExist)
|
|
1083
|
-
table.uniques.push(new TableUnique({
|
|
1084
|
-
name: this.connection.namingStrategy.uniqueConstraintName(table, [column.name]),
|
|
1085
|
-
columnNames: [column.name],
|
|
1086
|
-
}));
|
|
1087
|
-
});
|
|
1088
|
-
if (table.uniques.length > 0) {
|
|
1089
|
-
const uniquesSql = table.uniques
|
|
1090
|
-
.map((unique) => {
|
|
1091
|
-
const uniqueName = unique.name
|
|
1092
|
-
? unique.name
|
|
1093
|
-
: this.connection.namingStrategy.uniqueConstraintName(newTableName, unique.columnNames);
|
|
1094
|
-
const columnNames = unique.columnNames
|
|
1095
|
-
.map((columnName) => `"${columnName}"`)
|
|
1096
|
-
.join(", ");
|
|
1097
|
-
return `CONSTRAINT "${uniqueName}" UNIQUE (${columnNames})`;
|
|
1098
|
-
})
|
|
1099
|
-
.join(", ");
|
|
1100
|
-
sql += `, ${uniquesSql}`;
|
|
1101
|
-
}
|
|
1102
|
-
if (table.checks.length > 0) {
|
|
1103
|
-
const checksSql = table.checks
|
|
1104
|
-
.map((check) => {
|
|
1105
|
-
const checkName = check.name
|
|
1106
|
-
? check.name
|
|
1107
|
-
: this.connection.namingStrategy.checkConstraintName(newTableName, check.expression);
|
|
1108
|
-
return `CONSTRAINT "${checkName}" CHECK (${check.expression})`;
|
|
1109
|
-
})
|
|
1110
|
-
.join(", ");
|
|
1111
|
-
sql += `, ${checksSql}`;
|
|
1112
|
-
}
|
|
1113
|
-
if (table.foreignKeys.length > 0 && createForeignKeys) {
|
|
1114
|
-
const foreignKeysSql = table.foreignKeys
|
|
1115
|
-
.filter((fk) => {
|
|
1116
|
-
const [referencedDatabase] = this.splitTablePath(fk.referencedTableName);
|
|
1117
|
-
if (referencedDatabase !== database) {
|
|
1118
|
-
return false;
|
|
1119
|
-
}
|
|
1120
|
-
return true;
|
|
1121
|
-
})
|
|
1122
|
-
.map((fk) => {
|
|
1123
|
-
const [, referencedTable] = this.splitTablePath(fk.referencedTableName);
|
|
1124
|
-
const columnNames = fk.columnNames
|
|
1125
|
-
.map((columnName) => `"${columnName}"`)
|
|
1126
|
-
.join(", ");
|
|
1127
|
-
if (!fk.name)
|
|
1128
|
-
fk.name = this.connection.namingStrategy.foreignKeyName(newTableName, fk.columnNames, this.getTablePath(fk), fk.referencedColumnNames);
|
|
1129
|
-
const referencedColumnNames = fk.referencedColumnNames
|
|
1130
|
-
.map((columnName) => `"${columnName}"`)
|
|
1131
|
-
.join(", ");
|
|
1132
|
-
let constraint = `CONSTRAINT "${fk.name}" FOREIGN KEY (${columnNames}) REFERENCES "${referencedTable}" (${referencedColumnNames})`;
|
|
1133
|
-
if (fk.onDelete)
|
|
1134
|
-
constraint += ` ON DELETE ${fk.onDelete}`;
|
|
1135
|
-
if (fk.onUpdate)
|
|
1136
|
-
constraint += ` ON UPDATE ${fk.onUpdate}`;
|
|
1137
|
-
if (fk.deferrable)
|
|
1138
|
-
constraint += ` DEFERRABLE ${fk.deferrable}`;
|
|
1139
|
-
return constraint;
|
|
1140
|
-
})
|
|
1141
|
-
.join(", ");
|
|
1142
|
-
sql += `, ${foreignKeysSql}`;
|
|
1143
|
-
}
|
|
1144
|
-
if (primaryColumns.length > 1) {
|
|
1145
|
-
const columnNames = primaryColumns
|
|
1146
|
-
.map((column) => `"${column.name}"`)
|
|
1147
|
-
.join(", ");
|
|
1148
|
-
sql += `, PRIMARY KEY (${columnNames})`;
|
|
1149
|
-
}
|
|
1150
|
-
sql += `)`;
|
|
1151
|
-
if (table.withoutRowid) {
|
|
1152
|
-
sql += " WITHOUT ROWID";
|
|
1153
|
-
}
|
|
1154
|
-
return new Query(sql);
|
|
1155
|
-
}
|
|
1156
|
-
/**
|
|
1157
|
-
* Builds drop table sql.
|
|
1158
|
-
*/
|
|
1159
|
-
dropTableSql(tableOrName, ifExist) {
|
|
1160
|
-
const tableName = InstanceChecker.isTable(tableOrName)
|
|
1161
|
-
? tableOrName.name
|
|
1162
|
-
: tableOrName;
|
|
1163
|
-
const query = ifExist
|
|
1164
|
-
? `DROP TABLE IF EXISTS ${this.escapePath(tableName)}`
|
|
1165
|
-
: `DROP TABLE ${this.escapePath(tableName)}`;
|
|
1166
|
-
return new Query(query);
|
|
1167
|
-
}
|
|
1168
|
-
createViewSql(view) {
|
|
1169
|
-
if (typeof view.expression === "string") {
|
|
1170
|
-
return new Query(`CREATE VIEW "${view.name}" AS ${view.expression}`);
|
|
1171
|
-
}
|
|
1172
|
-
else {
|
|
1173
|
-
return new Query(`CREATE VIEW "${view.name}" AS ${view
|
|
1174
|
-
.expression(this.connection)
|
|
1175
|
-
.getQuery()}`);
|
|
1176
|
-
}
|
|
1177
|
-
}
|
|
1178
|
-
insertViewDefinitionSql(view) {
|
|
1179
|
-
const expression = typeof view.expression === "string"
|
|
1180
|
-
? view.expression.trim()
|
|
1181
|
-
: view.expression(this.connection).getQuery();
|
|
1182
|
-
return this.insertTypeormMetadataSql({
|
|
1183
|
-
type: MetadataTableType.VIEW,
|
|
1184
|
-
name: view.name,
|
|
1185
|
-
value: expression,
|
|
1186
|
-
});
|
|
1187
|
-
}
|
|
1188
|
-
/**
|
|
1189
|
-
* Builds drop view sql.
|
|
1190
|
-
*/
|
|
1191
|
-
dropViewSql(viewOrPath) {
|
|
1192
|
-
const viewName = InstanceChecker.isView(viewOrPath)
|
|
1193
|
-
? viewOrPath.name
|
|
1194
|
-
: viewOrPath;
|
|
1195
|
-
return new Query(`DROP VIEW "${viewName}"`);
|
|
1196
|
-
}
|
|
1197
|
-
/**
|
|
1198
|
-
* Builds remove view sql.
|
|
1199
|
-
*/
|
|
1200
|
-
deleteViewDefinitionSql(viewOrPath) {
|
|
1201
|
-
const viewName = InstanceChecker.isView(viewOrPath)
|
|
1202
|
-
? viewOrPath.name
|
|
1203
|
-
: viewOrPath;
|
|
1204
|
-
return this.deleteTypeormMetadataSql({
|
|
1205
|
-
type: MetadataTableType.VIEW,
|
|
1206
|
-
name: viewName,
|
|
1207
|
-
});
|
|
1208
|
-
}
|
|
1209
|
-
/**
|
|
1210
|
-
* Builds create index sql.
|
|
1211
|
-
*/
|
|
1212
|
-
createIndexSql(table, index) {
|
|
1213
|
-
const columns = index.columnNames
|
|
1214
|
-
.map((columnName) => `"${columnName}"`)
|
|
1215
|
-
.join(", ");
|
|
1216
|
-
const [database, tableName] = this.splitTablePath(table.name);
|
|
1217
|
-
return new Query(`CREATE ${index.isUnique ? "UNIQUE " : ""}INDEX ${database ? `"${database}".` : ""}${this.escapePath(index.name)} ON "${tableName}" (${columns}) ${index.where ? "WHERE " + index.where : ""}`);
|
|
1218
|
-
}
|
|
1219
|
-
/**
|
|
1220
|
-
* Builds drop index sql.
|
|
1221
|
-
*/
|
|
1222
|
-
dropIndexSql(indexOrName) {
|
|
1223
|
-
let indexName = InstanceChecker.isTableIndex(indexOrName)
|
|
1224
|
-
? indexOrName.name
|
|
1225
|
-
: indexOrName;
|
|
1226
|
-
return new Query(`DROP INDEX ${this.escapePath(indexName)}`);
|
|
1227
|
-
}
|
|
1228
|
-
/**
|
|
1229
|
-
* Builds a query for create column.
|
|
1230
|
-
*/
|
|
1231
|
-
buildCreateColumnSql(column, skipPrimary) {
|
|
1232
|
-
let c = '"' + column.name + '"';
|
|
1233
|
-
if (InstanceChecker.isColumnMetadata(column)) {
|
|
1234
|
-
c += " " + this.driver.normalizeType(column);
|
|
1235
|
-
}
|
|
1236
|
-
else {
|
|
1237
|
-
c += " " + this.connection.driver.createFullType(column);
|
|
1238
|
-
}
|
|
1239
|
-
if (column.enum)
|
|
1240
|
-
c +=
|
|
1241
|
-
' CHECK( "' +
|
|
1242
|
-
column.name +
|
|
1243
|
-
'" IN (' +
|
|
1244
|
-
column.enum.map((val) => "'" + val + "'").join(",") +
|
|
1245
|
-
") )";
|
|
1246
|
-
if (column.isPrimary && !skipPrimary)
|
|
1247
|
-
c += " PRIMARY KEY";
|
|
1248
|
-
if (column.isGenerated === true &&
|
|
1249
|
-
column.generationStrategy === "increment")
|
|
1250
|
-
c += " AUTOINCREMENT";
|
|
1251
|
-
if (column.collation)
|
|
1252
|
-
c += " COLLATE " + column.collation;
|
|
1253
|
-
if (column.isNullable !== true)
|
|
1254
|
-
c += " NOT NULL";
|
|
1255
|
-
if (column.asExpression) {
|
|
1256
|
-
c += ` AS (${column.asExpression}) ${column.generatedType ? column.generatedType : "VIRTUAL"}`;
|
|
1257
|
-
}
|
|
1258
|
-
else {
|
|
1259
|
-
if (column.default !== undefined && column.default !== null)
|
|
1260
|
-
c += " DEFAULT (" + column.default + ")";
|
|
1261
|
-
}
|
|
1262
|
-
return c;
|
|
1263
|
-
}
|
|
1264
|
-
async recreateTable(newTable, oldTable, migrateData = true) {
|
|
1265
|
-
const upQueries = [];
|
|
1266
|
-
const downQueries = [];
|
|
1267
|
-
oldTable.indices.forEach((index) => {
|
|
1268
|
-
upQueries.push(this.dropIndexSql(index));
|
|
1269
|
-
downQueries.push(this.createIndexSql(oldTable, index));
|
|
1270
|
-
});
|
|
1271
|
-
let [databaseNew, tableNameNew] = this.splitTablePath(newTable.name);
|
|
1272
|
-
let [, tableNameOld] = this.splitTablePath(oldTable.name);
|
|
1273
|
-
newTable.name = tableNameNew = `${databaseNew ? `${databaseNew}.` : ""}temporary_${tableNameNew}`;
|
|
1274
|
-
upQueries.push(this.createTableSql(newTable, true, true));
|
|
1275
|
-
downQueries.push(this.dropTableSql(newTable));
|
|
1276
|
-
if (migrateData) {
|
|
1277
|
-
let newColumnNames = newTable.columns
|
|
1278
|
-
.filter((column) => !column.generatedType)
|
|
1279
|
-
.map((column) => `"${column.name}"`);
|
|
1280
|
-
let oldColumnNames = oldTable.columns
|
|
1281
|
-
.filter((column) => !column.generatedType)
|
|
1282
|
-
.map((column) => `"${column.name}"`);
|
|
1283
|
-
if (oldColumnNames.length < newColumnNames.length) {
|
|
1284
|
-
newColumnNames = newTable.columns
|
|
1285
|
-
.filter((column) => {
|
|
1286
|
-
const oldColumn = oldTable.columns.find((c) => c.name === column.name);
|
|
1287
|
-
if (oldColumn && oldColumn.generatedType)
|
|
1288
|
-
return false;
|
|
1289
|
-
return !column.generatedType && oldColumn;
|
|
1290
|
-
})
|
|
1291
|
-
.map((column) => `"${column.name}"`);
|
|
1292
|
-
}
|
|
1293
|
-
else if (oldColumnNames.length > newColumnNames.length) {
|
|
1294
|
-
oldColumnNames = oldTable.columns
|
|
1295
|
-
.filter((column) => {
|
|
1296
|
-
return (!column.generatedType &&
|
|
1297
|
-
newTable.columns.find((c) => c.name === column.name));
|
|
1298
|
-
})
|
|
1299
|
-
.map((column) => `"${column.name}"`);
|
|
1300
|
-
}
|
|
1301
|
-
upQueries.push(new Query(`INSERT INTO ${this.escapePath(newTable.name)}(${newColumnNames.join(", ")}) SELECT ${oldColumnNames.join(", ")} FROM ${this.escapePath(oldTable.name)}`));
|
|
1302
|
-
downQueries.push(new Query(`INSERT INTO ${this.escapePath(oldTable.name)}(${oldColumnNames.join(", ")}) SELECT ${newColumnNames.join(", ")} FROM ${this.escapePath(newTable.name)}`));
|
|
1303
|
-
}
|
|
1304
|
-
upQueries.push(this.dropTableSql(oldTable));
|
|
1305
|
-
downQueries.push(this.createTableSql(oldTable, true));
|
|
1306
|
-
upQueries.push(new Query(`ALTER TABLE ${this.escapePath(newTable.name)} RENAME TO ${this.escapePath(tableNameOld)}`));
|
|
1307
|
-
downQueries.push(new Query(`ALTER TABLE ${this.escapePath(oldTable.name)} RENAME TO ${this.escapePath(tableNameNew)}`));
|
|
1308
|
-
newTable.name = oldTable.name;
|
|
1309
|
-
newTable.indices.forEach((index) => {
|
|
1310
|
-
if (!index.name)
|
|
1311
|
-
index.name = this.connection.namingStrategy.indexName(newTable, index.columnNames, index.where);
|
|
1312
|
-
upQueries.push(this.createIndexSql(newTable, index));
|
|
1313
|
-
downQueries.push(this.dropIndexSql(index));
|
|
1314
|
-
});
|
|
1315
|
-
oldTable.columns
|
|
1316
|
-
.filter((column) => {
|
|
1317
|
-
const newTableColumn = newTable.columns.find((c) => c.name === column.name);
|
|
1318
|
-
return (column.generatedType &&
|
|
1319
|
-
column.asExpression &&
|
|
1320
|
-
(!newTableColumn ||
|
|
1321
|
-
(!newTableColumn.generatedType &&
|
|
1322
|
-
!newTableColumn.asExpression)));
|
|
1323
|
-
})
|
|
1324
|
-
.forEach((column) => {
|
|
1325
|
-
const deleteQuery = this.deleteTypeormMetadataSql({
|
|
1326
|
-
table: oldTable.name,
|
|
1327
|
-
type: MetadataTableType.GENERATED_COLUMN,
|
|
1328
|
-
name: column.name,
|
|
1329
|
-
});
|
|
1330
|
-
const insertQuery = this.insertTypeormMetadataSql({
|
|
1331
|
-
table: oldTable.name,
|
|
1332
|
-
type: MetadataTableType.GENERATED_COLUMN,
|
|
1333
|
-
name: column.name,
|
|
1334
|
-
value: column.asExpression,
|
|
1335
|
-
});
|
|
1336
|
-
upQueries.push(deleteQuery);
|
|
1337
|
-
downQueries.push(insertQuery);
|
|
1338
|
-
});
|
|
1339
|
-
newTable.columns
|
|
1340
|
-
.filter((column) => column.generatedType &&
|
|
1341
|
-
column.asExpression &&
|
|
1342
|
-
!oldTable.columns.some((c) => c.name === column.name))
|
|
1343
|
-
.forEach((column) => {
|
|
1344
|
-
const insertQuery = this.insertTypeormMetadataSql({
|
|
1345
|
-
table: newTable.name,
|
|
1346
|
-
type: MetadataTableType.GENERATED_COLUMN,
|
|
1347
|
-
name: column.name,
|
|
1348
|
-
value: column.asExpression,
|
|
1349
|
-
});
|
|
1350
|
-
const deleteQuery = this.deleteTypeormMetadataSql({
|
|
1351
|
-
table: newTable.name,
|
|
1352
|
-
type: MetadataTableType.GENERATED_COLUMN,
|
|
1353
|
-
name: column.name,
|
|
1354
|
-
});
|
|
1355
|
-
upQueries.push(insertQuery);
|
|
1356
|
-
downQueries.push(deleteQuery);
|
|
1357
|
-
});
|
|
1358
|
-
newTable.columns
|
|
1359
|
-
.filter((column) => column.generatedType && column.asExpression)
|
|
1360
|
-
.forEach((column) => {
|
|
1361
|
-
const oldColumn = oldTable.columns.find((c) => c.name === column.name &&
|
|
1362
|
-
c.generatedType &&
|
|
1363
|
-
column.generatedType &&
|
|
1364
|
-
c.asExpression !== column.asExpression);
|
|
1365
|
-
if (!oldColumn)
|
|
1366
|
-
return;
|
|
1367
|
-
const deleteQuery = this.deleteTypeormMetadataSql({
|
|
1368
|
-
table: oldTable.name,
|
|
1369
|
-
type: MetadataTableType.GENERATED_COLUMN,
|
|
1370
|
-
name: oldColumn.name,
|
|
1371
|
-
});
|
|
1372
|
-
const insertQuery = this.insertTypeormMetadataSql({
|
|
1373
|
-
table: newTable.name,
|
|
1374
|
-
type: MetadataTableType.GENERATED_COLUMN,
|
|
1375
|
-
name: column.name,
|
|
1376
|
-
value: column.asExpression,
|
|
1377
|
-
});
|
|
1378
|
-
upQueries.push(deleteQuery);
|
|
1379
|
-
upQueries.push(insertQuery);
|
|
1380
|
-
const revertInsertQuery = this.insertTypeormMetadataSql({
|
|
1381
|
-
table: newTable.name,
|
|
1382
|
-
type: MetadataTableType.GENERATED_COLUMN,
|
|
1383
|
-
name: oldColumn.name,
|
|
1384
|
-
value: oldColumn.asExpression,
|
|
1385
|
-
});
|
|
1386
|
-
const revertDeleteQuery = this.deleteTypeormMetadataSql({
|
|
1387
|
-
table: oldTable.name,
|
|
1388
|
-
type: MetadataTableType.GENERATED_COLUMN,
|
|
1389
|
-
name: column.name,
|
|
1390
|
-
});
|
|
1391
|
-
downQueries.push(revertInsertQuery);
|
|
1392
|
-
downQueries.push(revertDeleteQuery);
|
|
1393
|
-
});
|
|
1394
|
-
await this.executeQueries(upQueries, downQueries);
|
|
1395
|
-
this.replaceCachedTable(oldTable, newTable);
|
|
1396
|
-
}
|
|
1397
|
-
/**
|
|
1398
|
-
* tablePath e.g. "myDB.myTable", "myTable"
|
|
1399
|
-
*/
|
|
1400
|
-
splitTablePath(tablePath) {
|
|
1401
|
-
return (tablePath.indexOf(".") !== -1
|
|
1402
|
-
? tablePath.split(".")
|
|
1403
|
-
: [undefined, tablePath]);
|
|
1404
|
-
}
|
|
1405
|
-
/**
|
|
1406
|
-
* Escapes given table or view path. Tolerates leading/trailing dots
|
|
1407
|
-
*/
|
|
1408
|
-
escapePath(target, disableEscape) {
|
|
1409
|
-
const tableName = InstanceChecker.isTable(target) || InstanceChecker.isView(target)
|
|
1410
|
-
? target.name
|
|
1411
|
-
: target;
|
|
1412
|
-
return tableName
|
|
1413
|
-
.replace(/^\.+|\.+$/g, "")
|
|
1414
|
-
.split(".")
|
|
1415
|
-
.map((i) => (disableEscape ? i : `"${i}"`))
|
|
1416
|
-
.join(".");
|
|
1417
|
-
}
|
|
1418
|
-
}
|
|
1419
|
-
;
|
|
1420
|
-
({}); // @--end-of-file-for-module=taon-typeorm lib/typeorm/driver/sqlite-abstract/AbstractSqliteQueryRunner.ts
|
|
1421
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RtcC1saWJzLWZvci1kaXN0L3Rhb24tdHlwZW9ybS9wcm9qZWN0cy90YW9uLXR5cGVvcm0vc3JjL2xpYi90eXBlb3JtL2RyaXZlci9zcWxpdGUtYWJzdHJhY3QvQWJzdHJhY3RTcWxpdGVRdWVyeVJ1bm5lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQSxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQTtBQUNuRixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0NBQXdDLENBQUE7QUFDcEUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGtDQUFrQyxDQUFBO0FBQ3hELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQTtBQUNsRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNENBQTRDLENBQUE7QUFDNUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGdDQUFnQyxDQUFBO0FBQ3JELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxVQUFVLENBQUE7QUFNaEMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdDQUF3QyxDQUFBO0FBQ3BFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQTtBQUNwRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0scUJBQXFCLENBQUE7QUFDOUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHVDQUF1QyxDQUFBO0FBR2xFLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxZQUFZLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFDMUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNEJBQTRCLENBQUE7QUFDOUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDRCQUE0QixDQUFBO0FBRTVEOztHQUVHO0FBQ0gsTUFBTSxPQUFnQix5QkFDbEIsU0FBUSxlQUFlO0lBa0J2QjtRQUNJLEtBQUssRUFBRSxDQUFBO1FBUEQsdUJBQWtCLEdBQXdCLElBQUksQ0FBQTtJQVF4RCxDQUFDO0lBTUQ7OztPQUdHO0lBQ0gsT0FBTztRQUNILE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUE7SUFDMUQsQ0FBQztJQUVEOzs7T0FHRztJQUNILE9BQU87UUFDSCxJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQTtRQUN0QixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUE7UUFDckIsT0FBTyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUE7SUFDNUIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLGdCQUFnQixDQUFDLGNBQStCO1FBQ2xELElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsS0FBSyxNQUFNO1lBQ3pDLE1BQU0sSUFBSSxZQUFZLENBQ2xCLG9DQUFvQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxHQUFHLENBQzdFLENBQUE7UUFFTCxJQUNJLElBQUksQ0FBQyxtQkFBbUI7WUFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsS0FBSyxRQUFRO1lBRTNDLE1BQU0sSUFBSSw4QkFBOEIsRUFBRSxDQUFBO1FBRTlDLElBQ0ksY0FBYztZQUNkLGNBQWMsS0FBSyxrQkFBa0I7WUFDckMsY0FBYyxLQUFLLGNBQWM7WUFFakMsTUFBTSxJQUFJLFlBQVksQ0FDbEIsa0VBQWtFLENBQ3JFLENBQUE7UUFFTCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFBO1FBQy9CLElBQUksQ0FBQztZQUNELE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsd0JBQXdCLENBQUMsQ0FBQTtRQUM5RCxDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNYLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUE7WUFDaEMsTUFBTSxHQUFHLENBQUE7UUFDYixDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDOUIsSUFBSSxjQUFjLEVBQUUsQ0FBQztnQkFDakIsSUFBSSxjQUFjLEtBQUssa0JBQWtCLEVBQUUsQ0FBQztvQkFDeEMsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLGdDQUFnQyxDQUFDLENBQUE7Z0JBQ3RELENBQUM7cUJBQU0sQ0FBQztvQkFDSixNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsaUNBQWlDLENBQUMsQ0FBQTtnQkFDdkQsQ0FBQztZQUNMLENBQUM7WUFDRCxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQUMsQ0FBQTtRQUN6QyxDQUFDO2FBQU0sQ0FBQztZQUNKLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQTtRQUNsRSxDQUFDO1FBQ0QsSUFBSSxDQUFDLGdCQUFnQixJQUFJLENBQUMsQ0FBQTtRQUUxQixNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLHVCQUF1QixDQUFDLENBQUE7SUFDN0QsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxpQkFBaUI7UUFDbkIsSUFBSSxDQUFDLElBQUksQ0FBQyxtQkFBbUI7WUFBRSxNQUFNLElBQUksMEJBQTBCLEVBQUUsQ0FBQTtRQUVyRSxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLHlCQUF5QixDQUFDLENBQUE7UUFFM0QsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDNUIsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUNaLDZCQUE2QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxFQUFFLENBQzNELENBQUE7UUFDTCxDQUFDO2FBQU0sQ0FBQztZQUNKLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQTtZQUMxQixJQUFJLENBQUMsbUJBQW1CLEdBQUcsS0FBSyxDQUFBO1FBQ3BDLENBQUM7UUFDRCxJQUFJLENBQUMsZ0JBQWdCLElBQUksQ0FBQyxDQUFBO1FBRTFCLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsd0JBQXdCLENBQUMsQ0FBQTtJQUM5RCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLG1CQUFtQjtRQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQjtZQUFFLE1BQU0sSUFBSSwwQkFBMEIsRUFBRSxDQUFBO1FBRXJFLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsMkJBQTJCLENBQUMsQ0FBQTtRQUU3RCxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUM1QixNQUFNLElBQUksQ0FBQyxLQUFLLENBQ1osaUNBQWlDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLEVBQUUsQ0FDL0QsQ0FBQTtRQUNMLENBQUM7YUFBTSxDQUFDO1lBQ0osTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFBO1lBQzVCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUE7UUFDcEMsQ0FBQztRQUNELElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxDQUFDLENBQUE7UUFFMUIsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQywwQkFBMEIsQ0FBQyxDQUFBO0lBQ2hFLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FDRixLQUFhLEVBQ2IsVUFBa0IsRUFDbEIsS0FBZ0IsRUFDaEIsT0FBa0I7UUFNbEIsTUFBTSxJQUFJLFlBQVksQ0FBQywyQ0FBMkMsQ0FBQyxDQUFBO0lBQ3ZFLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxZQUFZO1FBQ2QsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBQzlCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsVUFBVSxDQUFDLFFBQWlCO1FBQzlCLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUM5QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsV0FBVyxDQUFDLFFBQWdCO1FBQzlCLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUNqQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsa0JBQWtCO1FBQ3BCLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQTtJQUNyQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsU0FBUyxDQUFDLE1BQWM7UUFDMUIsTUFBTSxJQUFJLFlBQVksQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFBO0lBQ3hFLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxnQkFBZ0I7UUFDbEIsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFBO0lBQ3JDLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxRQUFRLENBQUMsV0FBMkI7UUFDdEMsTUFBTSxTQUFTLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUM7WUFDbEQsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJO1lBQ2xCLENBQUMsQ0FBQyxXQUFXLENBQUE7UUFDakIsTUFBTSxHQUFHLEdBQUcsc0VBQXNFLFNBQVMsR0FBRyxDQUFBO1FBQzlGLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUNwQyxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFBO0lBQ3ZDLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxTQUFTLENBQ1gsV0FBMkIsRUFDM0IsVUFBa0I7UUFFbEIsTUFBTSxTQUFTLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUM7WUFDbEQsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJO1lBQ2xCLENBQUMsQ0FBQyxXQUFXLENBQUE7UUFDakIsTUFBTSxHQUFHLEdBQUcsc0JBQXNCLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQTtRQUMvRCxNQUFNLE9BQU8sR0FBb0IsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ3RELE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxVQUFVLENBQUMsQ0FBQTtJQUNwRSxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsY0FBYyxDQUNoQixRQUFnQixFQUNoQixVQUFvQjtRQUVwQixPQUFPLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQTtJQUM1QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsWUFBWSxDQUFDLFFBQWdCLEVBQUUsT0FBaUI7UUFDbEQsT0FBTyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUE7SUFDNUIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLFlBQVksQ0FDZCxVQUFrQixFQUNsQixVQUFvQjtRQUVwQixPQUFPLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQTtJQUM1QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsVUFBVSxDQUFDLFVBQWtCLEVBQUUsT0FBaUI7UUFDbEQsT0FBTyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUE7SUFDNUIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLFdBQVcsQ0FDYixLQUFZLEVBQ1osYUFBc0IsS0FBSyxFQUMzQixvQkFBNkIsSUFBSSxFQUNqQyxnQkFBeUIsSUFBSTtRQUU3QixNQUFNLFNBQVMsR0FBWSxFQUFFLENBQUE7UUFDN0IsTUFBTSxXQUFXLEdBQVksRUFBRSxDQUFBO1FBRS9CLElBQUksVUFBVSxFQUFFLENBQUM7WUFDYixNQUFNLFlBQVksR0FBRyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUE7WUFDL0MsSUFBSSxZQUFZO2dCQUFFLE9BQU8sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFBO1FBQzlDLENBQUM7UUFFRCxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLGlCQUFpQixDQUFDLENBQUMsQ0FBQTtRQUM3RCxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtRQUUxQyxJQUFJLGFBQWEsRUFBRSxDQUFDO1lBQ2hCLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBRTVCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSTtvQkFDWCxLQUFLLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FDakQsS0FBSyxFQUNMLEtBQUssQ0FBQyxXQUFXLEVBQ2pCLEtBQUssQ0FBQyxLQUFLLENBQ2QsQ0FBQTtnQkFDTCxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUE7Z0JBQ2pELFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFBO1lBQzlDLENBQUMsQ0FBQyxDQUFBO1FBQ04sQ0FBQztRQUdELE1BQU0sZ0JBQWdCLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQ3pDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsYUFBYSxJQUFJLE1BQU0sQ0FBQyxZQUFZLENBQzFELENBQUE7UUFFRCxLQUFLLE1BQU0sTUFBTSxJQUFJLGdCQUFnQixFQUFFLENBQUM7WUFDcEMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDO2dCQUM5QyxLQUFLLEVBQUUsS0FBSyxDQUFDLElBQUk7Z0JBQ2pCLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxnQkFBZ0I7Z0JBQ3hDLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtnQkFDakIsS0FBSyxFQUFFLE1BQU0sQ0FBQyxZQUFZO2FBQzdCLENBQUMsQ0FBQTtZQUVGLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQztnQkFDOUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxJQUFJO2dCQUNqQixJQUFJLEVBQUUsaUJBQWlCLENBQUMsZ0JBQWdCO2dCQUN4QyxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7YUFDcEIsQ0FBQyxDQUFBO1lBRUYsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQTtZQUMzQixXQUFXLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFBO1FBQ2pDLENBQUM7UUFFRCxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFBO0lBQ3JELENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxTQUFTLENBQ1gsV0FBMkIsRUFDM0IsT0FBaUIsRUFDakIsa0JBQTJCLElBQUksRUFDL0IsY0FBdUIsSUFBSTtRQUUzQixJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQ1YsTUFBTSxZQUFZLEdBQUcsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFBO1lBQ3JELElBQUksQ0FBQyxZQUFZO2dCQUFFLE9BQU8sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFBO1FBQy9DLENBQUM7UUFHRCxNQUFNLGlCQUFpQixHQUFZLGVBQWUsQ0FBQTtRQUNsRCxNQUFNLEtBQUssR0FBRyxlQUFlLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQztZQUM5QyxDQUFDLENBQUMsV0FBVztZQUNiLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLENBQUE7UUFDNUMsTUFBTSxTQUFTLEdBQVksRUFBRSxDQUFBO1FBQzdCLE1BQU0sV0FBVyxHQUFZLEVBQUUsQ0FBQTtRQUUvQixJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ2QsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDNUIsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUE7Z0JBQ3hDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQTtZQUN2RCxDQUFDLENBQUMsQ0FBQTtRQUNOLENBQUM7UUFFRCxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUE7UUFDakQsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxpQkFBaUIsQ0FBQyxDQUFDLENBQUE7UUFHL0QsTUFBTSxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FDekMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxhQUFhLElBQUksTUFBTSxDQUFDLFlBQVksQ0FDMUQsQ0FBQTtRQUVELEtBQUssTUFBTSxNQUFNLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztZQUNwQyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUM7Z0JBQzlDLEtBQUssRUFBRSxLQUFLLENBQUMsSUFBSTtnQkFDakIsSUFBSSxFQUFFLGlCQUFpQixDQUFDLGdCQUFnQjtnQkFDeEMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJO2FBQ3BCLENBQUMsQ0FBQTtZQUVGLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQztnQkFDOUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxJQUFJO2dCQUNqQixJQUFJLEVBQUUsaUJBQWlCLENBQUMsZ0JBQWdCO2dCQUN4QyxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7Z0JBQ2pCLEtBQUssRUFBRSxNQUFNLENBQUMsWUFBWTthQUM3QixDQUFDLENBQUE7WUFFRixTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFBO1lBQzNCLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUE7UUFDakMsQ0FBQztRQUVELE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDLENBQUE7SUFDckQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLFVBQVUsQ0FDWixJQUFVLEVBQ1YsbUJBQTRCLEtBQUs7UUFFakMsTUFBTSxTQUFTLEdBQVksRUFBRSxDQUFBO1FBQzdCLE1BQU0sV0FBVyxHQUFZLEVBQUUsQ0FBQTtRQUMvQixTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtRQUN4QyxJQUFJLGdCQUFnQjtZQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7UUFDeEUsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7UUFDeEMsSUFBSSxnQkFBZ0I7WUFDaEIsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtRQUN4RCxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFBO0lBQ3JELENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBcUI7UUFDaEMsTUFBTSxRQUFRLEdBQUcsZUFBZSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFBO1FBQ3RFLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUUvQyxNQUFNLFNBQVMsR0FBWSxFQUFFLENBQUE7UUFDN0IsTUFBTSxXQUFXLEdBQVksRUFBRSxDQUFBO1FBQy9CLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7UUFDbEQsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7UUFDdEMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtRQUNwRCxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtRQUMxQyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFBO0lBQ3JELENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxXQUFXLENBQ2IsY0FBOEIsRUFDOUIsWUFBb0I7UUFFcEIsTUFBTSxRQUFRLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUM7WUFDcEQsQ0FBQyxDQUFDLGNBQWM7WUFDaEIsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsQ0FBQTtRQUMvQyxNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUE7UUFFakMsUUFBUSxDQUFDLElBQUksR0FBRyxZQUFZLENBQUE7UUFHNUIsTUFBTSxFQUFFLEdBQUcsSUFBSSxLQUFLLENBQ2hCLGVBQWUsSUFBSSxDQUFDLFVBQVUsQ0FDMUIsUUFBUSxDQUFDLElBQUksQ0FDaEIsY0FBYyxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQ2pELENBQUE7UUFDRCxNQUFNLElBQUksR0FBRyxJQUFJLEtBQUssQ0FDbEIsZUFBZSxJQUFJLENBQUMsVUFBVSxDQUMxQixZQUFZLENBQ2YsY0FBYyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUNsRCxDQUFBO1FBQ0QsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQTtRQUduQyxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ2hDLE1BQU0sYUFBYSxHQUNmLElBQUksQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLG9CQUFvQixDQUMvQyxRQUFRLEVBQ1IsTUFBTSxDQUFDLFdBQVcsQ0FDckIsQ0FBQTtZQUdMLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxhQUFhO2dCQUFFLE9BQU07WUFFekMsTUFBTSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxvQkFBb0IsQ0FDN0QsUUFBUSxFQUNSLE1BQU0sQ0FBQyxXQUFXLENBQ3JCLENBQUE7UUFDTCxDQUFDLENBQUMsQ0FBQTtRQUdGLFFBQVEsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUU7WUFDeEMsTUFBTSxpQkFBaUIsR0FDbkIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUN6QyxRQUFRLEVBQ1IsVUFBVSxDQUFDLFdBQVcsRUFDdEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsRUFDN0IsVUFBVSxDQUFDLHFCQUFxQixDQUNuQyxDQUFBO1lBR0wsSUFBSSxVQUFVLENBQUMsSUFBSSxLQUFLLGlCQUFpQjtnQkFBRSxPQUFNO1lBRWpELFVBQVUsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUMzRCxRQUFRLEVBQ1IsVUFBVSxDQUFDLFdBQVcsRUFDdEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsRUFDN0IsVUFBVSxDQUFDLHFCQUFxQixDQUNuQyxDQUFBO1FBQ0wsQ0FBQyxDQUFDLENBQUE7UUFHRixRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQy9CLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FDekQsUUFBUSxFQUNSLEtBQUssQ0FBQyxXQUFXLEVBQ2pCLEtBQUssQ0FBQyxLQUFLLENBQ2QsQ0FBQTtZQUdELElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxZQUFZO2dCQUFFLE9BQU07WUFFdkMsS0FBSyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQ2pELFFBQVEsRUFDUixLQUFLLENBQUMsV0FBVyxFQUNqQixLQUFLLENBQUMsS0FBSyxDQUNkLENBQUE7UUFDTCxDQUFDLENBQUMsQ0FBQTtRQUdGLFFBQVEsQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQTtRQUc3QixNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFBO0lBQ2hELENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxTQUFTLENBQ1gsV0FBMkIsRUFDM0IsTUFBbUI7UUFFbkIsTUFBTSxLQUFLLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUM7WUFDOUMsQ0FBQyxDQUFDLFdBQVc7WUFDYixDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFBO1FBQzVDLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFNLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFBO0lBQzVDLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxVQUFVLENBQ1osV0FBMkIsRUFDM0IsT0FBc0I7UUFFdEIsTUFBTSxLQUFLLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUM7WUFDOUMsQ0FBQyxDQUFDLFdBQVc7WUFDYixDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFBO1FBQzVDLE1BQU0sWUFBWSxHQUFHLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQTtRQUNsQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUE7UUFDM0QsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FBQTtJQUNqRCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsWUFBWSxDQUNkLFdBQTJCLEVBQzNCLG9CQUEwQyxFQUMxQyxvQkFBMEM7UUFFMUMsTUFBTSxLQUFLLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUM7WUFDOUMsQ0FBQyxDQUFDLFdBQVc7WUFDYixDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFBO1FBQzVDLE1BQU0sU0FBUyxHQUFHLGVBQWUsQ0FBQyxhQUFhLENBQUMsb0JBQW9CLENBQUM7WUFDakUsQ0FBQyxDQUFDLG9CQUFvQjtZQUN0QixDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssb0JBQW9CLENBQUMsQ0FBQTtRQUNoRSxJQUFJLENBQUMsU0FBUztZQUNWLE1BQU0sSUFBSSxZQUFZLENBQ2xCLFdBQVcsb0JBQW9CLDJCQUEyQixLQUFLLENBQUMsSUFBSSxVQUFVLENBQ2pGLENBQUE7UUFFTCxJQUFJLFNBQVMsR0FBNEIsU0FBUyxDQUFBO1FBQ2xELElBQUksZUFBZSxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLENBQUM7WUFDdEQsU0FBUyxHQUFHLG9CQUFvQixDQUFBO1FBQ3BDLENBQUM7YUFBTSxDQUFDO1lBQ0osU0FBUyxHQUFHLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQTtZQUM3QixTQUFTLENBQUMsSUFBSSxHQUFHLG9CQUFvQixDQUFBO1FBQ3pDLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQTtJQUN6RCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsWUFBWSxDQUNkLFdBQTJCLEVBQzNCLG9CQUEwQyxFQUMxQyxTQUFzQjtRQUV0QixNQUFNLEtBQUssR0FBRyxlQUFlLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQztZQUM5QyxDQUFDLENBQUMsV0FBVztZQUNiLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLENBQUE7UUFDNUMsTUFBTSxTQUFTLEdBQUcsZUFBZSxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQztZQUNqRSxDQUFDLENBQUMsb0JBQW9CO1lBQ3RCLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxvQkFBb0IsQ0FBQyxDQUFBO1FBQ2hFLElBQUksQ0FBQyxTQUFTO1lBQ1YsTUFBTSxJQUFJLFlBQVksQ0FDbEIsV0FBVyxvQkFBb0IsMkJBQTJCLEtBQUssQ0FBQyxJQUFJLFVBQVUsQ0FDakYsQ0FBQTtRQUVMLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUE7SUFDL0QsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxhQUFhLENBQ2YsV0FBMkIsRUFDM0IsY0FBb0U7UUFFcEUsTUFBTSxLQUFLLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUM7WUFDOUMsQ0FBQyxDQUFDLFdBQVc7WUFDYixDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFBO1FBQzVDLE1BQU0sWUFBWSxHQUFHLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQTtRQUNsQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsZ0JBQWdCLEVBQUUsRUFBRTtZQUN4QyxJQUNJLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxJQUFJO2dCQUMvQixnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUNqQyxDQUFDO2dCQUNDLFlBQVk7cUJBQ1AsaUJBQWlCLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDO3FCQUM3QyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtvQkFDaEIsTUFBTSxVQUFVLEdBQ1osSUFBSSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsb0JBQW9CLENBQy9DLEtBQUssRUFDTCxNQUFNLENBQUMsV0FBVyxDQUNyQixDQUFBO29CQUVMLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUNyQixNQUFNLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FDdEIsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLElBQUksQ0FDbEMsRUFDRCxDQUFDLENBQ0osQ0FBQTtvQkFDRCxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUE7b0JBR3hELElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxVQUFVLEVBQUUsQ0FBQzt3QkFDN0IsTUFBTSxDQUFDLElBQUk7NEJBQ1AsSUFBSSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsb0JBQW9CLENBQy9DLFlBQVksRUFDWixNQUFNLENBQUMsV0FBVyxDQUNyQixDQUFBO29CQUNULENBQUM7Z0JBQ0wsQ0FBQyxDQUFDLENBQUE7Z0JBRU4sWUFBWTtxQkFDUCxxQkFBcUIsQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUM7cUJBQ2pELE9BQU8sQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFO29CQUNwQixNQUFNLGNBQWMsR0FDaEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUN6QyxLQUFLLEVBQ0wsVUFBVSxDQUFDLFdBQVcsRUFDdEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsRUFDN0IsVUFBVSxDQUFDLHFCQUFxQixDQUNuQyxDQUFBO29CQUVMLFVBQVUsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUN6QixVQUFVLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FDMUIsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLElBQUksQ0FDbEMsRUFDRCxDQUFDLENBQ0osQ0FBQTtvQkFDRCxVQUFVLENBQUMsV0FBVyxDQUFDLElBQUksQ0FDdkIsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLElBQUksQ0FDbEMsQ0FBQTtvQkFHRCxJQUFJLFVBQVUsQ0FBQyxJQUFJLEtBQUssY0FBYyxFQUFFLENBQUM7d0JBQ3JDLFVBQVUsQ0FBQyxJQUFJOzRCQUNYLElBQUksQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FDekMsWUFBWSxFQUNaLFVBQVUsQ0FBQyxXQUFXLEVBQ3RCLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLEVBQzdCLFVBQVUsQ0FBQyxxQkFBcUIsQ0FDbkMsQ0FBQTtvQkFDVCxDQUFDO2dCQUNMLENBQUMsQ0FBQyxDQUFBO2dCQUVOLFlBQVk7cUJBQ1AsaUJBQWlCLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDO3FCQUM3QyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtvQkFDZixNQUFNLFNBQVMsR0FDWCxJQUFJLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQ3BDLEtBQUssRUFDTCxLQUFLLENBQUMsV0FBVyxFQUNqQixLQUFLLENBQUMsS0FBSyxDQUNkLENBQUE7b0JBRUwsS0FBSyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQ3BCLEtBQUssQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUNyQixnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUNsQyxFQUNELENBQUMsQ0FDSixDQUFBO29CQUNELEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQTtvQkFHdkQsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRSxDQUFDO3dCQUMzQixLQUFLLENBQUMsSUFBSTs0QkFDTixJQUFJLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQ3BDLFlBQVksRUFDWixLQUFLLENBQUMsV0FBVyxFQUNqQixLQUFLLENBQUMsS0FBSyxDQUNkLENBQUE7b0JBQ1QsQ0FBQztnQkFDTCxDQUFDLENBQUMsQ0FBQTtZQUNWLENBQUM7WUFDRCxNQUFNLGNBQWMsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FDNUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssZ0JBQWdCLENBQUMsU0FBUyxDQUFDLElBQUksQ0FDOUQsQ0FBQTtZQUNELElBQUksY0FBYztnQkFDZCxZQUFZLENBQUMsT0FBTyxDQUNoQixZQUFZLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FDL0MsR0FBRyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUE7UUFDdEMsQ0FBQyxDQUFDLENBQUE7UUFFRixNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLEtBQUssQ0FBQyxDQUFBO0lBQ2pELENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxVQUFVLENBQ1osV0FBMkIsRUFDM0IsWUFBa0M7UUFFbEMsTUFBTSxLQUFLLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUM7WUFDOUMsQ0FBQyxDQUFDLFdBQVc7WUFDYixDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFBO1FBQzVDLE1BQU0sTUFBTSxHQUFHLGVBQWUsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDO1lBQ3RELENBQUMsQ0FBQyxZQUFZO1lBQ2QsQ0FBQyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsQ0FBQTtRQUMxQyxJQUFJLENBQUMsTUFBTTtZQUNQLE1BQU0sSUFBSSxZQUFZLENBQ2xCLFdBQVcsWUFBWSw2QkFBNkIsS0FBSyxDQUFDLElBQUksR0FBRyxDQUNwRSxDQUFBO1FBRUwsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUE7SUFDM0MsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLFdBQVcsQ0FDYixXQUEyQixFQUMzQixPQUFpQztRQUVqQyxNQUFNLEtBQUssR0FBRyxlQUFlLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQztZQUM5QyxDQUFDLENBQUMsV0FBVztZQUNiLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLENBQUE7UUFHNUMsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFBO1FBQ2xDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUE0QixFQUFFLEVBQUU7WUFDN0MsTUFBTSxjQUFjLEdBQUcsZUFBZSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUM7Z0JBQ3hELENBQUMsQ0FBQyxNQUFNO2dCQUNSLENBQUMsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUE7WUFDcEMsSUFBSSxDQUFDLGNBQWM7Z0JBQ2YsTUFBTSxJQUFJLEtBQUssQ0FDWCxXQUFXLE1BQU0sNkJBQTZCLEtBQUssQ0FBQyxJQUFJLEdBQUcsQ0FDOUQsQ0FBQTtZQUVMLFlBQVksQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLENBQUE7WUFDekMsWUFBWTtpQkFDUCxpQkFBaUIsQ0FBQyxjQUFjLENBQUM7aUJBQ2pDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQ2hCLFlBQVksQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsQ0FDOUMsQ0FBQTtZQUNMLFlBQVk7aUJBQ1AsaUJBQWlCLENBQUMsY0FBYyxDQUFDO2lCQUNqQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtZQUN4RCxZQUFZO2lCQUNQLHFCQUFxQixDQUFDLGNBQWMsQ0FBQztpQkFDckMsT0FBTyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQTtRQUMzRCxDQUFDLENBQUMsQ0FBQTtRQUVGLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLENBQUE7SUFDakQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLGdCQUFnQixDQUNsQixXQUEyQixFQUMzQixXQUFxQjtRQUVyQixNQUFNLEtBQUssR0FBRyxlQUFlLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQztZQUM5QyxDQUFDLENBQUMsV0FBVztZQUNiLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLENBQUE7UUFFNUMsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFBO1FBQ2xDLFlBQVksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDcEMsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxVQUFVLEtBQUssTUFBTSxDQUFDLElBQUksQ0FBQztnQkFDNUQsTUFBTSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUE7UUFDL0IsQ0FBQyxDQUFDLENBQUE7UUFFRixNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLEtBQUssQ0FBQyxDQUFBO1FBRTdDLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDN0IsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxVQUFVLEtBQUssTUFBTSxDQUFDLElBQUksQ0FBQztnQkFDNUQsTUFBTSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUE7UUFDL0IsQ0FBQyxDQUFDLENBQUE7SUFDTixDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsaUJBQWlCLENBQ25CLFdBQTJCLEVBQzNCLE9BQXNCO1FBRXRCLE1BQU0sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFBO0lBQzNCLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxjQUFjLENBQUMsV0FBMkI7UUFDNUMsTUFBTSxLQUFLLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUM7WUFDOUMsQ0FBQyxDQUFDLFdBQVc7WUFDYixDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFBO1FBRTVDLE1BQU0sWUFBWSxHQUFHLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQTtRQUNsQyxZQUFZLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQzNDLE1BQU0sQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFBO1FBQzVCLENBQUMsQ0FBQyxDQUFBO1FBRUYsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FBQTtRQUU3QyxLQUFLLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ3BDLE1BQU0sQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFBO1FBQzVCLENBQUMsQ0FBQyxDQUFBO0lBQ04sQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLHNCQUFzQixDQUN4QixXQUEyQixFQUMzQixnQkFBNkI7UUFFN0IsTUFBTSxJQUFJLENBQUMsdUJBQXVCLENBQUMsV0FBVyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFBO0lBQ3ZFLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyx1QkFBdUIsQ0FDekIsV0FBMkIsRUFDM0IsaUJBQWdDO1FBRWhDLE1BQU0sS0FBSyxHQUFHLGVBQWUsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDO1lBQzlDLENBQUMsQ0FBQyxXQUFXO1lBQ2IsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQTtRQUc1QyxNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUE7UUFDbEMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxDQUMzQyxZQUFZLENBQUMsbUJBQW1CLENBQUMsZ0JBQWdCLENBQUMsQ0FDckQsQ0FBQTtRQUNELE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLENBQUE7SUFDakQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLG9CQUFvQixDQUN0QixXQUEyQixFQUMzQixZQUFrQztRQUVsQyxNQUFNLEtBQUssR0FBRyxlQUFlLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQztZQUM5QyxDQUFDLENBQUMsV0FBVztZQUNiLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLENBQUE7UUFDNUMsTUFBTSxnQkFBZ0IsR0FBRyxlQUFlLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQztZQUNoRSxDQUFDLENBQUMsWUFBWTtZQUNkLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxZQUFZLENBQUMsQ0FBQTtRQUN4RCxJQUFJLENBQUMsZ0JBQWdCO1lBQ2pCLE1BQU0sSUFBSSxZQUFZLENBQ2xCLHFEQUFxRCxLQUFLLENBQUMsSUFBSSxFQUFFLENBQ3BFLENBQUE7UUFFTCxNQUFNLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUE7SUFDL0QsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLHFCQUFxQixDQUN2QixXQUEyQixFQUMzQixpQkFBZ0M7UUFFaEMsTUFBTSxLQUFLLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUM7WUFDOUMsQ0FBQyxDQUFDLFdBQVc7WUFDYixDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFBO1FBRzVDLE1BQU0sWUFBWSxHQUFHLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQTtRQUNsQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLENBQzNDLFlBQVksQ0FBQyxzQkFBc0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUN4RCxDQUFBO1FBRUQsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FBQTtJQUNqRCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMscUJBQXFCLENBQ3ZCLFdBQTJCLEVBQzNCLGVBQTJCO1FBRTNCLE1BQU0sSUFBSSxDQUFDLHNCQUFzQixDQUFDLFdBQVcsRUFBRSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUE7SUFDckUsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLHNCQUFzQixDQUN4QixXQUEyQixFQUMzQixnQkFBOEI7UUFFOUIsTUFBTSxLQUFLLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUM7WUFDOUMsQ0FBQyxDQUFDLFdBQVc7WUFDYixDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFBO1FBRzVDLE1BQU0sWUFBWSxHQUFHLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQTtRQUNsQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxlQUFlLEVBQUUsRUFBRSxDQUN6QyxZQUFZLENBQUMsa0JBQWtCLENBQUMsZUFBZSxDQUFDLENBQ25ELENBQUE7UUFDRCxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLEtBQUssQ0FBQyxDQUFBO0lBQ2pELENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxtQkFBbUIsQ0FDckIsV0FBMkIsRUFDM0IsV0FBZ0M7UUFFaEMsTUFBTSxLQUFLLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUM7WUFDOUMsQ0FBQyxDQUFDLFdBQVc7WUFDYixDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFBO1FBQzVDLE1BQU0sZUFBZSxHQUFHLGVBQWUsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDO1lBQzdELENBQUMsQ0FBQyxXQUFXO1lBQ2IsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLFdBQVcsQ0FBQyxDQUFBO1FBQ3RELElBQUksQ0FBQyxlQUFlO1lBQ2hCLE1BQU0sSUFBSSxZQUFZLENBQ2xCLG9EQUFvRCxLQUFLLENBQUMsSUFBSSxFQUFFLENBQ25FLENBQUE7UUFFTCxNQUFNLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFBO0lBQzdELENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxvQkFBb0IsQ0FDdEIsV0FBMkIsRUFDM0IsZ0JBQThCO1FBRTlCLE1BQU0sS0FBSyxHQUFHLGVBQWUsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDO1lBQzlDLENBQUMsQ0FBQyxXQUFXO1lBQ2IsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQTtRQUc1QyxNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUE7UUFDbEMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUMsZUFBZSxFQUFFLEVBQUUsQ0FDekMsWUFBWSxDQUFDLHFCQUFxQixDQUFDLGVBQWUsQ0FBQyxDQUN0RCxDQUFBO1FBRUQsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FBQTtJQUNqRCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMseUJBQXlCLENBQzNCLFdBQTJCLEVBQzNCLG1CQUFtQztRQUVuQyxNQUFNLElBQUksWUFBWSxDQUFDLGdEQUFnRCxDQUFDLENBQUE7SUFDNUUsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLDBCQUEwQixDQUM1QixXQUEyQixFQUMzQixvQkFBc0M7UUFFdEMsTUFBTSxJQUFJLFlBQVksQ0FBQyxnREFBZ0QsQ0FBQyxDQUFBO0lBQzVFLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyx1QkFBdUIsQ0FDekIsV0FBMkIsRUFDM0IsZUFBd0M7UUFFeEMsTUFBTSxJQUFJLFlBQVksQ0FBQyxnREFBZ0QsQ0FBQyxDQUFBO0lBQzVFLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyx3QkFBd0IsQ0FDMUIsV0FBMkIsRUFDM0Isb0JBQXNDO1FBRXRDLE1BQU0sSUFBSSxZQUFZLENBQUMsZ0RBQWdELENBQUMsQ0FBQTtJQUM1RSxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsZ0JBQWdCLENBQ2xCLFdBQTJCLEVBQzNCLFVBQTJCO1FBRTNCLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUE7SUFDM0QsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLGlCQUFpQixDQUNuQixXQUEyQixFQUMzQixXQUE4QjtRQUU5QixNQUFNLEtBQUssR0FBRyxlQUFlLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQztZQUM5QyxDQUFDLENBQUMsV0FBVztZQUNiLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLENBQUE7UUFFNUMsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFBO1FBQ2xDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUMvQixZQUFZLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUN6QyxDQUFBO1FBRUQsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FBQTtJQUNqRCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsY0FBYyxDQUNoQixXQUEyQixFQUMzQixnQkFBMEM7UUFFMUMsTUFBTSxLQUFLLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUM7WUFDOUMsQ0FBQyxDQUFDLFdBQVc7WUFDYixDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFBO1FBQzVDLE1BQU0sVUFBVSxHQUFHLGVBQWUsQ0FBQyxpQkFBaUIsQ0FBQyxnQkFBZ0IsQ0FBQztZQUNsRSxDQUFDLENBQUMsZ0JBQWdCO1lBQ2xCLENBQUMsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksS0FBSyxnQkFBZ0IsQ0FBQyxDQUFBO1FBQ2xFLElBQUksQ0FBQyxVQUFVO1lBQ1gsTUFBTSxJQUFJLFlBQVksQ0FDbEIsK0NBQStDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FDOUQsQ0FBQTtRQUVMLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFBO0lBQ3pELENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxlQUFlLENBQ2pCLFdBQTJCLEVBQzNCLFdBQThCO1FBRTlCLE1BQU0sS0FBSyxHQUFHLGVBQWUsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDO1lBQzlDLENBQUMsQ0FBQyxXQUFXO1lBQ2IsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQTtRQUc1QyxNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUE7UUFDbEMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQy9CLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsQ0FDNUMsQ0FBQTtRQUVELE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLENBQUE7SUFDakQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLFdBQVcsQ0FDYixXQUEyQixFQUMzQixLQUFpQjtRQUVqQixNQUFNLEtBQUssR0FBRyxlQUFlLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQztZQUM5QyxDQUFDLENBQUMsV0FBVztZQUNiLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLENBQUE7UUFHNUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJO1lBQUUsS0FBSyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFBO1FBRWxFLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFBO1FBQzVDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDckMsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQTtRQUNuQyxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ3pCLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxhQUFhLENBQ2YsV0FBMkIsRUFDM0IsT0FBcUI7UUFFckIsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQ25DLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxDQUN2QyxDQUFBO1FBQ0QsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQy9CLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxTQUFTLENBQ1gsV0FBMkIsRUFDM0IsV0FBZ0M7UUFFaEMsTUFBTSxLQUFLLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUM7WUFDOUMsQ0FBQyxDQUFDLFdBQVc7WUFDYixDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFBO1FBQzVDLE1BQU0sS0FBSyxHQUFHLGVBQWUsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDO1lBQ25ELENBQUMsQ0FBQyxXQUFXO1lBQ2IsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLFdBQVcsQ0FBQyxDQUFBO1FBQ3ZELElBQUksQ0FBQyxLQUFLO1lBQ04sTUFBTSxJQUFJLFlBQVksQ0FDbEIsa0JBQWtCLFdBQVcsMkJBQTJCLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FDdkUsQ0FBQTtRQUdMLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSTtZQUFFLEtBQUssQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQTtRQUVsRSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ25DLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFBO1FBQzlDLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUE7UUFDbkMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUM1QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsV0FBVyxDQUNiLFdBQTJCLEVBQzNCLE9BQXFCO1FBRXJCLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUNuQyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsQ0FDckMsQ0FBQTtRQUNELE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUMvQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLFVBQVUsQ0FBQyxTQUFpQjtRQUM5QixNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUNqRSxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsYUFBYSxDQUFDLFFBQWlCO1FBQ2pDLElBQUksTUFBTSxHQUF1QixTQUFTLENBQUE7UUFDMUMsSUFDSSxRQUFRO1lBQ1IsSUFBSSxDQUFDLE1BQU0sQ0FBQyx1Q0FBdUMsQ0FBQyxRQUFRLENBQUMsRUFDL0QsQ0FBQztZQUNDLE1BQU07Z0JBQ0YsSUFBSSxDQUFDLE1BQU0sQ0FBQyx1Q0FBdUMsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUNyRSxDQUFDO1FBRUQsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLDJCQUEyQixDQUFDLENBQUE7UUFFN0MsTUFBTSwwQkFBMEIsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUE7UUFDM0QsSUFBSSxDQUFDLDBCQUEwQjtZQUFFLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUE7UUFDOUQsSUFBSSxDQUFDO1lBQ0QsTUFBTSxvQkFBb0IsR0FBRyxNQUFNO2dCQUMvQixDQUFDLENBQUMsc0JBQXNCLE1BQU0sdUNBQXVDLE1BQU0seUNBQXlDO2dCQUNwSCxDQUFDLENBQUMsMEZBQTBGLENBQUE7WUFDaEcsTUFBTSxlQUFlLEdBQW9CLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FDckQsb0JBQW9CLENBQ3ZCLENBQUE7WUFDRCxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQ2IsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUNyRCxDQUFBO1lBRUQsTUFBTSxxQkFBcUIsR0FBRyxNQUFNO2dCQUNoQyxDQUFDLENBQUMsdUJBQXVCLE1BQU0sdUNBQXVDLE1BQU0sMEVBQTBFO2dCQUN0SixDQUFDLENBQUMsNEhBQTRILENBQUE7WUFDbEksTUFBTSxnQkFBZ0IsR0FBb0IsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUN0RCxxQkFBcUIsQ0FDeEIsQ0FBQTtZQUNELE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDYixnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FDdEQsQ0FBQTtZQUVELElBQUksQ0FBQywwQkFBMEI7Z0JBQUUsTUFBTSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQTtRQUNuRSxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNiLElBQUksQ0FBQztnQkFFRCxJQUFJLENBQUMsMEJBQTBCO29CQUMzQixNQUFNLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFBO1lBQ3hDLENBQUM7WUFBQyxPQUFPLGFBQWEsRUFBRSxDQUFDLENBQUEsQ0FBQztZQUMxQixNQUFNLEtBQUssQ0FBQTtRQUNmLENBQUM7Z0JBQVMsQ0FBQztZQUNQLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxDQUFBO1FBQ2hELENBQUM7SUFDTCxDQUFDO0lBTVMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxTQUFvQjtRQUMxQyxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLDJCQUEyQixFQUFFLENBQUMsQ0FBQTtRQUN4RSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDWixPQUFPLEVBQUUsQ0FBQTtRQUNiLENBQUM7UUFFRCxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDYixTQUFTLEdBQUcsRUFBRSxDQUFBO1FBQ2xCLENBQUM7UUFFRCxNQUFNLGVBQWUsR0FBRyxTQUFTO2FBQzVCLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLENBQUM7YUFDL0IsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ2YsSUFBSSxLQUFLLEdBQUcsc0JBQXNCLElBQUksQ0FBQywyQkFBMkIsRUFBRSw2R0FDaEUsaUJBQWlCLENBQUMsSUFDdEIsR0FBRyxDQUFBO1FBQ0gsSUFBSSxlQUFlLENBQUMsTUFBTSxHQUFHLENBQUM7WUFDMUIsS0FBSyxJQUFJLHVCQUF1QixlQUFlLEdBQUcsQ0FBQTtRQUN0RCxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDdkMsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBVyxFQUFFLEVBQUU7WUFDL0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQTtZQUN2QixJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQTtZQUMxQixJQUFJLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQTtZQUNqQyxPQUFPLElBQUksQ0FBQTtRQUNmLENBQUMsQ0FBQyxDQUFBO0lBQ04sQ0FBQztJQUVTLEtBQUssQ0FBQyxnQkFBZ0IsQ0FDNUIsU0FBaUIsRUFDakIsWUFBK0I7UUFFL0IsSUFBSSxRQUFRLEdBQXVCLFNBQVMsQ0FBQTtRQUM1QyxNQUFNLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUE7UUFDMUQsSUFDSSxNQUFNO1lBQ04sSUFBSSxDQUFDLE1BQU0sQ0FBQyx1Q0FBdUMsQ0FBQyxNQUFNLENBQUMsRUFDN0QsQ0FBQztZQUNDLFFBQVE7Z0JBQ0osSUFBSSxDQUFDLE1BQU0sQ0FBQyx1Q0FBdUMsQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUNuRSxDQUFDO1FBQ0QsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUN4QixVQUFVLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxpQkFDdkMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUM3QixzQkFDSSxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksTUFBTSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQzlCLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FDZCxlQUFlLENBQ2xCLG9CQUFvQixZQUFZLFVBQzdCLFlBQVksS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsVUFDeEMsVUFBVSxTQUFTLElBQUksQ0FDMUIsQ0FBQTtRQUNELE9BQU8sR0FBRyxDQUFBO0lBQ2QsQ0FBQztJQUNTLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxTQUFpQixFQUFFLE1BQWM7UUFDL0QsTUFBTSxDQUFDLEVBQUUsU0FBUyxDQUFDLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUNwRCxNQUFNLEdBQUcsR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxNQUFNLEtBQUssU0FBUyxJQUFJLENBQUMsQ0FBQTtRQUNoRSxPQUFPLEdBQUcsQ0FBQTtJQUNkLENBQUM7SUFFRDs7T0FFRztJQUNPLEtBQUssQ0FBQyxVQUFVLENBQUMsVUFBcUI7UUFFNUMsSUFBSSxVQUFVLElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN4QyxPQUFPLEVBQUUsQ0FBQTtRQUNiLENBQUM7UUFFRCxJQUFJLFFBQVEsR0FBdUQsRUFBRSxDQUFBO1FBQ3JFLElBQUksWUFBNkIsQ0FBQTtRQUVqQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDZCxNQUFNLFNBQVMsR0FBRyxzREFBc0QsQ0FBQTtZQUN4RSxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBRS9DLE1BQU0sZ0JBQWdCLEdBQUcsUUFBUTtpQkFDNUIsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQztpQkFDOUIsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO1lBQ2YsWUFBWSxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FDM0IsMkVBQTJFLGdCQUFnQixHQUFHLENBQ2pHLENBQUE7UUFDTCxDQUFDO2FBQU0sQ0FBQztZQUNKLFFBQVEsR0FBRyxDQUNQLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDYixVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FDekIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FDNUMsQ0FDSixDQUNKO2lCQUNJLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUM7aUJBQzFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQTtZQUNwQixZQUFZLEdBQUcsQ0FDWCxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQ2IsQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FDakMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FDNUMsQ0FDSixDQUNKO2lCQUNJLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUM7aUJBQzFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUN4QixDQUFDO1FBR0QsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3hCLE9BQU8sRUFBRSxDQUFBO1FBQ2IsQ0FBQztRQUdELE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FDZCxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtZQUMzQixNQUFNLFNBQVMsR0FDWCxPQUFPLENBQUMsVUFBVSxDQUFDO2dCQUNuQixJQUFJLENBQUMsTUFBTSxDQUFDLHVDQUF1QyxDQUMvQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQ3RCO2dCQUNHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsdUNBQXVDLENBQ2xELE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FDdEIsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQ3hCLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUE7WUFFekIsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFBO1lBRTFCLE1BQU0sWUFBWSxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLENBQUE7WUFDbEQsTUFBTSxLQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUE7WUFHMUQsTUFBTSxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsYUFBYSxDQUFDLEdBQ3ZDLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQztnQkFDZCxJQUFJLENBQUMsaUJBQWlCLENBQUMsU0FBUyxFQUFFLGFBQWEsQ0FBQztnQkFDaEQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsRUFBRSxZQUFZLENBQUM7Z0JBQy9DLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLEVBQUUsa0JBQWtCLENBQUM7YUFDeEQsQ0FBQyxDQUFBO1lBR04sSUFBSSx1QkFBdUIsR0FBdUIsU0FBUyxDQUFBO1lBQzNELE1BQU0sUUFBUSxHQUFXLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQTtZQUN2QyxJQUFJLGtCQUFrQixHQUFHLFFBQVE7aUJBQzVCLFdBQVcsRUFBRTtpQkFDYixPQUFPLENBQUMsZUFBZSxDQUFDLENBQUE7WUFDN0IsSUFBSSxrQkFBa0IsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUM1Qix1QkFBdUIsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUNyQyxDQUFDLEVBQ0Qsa0JBQWtCLENBQ3JCLENBQUE7Z0JBQ0QsTUFBTSxLQUFLLEdBQUcsdUJBQXVCLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFBO2dCQUN0RCxNQUFNLE9BQU8sR0FBRyx1QkFBdUIsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUE7Z0JBQ3hELElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7b0JBQ2YsdUJBQXVCO3dCQUNuQix1QkFBdUIsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUE7b0JBQ3pDLHVCQUF1Qjt3QkFDbkIsdUJBQXVCLENBQUMsTUFBTSxDQUMxQixDQUFDLEVBQ0QsdUJBQXVCLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUMzQyxDQUFBO29CQUNMLHVCQUF1Qjt3QkFDbkIsdUJBQXVCLENBQUMsTUFBTSxDQUMxQix1QkFBdUIsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUMzQyxDQUFBO2dCQUNULENBQUM7cUJBQU0sSUFBSSxPQUFPLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQkFDeEIsdUJBQXVCO3dCQUNuQix1QkFBdUIsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUE7b0JBQzNDLHVCQUF1Qjt3QkFDbkIsdUJBQXVCLENBQUMsTUFBTSxDQUMxQixDQUFDLEVBQ0QsdUJBQXVCLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUMzQyxDQUFBO29CQUNMLHVCQUF1Qjt3QkFDbkIsdUJBQXVCLENBQUMsTUFBTSxDQUMxQix1QkFBdUIsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUMzQyxDQUFBO2dCQUNULENBQUM7WUFDTCxDQUFDO1lBR0QsS0FBSyxDQUFDLE9BQU8sR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQzdCLFNBQVMsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxFQUFFO2dCQUM3QixNQUFNLFdBQVcsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFBO2dCQUNyQyxXQUFXLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQTtnQkFDbkMsV0FBVyxDQUFDLElBQUksR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUE7Z0JBQ2pELFdBQVcsQ0FBQyxPQUFPO29CQUNmLFFBQVEsQ0FBQyxZQUFZLENBQUMsS0FBSyxJQUFJO3dCQUMvQixRQUFRLENBQUMsWUFBWSxDQUFDLEtBQUssU0FBUzt3QkFDaEMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUM7d0JBQ3hCLENBQUMsQ0FBQyxTQUFTLENBQUE7Z0JBQ25CLFdBQVcsQ0FBQyxVQUFVLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQTtnQkFFbEQsV0FBVyxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO2dCQUMxQyxXQUFXLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQSxDQUFDLDBDQUEwQztnQkFDbkUsV0FBVyxDQUFDLFdBQVc7b0JBQ25CLHVCQUF1QixLQUFLLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQTtnQkFDaEQsSUFBSSxXQUFXLENBQUMsV0FBVyxFQUFFLENBQUM7b0JBQzFCLFdBQVcsQ0FBQyxrQkFBa0IsR0FBRyxXQUFXLENBQUE7Z0JBQ2hELENBQUM7Z0JBRUQsSUFDSSxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztvQkFDeEIsUUFBUSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFDMUIsQ0FBQztvQkFDQyxXQUFXLENBQUMsYUFBYTt3QkFDckIsUUFBUSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUE7b0JBRW5ELE1BQU0saUJBQWlCLEdBQ25CLE1BQU0sSUFBSSxDQUFDLHdCQUF3QixDQUFDO3dCQUNoQyxLQUFLLEVBQUUsS0FBSyxDQUFDLElBQUk7d0JBQ2pCLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxnQkFBZ0I7d0JBQ3hDLElBQUksRUFBRSxXQUFXLENBQUMsSUFBSTtxQkFDekIsQ0FBQyxDQUFBO29CQUVOLE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FDNUIsaUJBQWlCLENBQUMsS0FBSyxFQUN2QixpQkFBaUIsQ0FBQyxVQUFVLENBQy9CLENBQUE7b0JBQ0QsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO3dCQUNqQyxXQUFXLENBQUMsWUFBWSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUE7b0JBQy9DLENBQUM7eUJBQU0sQ0FBQzt3QkFDSixXQUFXLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQTtvQkFDakMsQ0FBQztnQkFDTCxDQUFDO2dCQUVELElBQUksV0FBVyxDQUFDLElBQUksS0FBSyxTQUFTLEVBQUUsQ0FBQztvQkFFakMsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FDdkIsSUFBSSxNQUFNLENBQ04sSUFBSTt3QkFDQSxXQUFXLENBQUMsSUFBSTt3QkFDaEIsOEZBQThGLENBQ3JHLENBQ0osQ0FBQTtvQkFDRCxJQUFJLFNBQVMsRUFBRSxDQUFDO3dCQUVaLFdBQVcsQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQzs2QkFDMUIsTUFBTSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQzs2QkFDbEMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFBO29CQUNyQixDQUFDO2dCQUNMLENBQUM7Z0JBR0QsSUFBSSxHQUFHLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUE7Z0JBQ3ZDLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7b0JBQ2IsTUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQTtvQkFDakMsSUFBSSxRQUFRLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUE7b0JBQ3RDLElBQ0ksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUNwQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxLQUFLLFFBQVEsQ0FDNUIsRUFDSCxDQUFDO3dCQUNDLElBQUksR0FBRyxHQUFHLFFBQVEsQ0FDZCxRQUFRLENBQUMsU0FBUyxDQUNkLEdBQUcsR0FBRyxDQUFDLEVBQ1AsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQ3RCLENBQ0osQ0FBQTt3QkFDRCxJQUFJLEdBQUcsRUFBRSxDQUFDOzRCQUNOLFdBQVcsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFBOzRCQUNuQyxXQUFXLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQSxDQUFDLDJDQUEyQzt3QkFDM0UsQ0FBQztvQkFDTCxDQUFDO29CQUNELElBQ0ksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUN2QyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxLQUFLLFFBQVEsQ0FDNUIsRUFDSCxDQUFDO3dCQUNDLE1BQU0sRUFBRSxHQUFHLElBQUksTUFBTSxDQUNqQixJQUFJLFFBQVEsMkJBQTJCLENBQzFDLENBQUE7d0JBQ0QsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQTt3QkFDbEMsSUFBSSxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7NEJBQ3hCLFdBQVcsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUE7d0JBQ3ZDLENBQUM7d0JBQ0QsSUFDSSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQ25DLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEtBQUssUUFBUSxDQUM1QixFQUNILENBQUM7NEJBQ0MsSUFBSSxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0NBQ3hCLFdBQVcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUE7NEJBQ25DLENBQUM7d0JBQ0wsQ0FBQzt3QkFDRCxXQUFXLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQSxDQUFDLG9EQUFvRDtvQkFDcEYsQ0FBQztnQkFDTCxDQUFDO2dCQUVELE9BQU8sV0FBVyxDQUFBO1lBQ3RCLENBQUMsQ0FBQyxDQUNMLENBQUE7WUFHRCxJQUFJLFFBQVEsQ0FBQTtZQUNaLE1BQU0sVUFBVSxHQUlWLEVBQUUsQ0FBQTtZQUNSLE1BQU0sT0FBTyxHQUNULG1FQUFtRSxDQUFBO1lBQ3ZFLE9BQU8sQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO2dCQUM3QyxVQUFVLENBQUMsSUFBSSxDQUFDO29CQUNaLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO29CQUNqQixPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQzt5QkFDZixNQUFNLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO3lCQUNqQyxLQUFLLENBQUMsTUFBTSxDQUFDO29CQUNsQixtQkFBbUIsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO2lCQUNuQyxDQUFDLENBQUE7WUFDTixDQUFDO1lBR0QsTUFBTSwwQkFBMEIsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUM1QyxhQUFhLEVBQ2IsQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FDdkMsQ0FBQTtZQUVELEtBQUssQ0FBQyxXQUFXLEdBQUcsMEJBQTBCLENBQUMsR0FBRyxDQUM5QyxDQUFDLFVBQVUsRUFBRSxFQUFFO2dCQUNYLE1BQU0sY0FBYyxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQ3ZDLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FDYixZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssVUFBVSxDQUFDLElBQUksQ0FBQztvQkFDdkMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxLQUFLLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FDcEQsQ0FBQTtnQkFDRCxNQUFNLFdBQVcsR0FBRyxjQUFjLENBQUMsR0FBRyxDQUNsQyxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUN6QyxDQUFBO2dCQUNELE1BQU0scUJBQXFCLEdBQUcsY0FBYyxDQUFDLEdBQUcsQ0FDNUMsQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FDdkMsQ0FBQTtnQkFHRCxNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUM3QixDQUFDLEVBQUUsRUFBRSxFQUFFLENBQ0gsRUFBRSxDQUFDLG1CQUFtQjtvQkFDbEIsVUFBVSxDQUFDLE9BQU8sQ0FBQztvQkFDdkIsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQ1osQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUNQLFdBQVcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQ3pDLENBQ1IsQ0FBQTtnQkFFRCxPQUFPLElBQUksZUFBZSxDQUFDO29CQUN2QixJQUFJLEVBQUUsU0FBVSxDQUFDLElBQUk7b0JBQ3JCLFdBQVcsRUFBRSxXQUFXO29CQUN4QixtQkFBbUIsRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDO29CQUN4QyxxQkFBcUIsRUFBRSxxQkFBcUI7b0JBQzVDLFFBQVEsRUFBRSxVQUFVLENBQUMsV0FBVyxDQUFDO29CQUNqQyxRQUFRLEVBQUUsVUFBVSxDQUFDLFdBQVcsQ0FBQztpQkFDcEMsQ0FBQyxDQUFBO1lBQ04sQ0FBQyxDQUNKLENBQUE7WUFHRCxJQUFJLGlCQUFpQixDQUFBO1lBQ3JCLE1BQU0sY0FBYyxHQUEwQyxFQUFFLENBQUE7WUFDaEUsTUFBTSxXQUFXLEdBQUcseUNBQXlDLENBQUE7WUFDN0QsT0FBTyxDQUFDLGlCQUFpQixHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztnQkFDMUQsY0FBYyxDQUFDLElBQUksQ0FBQztvQkFDaEIsSUFBSSxFQUFFLGlCQUFpQixDQUFDLENBQUMsQ0FBQztvQkFDMUIsT0FBTyxFQUFFLGlCQUFpQixDQUFDLENBQUMsQ0FBQzt5QkFDeEIsTUFBTSxDQUFDLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO3lCQUMxQyxLQUFLLENBQUMsTUFBTSxDQUFDO2lCQUNyQixDQUFDLENBQUE7WUFDTixDQUFDO1lBR0QsTUFBTSxtQkFBbUIsR0FBRyxTQUFTO2lCQUNoQyxNQUFNLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxHQUFHLENBQUM7aUJBQzlDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2lCQUNqQyxNQUFNLENBQ0gsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxLQUFLLENBQ3hEO2lCQUNBLEdBQUcsQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLEVBQUU7Z0JBQ3ZCLE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQzFCLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssV0FBVyxDQUMvQyxDQUFBO2dCQUNELE1BQU0sVUFBVSxHQUFvQixNQUFNLElBQUksQ0FBQyxLQUFLLENBQ2hELHNCQUFzQixPQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDN0MsQ0FBQTtnQkFDRCxNQUFNLFlBQVksR0FBRyxVQUFVO3FCQUMxQixJQUFJLENBQ0QsQ0FBQyxVQUFVLEVBQUUsVUFBVSxFQUFFLEVBQUUsQ0FDdkIsUUFBUSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDN0IsUUFBUSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUNwQztxQkFDQSxHQUFHLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFBO2dCQUMxQyxJQUFJLFlBQVksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7b0JBQzVCLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7d0JBQ3pDLE9BQU8sQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQ3RCLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FDWixXQUFXLEtBQUssTUFBTSxDQUFDLElBQUksQ0FDbEMsQ0FBQTtvQkFDTCxDQUFDLENBQUMsQ0FBQTtvQkFDRixJQUFJLE1BQU07d0JBQUUsTUFBTSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUE7Z0JBQ3RDLENBQUM7Z0JBR0QsTUFBTSxZQUFZLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO29CQUNqRCxPQUFPLE9BQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUN6QixDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FDbEQsQ0FBQTtnQkFDTCxDQUFDLENBQUMsQ0FBQTtnQkFFRixPQUFPLElBQUksV0FBVyxDQUFDO29CQUNuQixJQUFJLEVBQUUsWUFBWTt3QkFDZCxDQUFDLENBQUMsWUFBWSxDQUFDLElBQUk7d0JBQ25CLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxvQkFBb0IsQ0FDL0MsS0FBSyxFQUNMLFlBQVksQ0FDZjtvQkFDUCxXQUFXLEVBQUUsWUFBWTtpQkFDNUIsQ0FBQyxDQUFBO1lBQ04sQ0FBQyxDQUFDLENBQUE7WUFDTixLQUFLLENBQUMsT0FBTyxHQUFHLENBQUMsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUM5QixtQkFBbUIsQ0FDdEIsQ0FBa0IsQ0FBQTtZQUduQixJQUFJLE1BQU0sQ0FBQTtZQUNWLE1BQU0sTUFBTSxHQUNSLGtEQUFrRCxDQUFBO1lBQ3RELE9BQU8sQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO2dCQUMxQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDYixJQUFJLFVBQVUsQ0FBQztvQkFDWCxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztvQkFDZixVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztpQkFDeEIsQ0FBQyxDQUNMLENBQUE7WUFDTCxDQUFDO1lBR0QsTUFBTSxlQUFlLEdBQUcsU0FBUztpQkFDNUIsTUFBTSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssR0FBRyxDQUFDO2lCQUM5QyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztpQkFDakMsTUFBTSxDQUNILENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssS0FBSyxDQUN4RCxDQUFDLFNBQVM7aUJBQ1YsR0FBRyxDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsRUFBRTtnQkFDdkIsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FDOUIsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsS0FBSyxXQUFXLENBQ3JELENBQUE7Z0JBQ0QsTUFBTSxTQUFTLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxRQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtnQkFDckQsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FDMUIsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxXQUFXLENBQy9DLENBQUE7Z0JBQ0QsTUFBTSxVQUFVLEdBQW9CLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FDaEQsc0JBQXNCLE9BQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUM3QyxDQUFBO2dCQUNELE1BQU0sWUFBWSxHQUFHLFVBQVU7cUJBQzFCLElBQUksQ0FDRCxDQUFDLFVBQVUsRUFBRSxVQUFVLEVBQUUsRUFBRSxDQUN2QixRQUFRLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUM3QixRQUFRLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQ3BDO3FCQUNBLEdBQUcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUE7Z0JBQzFDLE1BQU0sV0FBVyxHQUFHLEdBQ2hCLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFDdEQsR0FBRyxPQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQTtnQkFFckIsTUFBTSxRQUFRLEdBQ1YsT0FBUSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEdBQUc7b0JBQzFCLE9BQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUE7Z0JBQzVCLE9BQU8sSUFBSSxVQUFVLENBQW9CO29CQUNyQyxLQUFLLEVBQUUsS0FBSztvQkFDWixJQUFJLEVBQUUsV0FBVztvQkFDakIsV0FBVyxFQUFFLFlBQVk7b0JBQ3pCLFFBQVEsRUFBRSxRQUFRO29CQUNsQixLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVM7aUJBQzlDLENBQUMsQ0FBQTtZQUNOLENBQUMsQ0FBQyxDQUFBO1lBQ04sTUFBTSxPQUFPLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFBO1lBQ2xELEtBQUssQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FDMUIsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQ0wsQ0FBQTtZQUVqQixPQUFPLEtBQUssQ0FBQTtRQUNoQixDQUFDLENBQUMsQ0FDTCxDQUFBO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ08sY0FBYyxDQUNwQixLQUFZLEVBQ1osaUJBQTJCLEVBQzNCLGNBQXdCO1FBRXhCLE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUN2QyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FDL0IsQ0FBQTtRQUNELE1BQU0sZ0JBQWdCLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FDeEMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUNQLE1BQU0sQ0FBQyxXQUFXLElBQUksTUFBTSxDQUFDLGtCQUFrQixLQUFLLFdBQVcsQ0FDdEUsQ0FBQTtRQUNELE1BQU0sV0FBVyxHQUFHLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFBO1FBQzdDLElBQUksV0FBVyxJQUFJLGdCQUFnQjtZQUMvQixNQUFNLElBQUksWUFBWSxDQUNsQixnRUFBZ0UsQ0FDbkUsQ0FBQTtRQUVMLE1BQU0saUJBQWlCLEdBQUcsS0FBSyxDQUFDLE9BQU87YUFDbEMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFDO2FBQy9ELElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNmLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNsRCxJQUFJLEdBQUcsR0FBRyxnQkFBZ0IsSUFBSSxDQUFDLFVBQVUsQ0FDckMsS0FBSyxDQUFDLElBQUksQ0FDYixLQUFLLGlCQUFpQixFQUFFLENBQUE7UUFFekIsSUFBSSxDQUFDLFdBQVcsRUFBRSxTQUFTLENBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUM5RCxNQUFNLFlBQVksR0FBRyxjQUFjO1lBQy9CLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxXQUFXLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQ3ZELGFBQWEsRUFDYixFQUFFLENBQ0wsRUFBRTtZQUNMLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFBO1FBR2hCLEtBQUssQ0FBQyxPQUFPO2FBQ1IsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDO2FBQ25DLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ2hCLE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUNwQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQ1AsTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEtBQUssQ0FBQztnQkFDL0IsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsS0FBSyxNQUFNLENBQUMsSUFBSSxDQUM1QyxDQUFBO1lBQ0QsSUFBSSxDQUFDLGFBQWE7Z0JBQ2QsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQ2QsSUFBSSxXQUFXLENBQUM7b0JBQ1osSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLG9CQUFvQixDQUNyRCxLQUFLLEVBQ0wsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQ2hCO29CQUNELFdBQVcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7aUJBQzdCLENBQUMsQ0FDTCxDQUFBO1FBQ1QsQ0FBQyxDQUFDLENBQUE7UUFFTixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzNCLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxPQUFPO2lCQUMzQixHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtnQkFDWixNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsSUFBSTtvQkFDMUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJO29CQUNiLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxvQkFBb0IsQ0FDL0MsWUFBWSxFQUNaLE1BQU0sQ0FBQyxXQUFXLENBQ3JCLENBQUE7Z0JBQ1AsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLFdBQVc7cUJBQ2pDLEdBQUcsQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsSUFBSSxVQUFVLEdBQUcsQ0FBQztxQkFDdEMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO2dCQUNmLE9BQU8sZUFBZSxVQUFVLGFBQWEsV0FBVyxHQUFHLENBQUE7WUFDL0QsQ0FBQyxDQUFDO2lCQUNELElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtZQUVmLEdBQUcsSUFBSSxLQUFLLFVBQVUsRUFBRSxDQUFBO1FBQzVCLENBQUM7UUFFRCxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzFCLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxNQUFNO2lCQUN6QixHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDWCxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsSUFBSTtvQkFDeEIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJO29CQUNaLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxtQkFBbUIsQ0FDOUMsWUFBWSxFQUNaLEtBQUssQ0FBQyxVQUFXLENBQ3BCLENBQUE7Z0JBQ1AsT0FBTyxlQUFlLFNBQVMsWUFBWSxLQUFLLENBQUMsVUFBVSxHQUFHLENBQUE7WUFDbEUsQ0FBQyxDQUFDO2lCQUNELElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtZQUVmLEdBQUcsSUFBSSxLQUFLLFNBQVMsRUFBRSxDQUFBO1FBQzNCLENBQUM7UUFFRCxJQUFJLEtBQUssQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxpQkFBaUIsRUFBRSxDQUFDO1lBQ3BELE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxXQUFXO2lCQUNuQyxNQUFNLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRTtnQkFDWCxNQUFNLENBQUMsa0JBQWtCLENBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUM1QyxFQUFFLENBQUMsbUJBQW1CLENBQ3pCLENBQUE7Z0JBQ0QsSUFBSSxrQkFBa0IsS0FBSyxRQUFRLEVBQUUsQ0FBQztvQkFDbEMsT0FBTyxLQUFLLENBQUE7Z0JBQ2hCLENBQUM7Z0JBQ0QsT0FBTyxJQUFJLENBQUE7WUFDZixDQUFDLENBQUM7aUJBQ0QsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUU7Z0JBQ1IsTUFBTSxDQUFDLEVBQUUsZUFBZSxDQUFDLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FDM0MsRUFBRSxDQUFDLG1CQUFtQixDQUN6QixDQUFBO2dCQUNELE1BQU0sV0FBVyxHQUFHLEVBQUUsQ0FBQyxXQUFXO3FCQUM3QixHQUFHLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLElBQUksVUFBVSxHQUFHLENBQUM7cUJBQ3RDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtnQkFDZixJQUFJLENBQUMsRUFBRSxDQUFDLElBQUk7b0JBQ1IsRUFBRSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQ25ELFlBQVksRUFDWixFQUFFLENBQUMsV0FBVyxFQUNkLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLEVBQ3JCLEVBQUUsQ0FBQyxxQkFBcUIsQ0FDM0IsQ0FBQTtnQkFDTCxNQUFNLHFCQUFxQixHQUFHLEVBQUUsQ0FBQyxxQkFBcUI7cUJBQ2pELEdBQUcsQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsSUFBSSxVQUFVLEdBQUcsQ0FBQztxQkFDdEMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO2dCQUVmLElBQUksVUFBVSxHQUFHLGVBQWUsRUFBRSxDQUFDLElBQUksa0JBQWtCLFdBQVcsaUJBQWlCLGVBQWUsTUFBTSxxQkFBcUIsR0FBRyxDQUFBO2dCQUNsSSxJQUFJLEVBQUUsQ0FBQyxRQUFRO29CQUFFLFVBQVUsSUFBSSxjQUFjLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQTtnQkFDMUQsSUFBSSxFQUFFLENBQUMsUUFBUTtvQkFBRSxVQUFVLElBQUksY0FBYyxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUE7Z0JBQzFELElBQUksRUFBRSxDQUFDLFVBQVU7b0JBQ2IsVUFBVSxJQUFJLGVBQWUsRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFBO2dCQUVoRCxPQUFPLFVBQVUsQ0FBQTtZQUNyQixDQUFDLENBQUM7aUJBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO1lBRWYsR0FBRyxJQUFJLEtBQUssY0FBYyxFQUFFLENBQUE7UUFDaEMsQ0FBQztRQUVELElBQUksY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUM1QixNQUFNLFdBQVcsR0FBRyxjQUFjO2lCQUM3QixHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLElBQUksTUFBTSxDQUFDLElBQUksR0FBRyxDQUFDO2lCQUNuQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7WUFDZixHQUFHLElBQUksa0JBQWtCLFdBQVcsR0FBRyxDQUFBO1FBQzNDLENBQUM7UUFFRCxHQUFHLElBQUksR0FBRyxDQUFBO1FBRVYsSUFBSSxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDckIsR0FBRyxJQUFJLGdCQUFnQixDQUFBO1FBQzNCLENBQUM7UUFFRCxPQUFPLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQ3pCLENBQUM7SUFFRDs7T0FFRztJQUNPLFlBQVksQ0FDbEIsV0FBMkIsRUFDM0IsT0FBaUI7UUFFakIsTUFBTSxTQUFTLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUM7WUFDbEQsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJO1lBQ2xCLENBQUMsQ0FBQyxXQUFXLENBQUE7UUFDakIsTUFBTSxLQUFLLEdBQUcsT0FBTztZQUNqQixDQUFDLENBQUMsd0JBQXdCLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEVBQUU7WUFDdEQsQ0FBQyxDQUFDLGNBQWMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFBO1FBQ2hELE9BQU8sSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDM0IsQ0FBQztJQUVTLGFBQWEsQ0FBQyxJQUFVO1FBQzlCLElBQUksT0FBTyxJQUFJLENBQUMsVUFBVSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3RDLE9BQU8sSUFBSSxLQUFLLENBQUMsZ0JBQWdCLElBQUksQ0FBQyxJQUFJLFFBQVEsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUE7UUFDeEUsQ0FBQzthQUFNLENBQUM7WUFDSixPQUFPLElBQUksS0FBSyxDQUNaLGdCQUFnQixJQUFJLENBQUMsSUFBSSxRQUFRLElBQUk7aUJBQ2hDLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO2lCQUMzQixRQUFRLEVBQUUsRUFBRSxDQUNwQixDQUFBO1FBQ0wsQ0FBQztJQUNMLENBQUM7SUFFUyx1QkFBdUIsQ0FBQyxJQUFVO1FBQ3hDLE1BQU0sVUFBVSxHQUNaLE9BQU8sSUFBSSxDQUFDLFVBQVUsS0FBSyxRQUFRO1lBQy9CLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRTtZQUN4QixDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUE7UUFDckQsT0FBTyxJQUFJLENBQUMsd0JBQXdCLENBQUM7WUFDakMsSUFBSSxFQUFFLGlCQUFpQixDQUFDLElBQUk7WUFDNUIsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ2YsS0FBSyxFQUFFLFVBQVU7U0FDcEIsQ0FBQyxDQUFBO0lBQ04sQ0FBQztJQUVEOztPQUVHO0lBQ08sV0FBVyxDQUFDLFVBQXlCO1FBQzNDLE1BQU0sUUFBUSxHQUFHLGVBQWUsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDO1lBQy9DLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSTtZQUNqQixDQUFDLENBQUMsVUFBVSxDQUFBO1FBQ2hCLE9BQU8sSUFBSSxLQUFLLENBQUMsY0FBYyxRQUFRLEdBQUcsQ0FBQyxDQUFBO0lBQy9DLENBQUM7SUFFRDs7T0FFRztJQUNPLHVCQUF1QixDQUFDLFVBQXlCO1FBQ3ZELE1BQU0sUUFBUSxHQUFHLGVBQWUsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDO1lBQy9DLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSTtZQUNqQixDQUFDLENBQUMsVUFBVSxDQUFBO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLHdCQUF3QixDQUFDO1lBQ2pDLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxJQUFJO1lBQzVCLElBQUksRUFBRSxRQUFRO1NBQ2pCLENBQUMsQ0FBQTtJQUNOLENBQUM7SUFFRDs7T0FFRztJQUNPLGNBQWMsQ0FBQyxLQUFZLEVBQUUsS0FBaUI7UUFDcEQsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLFdBQVc7YUFDNUIsR0FBRyxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxJQUFJLFVBQVUsR0FBRyxDQUFDO2FBQ3RDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNmLE1BQU0sQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDN0QsT0FBTyxJQUFJLEtBQUssQ0FDWixVQUFVLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUNyQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksUUFBUSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQ2xDLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSyxDQUFDLFFBQVEsU0FBUyxNQUFNLE9BQU8sS0FDekQsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQzNDLEVBQUUsQ0FDTCxDQUFBO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ08sWUFBWSxDQUFDLFdBQWdDO1FBQ25ELElBQUksU0FBUyxHQUFHLGVBQWUsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDO1lBQ3JELENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSTtZQUNsQixDQUFDLENBQUMsV0FBVyxDQUFBO1FBQ2pCLE9BQU8sSUFBSSxLQUFLLENBQUMsY0FBYyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUNqRSxDQUFDO0lBRUQ7O09BRUc7SUFDTyxvQkFBb0IsQ0FDMUIsTUFBbUIsRUFDbkIsV0FBcUI7UUFFckIsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFBO1FBQy9CLElBQUksZUFBZSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDM0MsQ0FBQyxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUNoRCxDQUFDO2FBQU0sQ0FBQztZQUNKLENBQUMsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQzVELENBQUM7UUFFRCxJQUFJLE1BQU0sQ0FBQyxJQUFJO1lBQ1gsQ0FBQztnQkFDRyxXQUFXO29CQUNYLE1BQU0sQ0FBQyxJQUFJO29CQUNYLFFBQVE7b0JBQ1IsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztvQkFDbkQsS0FBSyxDQUFBO1FBQ2IsSUFBSSxNQUFNLENBQUMsU0FBUyxJQUFJLENBQUMsV0FBVztZQUFFLENBQUMsSUFBSSxjQUFjLENBQUE7UUFDekQsSUFDSSxNQUFNLENBQUMsV0FBVyxLQUFLLElBQUk7WUFDM0IsTUFBTSxDQUFDLGtCQUFrQixLQUFLLFdBQVc7WUFHekMsQ0FBQyxJQUFJLGdCQUFnQixDQUFBO1FBQ3pCLElBQUksTUFBTSxDQUFDLFNBQVM7WUFBRSxDQUFDLElBQUksV0FBVyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUE7UUFDekQsSUFBSSxNQUFNLENBQUMsVUFBVSxLQUFLLElBQUk7WUFBRSxDQUFDLElBQUksV0FBVyxDQUFBO1FBRWhELElBQUksTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3RCLENBQUMsSUFBSSxRQUFRLE1BQU0sQ0FBQyxZQUFZLEtBQzVCLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFNBQ2xELEVBQUUsQ0FBQTtRQUNOLENBQUM7YUFBTSxDQUFDO1lBQ0osSUFBSSxNQUFNLENBQUMsT0FBTyxLQUFLLFNBQVMsSUFBSSxNQUFNLENBQUMsT0FBTyxLQUFLLElBQUk7Z0JBQ3ZELENBQUMsSUFBSSxZQUFZLEdBQUcsTUFBTSxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUE7UUFDaEQsQ0FBQztRQUVELE9BQU8sQ0FBQyxDQUFBO0lBQ1osQ0FBQztJQUVTLEtBQUssQ0FBQyxhQUFhLENBQ3pCLFFBQWUsRUFDZixRQUFlLEVBQ2YsV0FBVyxHQUFHLElBQUk7UUFFbEIsTUFBTSxTQUFTLEdBQVksRUFBRSxDQUFBO1FBQzdCLE1BQU0sV0FBVyxHQUFZLEVBQUUsQ0FBQTtRQUcvQixRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQy9CLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFBO1lBQ3hDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQTtRQUMxRCxDQUFDLENBQUMsQ0FBQTtRQUdGLElBQUksQ0FBQyxXQUFXLEVBQUUsWUFBWSxDQUFDLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDcEUsSUFBSSxDQUFDLEVBQUUsWUFBWSxDQUFDLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDekQsUUFBUSxDQUFDLElBQUksR0FBRyxZQUFZLEdBQUcsR0FDM0IsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUN0QyxhQUFhLFlBQVksRUFBRSxDQUFBO1FBRzNCLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUE7UUFDekQsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUE7UUFHN0MsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUNkLElBQUksY0FBYyxHQUFHLFFBQVEsQ0FBQyxPQUFPO2lCQUNoQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQztpQkFDekMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFBO1lBRXhDLElBQUksY0FBYyxHQUFHLFFBQVEsQ0FBQyxPQUFPO2lCQUNoQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQztpQkFDekMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFBO1lBRXhDLElBQUksY0FBYyxDQUFDLE1BQU0sR0FBRyxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ2hELGNBQWMsR0FBRyxRQUFRLENBQUMsT0FBTztxQkFDNUIsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7b0JBQ2YsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQ25DLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLE1BQU0sQ0FBQyxJQUFJLENBQ2hDLENBQUE7b0JBQ0QsSUFBSSxTQUFTLElBQUksU0FBUyxDQUFDLGFBQWE7d0JBQUUsT0FBTyxLQUFLLENBQUE7b0JBQ3RELE9BQU8sQ0FBQyxNQUFNLENBQUMsYUFBYSxJQUFJLFNBQVMsQ0FBQTtnQkFDN0MsQ0FBQyxDQUFDO3FCQUNELEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQTtZQUM1QyxDQUFDO2lCQUFNLElBQUksY0FBYyxDQUFDLE1BQU0sR0FBRyxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ3ZELGNBQWMsR0FBRyxRQUFRLENBQUMsT0FBTztxQkFDNUIsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7b0JBQ2YsT0FBTyxDQUNILENBQUMsTUFBTSxDQUFDLGFBQWE7d0JBQ3JCLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FDdkQsQ0FBQTtnQkFDTCxDQUFDLENBQUM7cUJBQ0QsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFBO1lBQzVDLENBQUM7WUFFRCxTQUFTLENBQUMsSUFBSSxDQUNWLElBQUksS0FBSyxDQUNMLGVBQWUsSUFBSSxDQUFDLFVBQVUsQ0FDMUIsUUFBUSxDQUFDLElBQUksQ0FDaEIsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUNwQixJQUFJLENBQ1AsWUFBWSxjQUFjLENBQUMsSUFBSSxDQUM1QixJQUFJLENBQ1AsU0FBUyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUM3QyxDQUNKLENBQUE7WUFDRCxXQUFXLENBQUMsSUFBSSxDQUNaLElBQUksS0FBSyxDQUNMLGVBQWUsSUFBSSxDQUFDLFVBQVUsQ0FDMUIsUUFBUSxDQUFDLElBQUksQ0FDaEIsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUNwQixJQUFJLENBQ1AsWUFBWSxjQUFjLENBQUMsSUFBSSxDQUM1QixJQUFJLENBQ1AsU0FBUyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUM3QyxDQUNKLENBQUE7UUFDTCxDQUFDO1FBR0QsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUE7UUFDM0MsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFBO1FBR3JELFNBQVMsQ0FBQyxJQUFJLENBQ1YsSUFBSSxLQUFLLENBQ0wsZUFBZSxJQUFJLENBQUMsVUFBVSxDQUMxQixRQUFRLENBQUMsSUFBSSxDQUNoQixjQUFjLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FDakQsQ0FDSixDQUFBO1FBQ0QsV0FBVyxDQUFDLElBQUksQ0FDWixJQUFJLEtBQUssQ0FDTCxlQUFlLElBQUksQ0FBQyxVQUFVLENBQzFCLFFBQVEsQ0FBQyxJQUFJLENBQ2hCLGNBQWMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUNqRCxDQUNKLENBQUE7UUFFRCxRQUFRLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUE7UUFHN0IsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUUvQixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUk7Z0JBQ1gsS0FBSyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQ2pELFFBQVEsRUFDUixLQUFLLENBQUMsV0FBVyxFQUNqQixLQUFLLENBQUMsS0FBSyxDQUNkLENBQUE7WUFDTCxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUE7WUFDcEQsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUE7UUFDOUMsQ0FBQyxDQUFDLENBQUE7UUFJRixRQUFRLENBQUMsT0FBTzthQUNYLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ2YsTUFBTSxjQUFjLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQ3hDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLE1BQU0sQ0FBQyxJQUFJLENBQ2hDLENBQUE7WUFHRCxPQUFPLENBQ0gsTUFBTSxDQUFDLGFBQWE7Z0JBQ3BCLE1BQU0sQ0FBQyxZQUFZO2dCQUNuQixDQUFDLENBQUMsY0FBYztvQkFDWixDQUFDLENBQUMsY0FBYyxDQUFDLGFBQWE7d0JBQzFCLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQ3pDLENBQUE7UUFDTCxDQUFDLENBQUM7YUFDRCxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUNoQixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUM7Z0JBQzlDLEtBQUssRUFBRSxRQUFRLENBQUMsSUFBSTtnQkFDcEIsSUFBSSxFQUFFLGlCQUFpQixDQUFDLGdCQUFnQjtnQkFDeEMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJO2FBQ3BCLENBQUMsQ0FBQTtZQUVGLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQztnQkFDOUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxJQUFJO2dCQUNwQixJQUFJLEVBQUUsaUJBQWlCLENBQUMsZ0JBQWdCO2dCQUN4QyxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7Z0JBQ2pCLEtBQUssRUFBRSxNQUFNLENBQUMsWUFBWTthQUM3QixDQUFDLENBQUE7WUFFRixTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFBO1lBQzNCLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUE7UUFDakMsQ0FBQyxDQUFDLENBQUE7UUFHTixRQUFRLENBQUMsT0FBTzthQUNYLE1BQU0sQ0FDSCxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQ1AsTUFBTSxDQUFDLGFBQWE7WUFDcEIsTUFBTSxDQUFDLFlBQVk7WUFDbkIsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQzVEO2FBQ0EsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDaEIsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDO2dCQUM5QyxLQUFLLEVBQUUsUUFBUSxDQUFDLElBQUk7Z0JBQ3BCLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxnQkFBZ0I7Z0JBQ3hDLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtnQkFDakIsS0FBSyxFQUFFLE1BQU0sQ0FBQyxZQUFZO2FBQzdCLENBQUMsQ0FBQTtZQUVGLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQztnQkFDOUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxJQUFJO2dCQUNwQixJQUFJLEVBQUUsaUJBQWlCLENBQUMsZ0JBQWdCO2dCQUN4QyxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7YUFDcEIsQ0FBQyxDQUFBO1lBRUYsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQTtZQUMzQixXQUFXLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFBO1FBQ2pDLENBQUMsQ0FBQyxDQUFBO1FBR04sUUFBUSxDQUFDLE9BQU87YUFDWCxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxhQUFhLElBQUksTUFBTSxDQUFDLFlBQVksQ0FBQzthQUMvRCxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUNoQixNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FDbkMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUNGLENBQUMsQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLElBQUk7Z0JBQ3RCLENBQUMsQ0FBQyxhQUFhO2dCQUNmLE1BQU0sQ0FBQyxhQUFhO2dCQUNwQixDQUFDLENBQUMsWUFBWSxLQUFLLE1BQU0sQ0FBQyxZQUFZLENBQzdDLENBQUE7WUFFRCxJQUFJLENBQUMsU0FBUztnQkFBRSxPQUFNO1lBR3RCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQztnQkFDOUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxJQUFJO2dCQUNwQixJQUFJLEVBQUUsaUJBQWlCLENBQUMsZ0JBQWdCO2dCQUN4QyxJQUFJLEVBQUUsU0FBUyxDQUFDLElBQUk7YUFDdkIsQ0FBQyxDQUFBO1lBRUYsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDO2dCQUM5QyxLQUFLLEVBQUUsUUFBUSxDQUFDLElBQUk7Z0JBQ3BCLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxnQkFBZ0I7Z0JBQ3hDLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtnQkFDakIsS0FBSyxFQUFFLE1BQU0sQ0FBQyxZQUFZO2FBQzdCLENBQUMsQ0FBQTtZQUVGLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUE7WUFDM0IsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQTtZQUczQixNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQztnQkFDcEQsS0FBSyxFQUFFLFFBQVEsQ0FBQyxJQUFJO2dCQUNwQixJQUFJLEVBQUUsaUJBQWlCLENBQUMsZ0JBQWdCO2dCQUN4QyxJQUFJLEVBQUUsU0FBUyxDQUFDLElBQUk7Z0JBQ3BCLEtBQUssRUFBRSxTQUFTLENBQUMsWUFBWTthQUNoQyxDQUFDLENBQUE7WUFFRixNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQztnQkFDcEQsS0FBSyxFQUFFLFFBQVEsQ0FBQyxJQUFJO2dCQUNwQixJQUFJLEVBQUUsaUJBQWlCLENBQUMsZ0JBQWdCO2dCQUN4QyxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7YUFDcEIsQ0FBQyxDQUFBO1lBRUYsV0FBVyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBO1lBQ25DLFdBQVcsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQTtRQUN2QyxDQUFDLENBQUMsQ0FBQTtRQUVOLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDLENBQUE7UUFDakQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQTtJQUMvQyxDQUFDO0lBRUQ7O09BRUc7SUFDTyxjQUFjLENBQUMsU0FBaUI7UUFDdEMsT0FBTyxDQUNILFNBQVMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3pCLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQztZQUN0QixDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQ0MsQ0FBQTtJQUNyQyxDQUFDO0lBRUQ7O09BRUc7SUFDTyxVQUFVLENBQ2hCLE1BQTZCLEVBQzdCLGFBQXVCO1FBRXZCLE1BQU0sU0FBUyxHQUNYLGVBQWUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksZUFBZSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7WUFDN0QsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJO1lBQ2IsQ0FBQyxDQUFDLE1BQU0sQ0FBQTtRQUNoQixPQUFPLFNBQVM7YUFDWCxPQUFPLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQzthQUN6QixLQUFLLENBQUMsR0FBRyxDQUFDO2FBQ1YsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDMUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQ2xCLENBQUM7Q0FDSjtBQUVBLENBQUM7QUFBQSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMseUdBQXlHIiwic291cmNlc0NvbnRlbnQiOlsiXG5cbmltcG9ydCB7IFF1ZXJ5UnVubmVyIH0gZnJvbSBcIi4uLy4uL3F1ZXJ5LXJ1bm5lci9RdWVyeVJ1bm5lclwiXG5pbXBvcnQgeyBPYmplY3RMaXRlcmFsIH0gZnJvbSBcIi4uLy4uL2NvbW1vbi9PYmplY3RMaXRlcmFsXCJcbmltcG9ydCB7IFRyYW5zYWN0aW9uTm90U3RhcnRlZEVycm9yIH0gZnJvbSBcIi4uLy4uL2Vycm9yL1RyYW5zYWN0aW9uTm90U3RhcnRlZEVycm9yXCJcbmltcG9ydCB7IFRhYmxlQ29sdW1uIH0gZnJvbSBcIi4uLy4uL3NjaGVtYS1idWlsZGVyL3RhYmxlL1RhYmxlQ29sdW1uXCJcbmltcG9ydCB7IFRhYmxlIH0gZnJvbSBcIi4uLy4uL3NjaGVtYS1idWlsZGVyL3RhYmxlL1RhYmxlXCJcbmltcG9ydCB7IFRhYmxlSW5kZXggfSBmcm9tIFwiLi4vLi4vc2NoZW1hLWJ1aWxkZXIvdGFibGUvVGFibGVJbmRleFwiXG5pbXBvcnQgeyBUYWJsZUZvcmVpZ25LZXkgfSBmcm9tIFwiLi4vLi4vc2NoZW1hLWJ1aWxkZXIvdGFibGUvVGFibGVGb3JlaWduS2V5XCJcbmltcG9ydCB7IFZpZXcgfSBmcm9tIFwiLi4vLi4vc2NoZW1hLWJ1aWxkZXIvdmlldy9WaWV3XCJcbmltcG9ydCB7IFF1ZXJ5IH0gZnJvbSBcIi4uL1F1ZXJ5XCJcbmltcG9ydCB7IEFic3RyYWN0U3FsaXRlRHJpdmVyIH0gZnJvbSBcIi4vQWJzdHJhY3RTcWxpdGVEcml2ZXJcIlxuLyogKi9cbi8qICovXG4gIFxuaW1wb3J0IHsgVGFibGVJbmRleE9wdGlvbnMgfSBmcm9tIFwiLi4vLi4vc2NoZW1hLWJ1aWxkZXIvb3B0aW9ucy9UYWJsZUluZGV4T3B0aW9uc1wiXG5pbXBvcnQgeyBUYWJsZVVuaXF1ZSB9IGZyb20gXCIuLi8uLi9zY2hlbWEtYnVpbGRlci90YWJsZS9UYWJsZVVuaXF1ZVwiXG5pbXBvcnQgeyBCYXNlUXVlcnlSdW5uZXIgfSBmcm9tIFwiLi4vLi4vcXVlcnktcnVubmVyL0Jhc2VRdWVyeVJ1bm5lclwiXG5pbXBvcnQgeyBPcm1VdGlscyB9IGZyb20gXCIuLi8uLi91dGlsL09ybVV0aWxzXCJcbmltcG9ydCB7IFRhYmxlQ2hlY2sgfSBmcm9tIFwiLi4vLi4vc2NoZW1hLWJ1aWxkZXIvdGFibGUvVGFibGVDaGVja1wiXG5pbXBvcnQgeyBJc29sYXRpb25MZXZlbCB9IGZyb20gXCIuLi90eXBlcy9Jc29sYXRpb25MZXZlbFwiXG5pbXBvcnQgeyBUYWJsZUV4Y2x1c2lvbiB9IGZyb20gXCIuLi8uLi9zY2hlbWEtYnVpbGRlci90YWJsZS9UYWJsZUV4Y2x1c2lvblwiXG5pbXBvcnQgeyBUcmFuc2FjdGlvbkFscmVhZHlTdGFydGVkRXJyb3IsIFR5cGVPUk1FcnJvciB9IGZyb20gXCIuLi8uLi9lcnJvclwiXG5pbXBvcnQgeyBNZXRhZGF0YVRhYmxlVHlwZSB9IGZyb20gXCIuLi90eXBlcy9NZXRhZGF0YVRhYmxlVHlwZVwiXG5pbXBvcnQgeyBJbnN0YW5jZUNoZWNrZXIgfSBmcm9tIFwiLi4vLi4vdXRpbC9JbnN0YW5jZUNoZWNrZXJcIlxuXG4vKipcbiAqIFJ1bnMgcXVlcmllcyBvbiBhIHNpbmdsZSBzcWxpdGUgZGF0YWJhc2UgY29ubmVjdGlvbi5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U3FsaXRlUXVlcnlSdW5uZXJcbiAgICBleHRlbmRzIEJhc2VRdWVyeVJ1bm5lclxuICAgIGltcGxlbWVudHMgUXVlcnlSdW5uZXJcbntcblxuXG5cblxuICAgIC8qKlxuICAgICAqIERhdGFiYXNlIGRyaXZlciB1c2VkIGJ5IGNvbm5lY3Rpb24uXG4gICAgICovXG4gICAgZHJpdmVyOiBBYnN0cmFjdFNxbGl0ZURyaXZlclxuXG4gICAgcHJvdGVjdGVkIHRyYW5zYWN0aW9uUHJvbWlzZTogUHJvbWlzZTxhbnk+IHwgbnVsbCA9IG51bGxcblxuXG5cblxuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKClcbiAgICB9XG5cblxuXG5cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMvdXNlcyBkYXRhYmFzZSBjb25uZWN0aW9uIGZyb20gdGhlIGNvbm5lY3Rpb24gcG9vbCB0byBwZXJmb3JtIGZ1cnRoZXIgb3BlcmF0aW9ucy5cbiAgICAgKiBSZXR1cm5zIG9idGFpbmVkIGRhdGFiYXNlIGNvbm5lY3Rpb24uXG4gICAgICovXG4gICAgY29ubmVjdCgpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuZHJpdmVyLmRhdGFiYXNlQ29ubmVjdGlvbilcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZWxlYXNlcyB1c2VkIGRhdGFiYXNlIGNvbm5lY3Rpb24uXG4gICAgICogV2UganVzdCBjbGVhciBsb2FkZWQgdGFibGVzIGFuZCBzcWwgaW4gbWVtb3J5LCBiZWNhdXNlIHNxbGl0ZSBkbyBub3Qgc3VwcG9ydCBtdWx0aXBsZSBjb25uZWN0aW9ucyB0aHVzIHF1ZXJ5IHJ1bm5lcnMuXG4gICAgICovXG4gICAgcmVsZWFzZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5sb2FkZWRUYWJsZXMgPSBbXVxuICAgICAgICB0aGlzLmNsZWFyU3FsTWVtb3J5KClcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3RhcnRzIHRyYW5zYWN0aW9uLlxuICAgICAqL1xuICAgIGFzeW5jIHN0YXJ0VHJhbnNhY3Rpb24oaXNvbGF0aW9uTGV2ZWw/OiBJc29sYXRpb25MZXZlbCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy5kcml2ZXIudHJhbnNhY3Rpb25TdXBwb3J0ID09PSBcIm5vbmVcIilcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXG4gICAgICAgICAgICAgICAgYFRyYW5zYWN0aW9ucyBhcmVuJ3Qgc3VwcG9ydGVkIGJ5ICR7dGhpcy5jb25uZWN0aW9uLmRyaXZlci5vcHRpb25zLnR5cGV9LmAsXG4gICAgICAgICAgICApXG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5pc1RyYW5zYWN0aW9uQWN0aXZlICYmXG4gICAgICAgICAgICB0aGlzLmRyaXZlci50cmFuc2FjdGlvblN1cHBvcnQgPT09IFwic2ltcGxlXCJcbiAgICAgICAgKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFRyYW5zYWN0aW9uQWxyZWFkeVN0YXJ0ZWRFcnJvcigpXG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgaXNvbGF0aW9uTGV2ZWwgJiZcbiAgICAgICAgICAgIGlzb2xhdGlvbkxldmVsICE9PSBcIlJFQUQgVU5DT01NSVRURURcIiAmJlxuICAgICAgICAgICAgaXNvbGF0aW9uTGV2ZWwgIT09IFwiU0VSSUFMSVpBQkxFXCJcbiAgICAgICAgKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcbiAgICAgICAgICAgICAgICBgU1FMaXRlIG9ubHkgc3VwcG9ydHMgU0VSSUFMSVpBQkxFIGFuZCBSRUFEIFVOQ09NTUlUVEVEIGlzb2xhdGlvbmAsXG4gICAgICAgICAgICApXG5cbiAgICAgICAgdGhpcy5pc1RyYW5zYWN0aW9uQWN0aXZlID0gdHJ1ZVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5icm9hZGNhc3Rlci5icm9hZGNhc3QoXCJCZWZvcmVUcmFuc2FjdGlvblN0YXJ0XCIpXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgdGhpcy5pc1RyYW5zYWN0aW9uQWN0aXZlID0gZmFsc2VcbiAgICAgICAgICAgIHRocm93IGVyclxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMudHJhbnNhY3Rpb25EZXB0aCA9PT0gMCkge1xuICAgICAgICAgICAgaWYgKGlzb2xhdGlvbkxldmVsKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzb2xhdGlvbkxldmVsID09PSBcIlJFQUQgVU5DT01NSVRURURcIikge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnF1ZXJ5KFwiUFJBR01BIHJlYWRfdW5jb21taXR0ZWQgPSB0cnVlXCIpXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5xdWVyeShcIlBSQUdNQSByZWFkX3VuY29tbWl0dGVkID0gZmFsc2VcIilcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnF1ZXJ5KFwiQkVHSU4gVFJBTlNBQ1RJT05cIilcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucXVlcnkoYFNBVkVQT0lOVCB0eXBlb3JtXyR7dGhpcy50cmFuc2FjdGlvbkRlcHRofWApXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRlcHRoICs9IDFcblxuICAgICAgICBhd2FpdCB0aGlzLmJyb2FkY2FzdGVyLmJyb2FkY2FzdChcIkFmdGVyVHJhbnNhY3Rpb25TdGFydFwiKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbW1pdHMgdHJhbnNhY3Rpb24uXG4gICAgICogRXJyb3Igd2lsbCBiZSB0aHJvd24gaWYgdHJhbnNhY3Rpb24gd2FzIG5vdCBzdGFydGVkLlxuICAgICAqL1xuICAgIGFzeW5jIGNvbW1pdFRyYW5zYWN0aW9uKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoIXRoaXMuaXNUcmFuc2FjdGlvbkFjdGl2ZSkgdGhyb3cgbmV3IFRyYW5zYWN0aW9uTm90U3RhcnRlZEVycm9yKClcblxuICAgICAgICBhd2FpdCB0aGlzLmJyb2FkY2FzdGVyLmJyb2FkY2FzdChcIkJlZm9yZVRyYW5zYWN0aW9uQ29tbWl0XCIpXG5cbiAgICAgICAgaWYgKHRoaXMudHJhbnNhY3Rpb25EZXB0aCA+IDEpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucXVlcnkoXG4gICAgICAgICAgICAgICAgYFJFTEVBU0UgU0FWRVBPSU5UIHR5cGVvcm1fJHt0aGlzLnRyYW5zYWN0aW9uRGVwdGggLSAxfWAsXG4gICAgICAgICAgICApXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnF1ZXJ5KFwiQ09NTUlUXCIpXG4gICAgICAgICAgICB0aGlzLmlzVHJhbnNhY3Rpb25BY3RpdmUgPSBmYWxzZVxuICAgICAgICB9XG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb25EZXB0aCAtPSAxXG5cbiAgICAgICAgYXdhaXQgdGhpcy5icm9hZGNhc3Rlci5icm9hZGNhc3QoXCJBZnRlclRyYW5zYWN0aW9uQ29tbWl0XCIpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUm9sbGJhY2tzIHRyYW5zYWN0aW9uLlxuICAgICAqIEVycm9yIHdpbGwgYmUgdGhyb3duIGlmIHRyYW5zYWN0aW9uIHdhcyBub3Qgc3RhcnRlZC5cbiAgICAgKi9cbiAgICBhc3luYyByb2xsYmFja1RyYW5zYWN0aW9uKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoIXRoaXMuaXNUcmFuc2FjdGlvbkFjdGl2ZSkgdGhyb3cgbmV3IFRyYW5zYWN0aW9uTm90U3RhcnRlZEVycm9yKClcblxuICAgICAgICBhd2FpdCB0aGlzLmJyb2FkY2FzdGVyLmJyb2FkY2FzdChcIkJlZm9yZVRyYW5zYWN0aW9uUm9sbGJhY2tcIilcblxuICAgICAgICBpZiAodGhpcy50cmFuc2FjdGlvbkRlcHRoID4gMSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5xdWVyeShcbiAgICAgICAgICAgICAgICBgUk9MTEJBQ0sgVE8gU0FWRVBPSU5UIHR5cGVvcm1fJHt0aGlzLnRyYW5zYWN0aW9uRGVwdGggLSAxfWAsXG4gICAgICAgICAgICApXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnF1ZXJ5KFwiUk9MTEJBQ0tcIilcbiAgICAgICAgICAgIHRoaXMuaXNUcmFuc2FjdGlvbkFjdGl2ZSA9IGZhbHNlXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRlcHRoIC09IDFcblxuICAgICAgICBhd2FpdCB0aGlzLmJyb2FkY2FzdGVyLmJyb2FkY2FzdChcIkFmdGVyVHJhbnNhY3Rpb25Sb2xsYmFja1wiKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgcmF3IGRhdGEgc3RyZWFtLlxuICAgICAqL1xuICAgIHN0cmVhbShcbiAgICAgICAgcXVlcnk6IHN0cmluZyxcbiAgICAgICAgcGFyYW1ldGVycz86IGFueVtdLFxuICAgICAgICBvbkVuZD86IEZ1bmN0aW9uLFxuICAgICAgICBvbkVycm9yPzogRnVuY3Rpb24sXG4gICAgKVxuLyogKi9cbi8qICovXG4gIFxuICAgIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihgU3RyZWFtIGlzIG5vdCBzdXBwb3J0ZWQgYnkgc3FsaXRlIGRyaXZlci5gKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYWxsIGF2YWlsYWJsZSBkYXRhYmFzZSBuYW1lcyBpbmNsdWRpbmcgc3lzdGVtIGRhdGFiYXNlcy5cbiAgICAgKi9cbiAgICBhc3luYyBnZXREYXRhYmFzZXMoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFtdKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYWxsIGF2YWlsYWJsZSBzY2hlbWEgbmFtZXMgaW5jbHVkaW5nIHN5c3RlbSBzY2hlbWFzLlxuICAgICAqIElmIGRhdGFiYXNlIHBhcmFtZXRlciBzcGVjaWZpZWQsIHJldHVybnMgc2NoZW1hcyBvZiB0aGF0IGRhdGFiYXNlLlxuICAgICAqL1xuICAgIGFzeW5jIGdldFNjaGVtYXMoZGF0YWJhc2U/OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoW10pXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGRhdGFiYXNlIHdpdGggdGhlIGdpdmVuIG5hbWUgZXhpc3QuXG4gICAgICovXG4gICAgYXN5bmMgaGFzRGF0YWJhc2UoZGF0YWJhc2U6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWRzIGN1cnJlbnRseSB1c2luZyBkYXRhYmFzZVxuICAgICAqL1xuICAgIGFzeW5jIGdldEN1cnJlbnREYXRhYmFzZSgpOiBQcm9taXNlPHVuZGVmaW5lZD4ge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZClcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgc2NoZW1hIHdpdGggdGhlIGdpdmVuIG5hbWUgZXhpc3QuXG4gICAgICovXG4gICAgYXN5bmMgaGFzU2NoZW1hKHNjaGVtYTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoYFRoaXMgZHJpdmVyIGRvZXMgbm90IHN1cHBvcnQgdGFibGUgc2NoZW1hc2ApXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZHMgY3VycmVudGx5IHVzaW5nIGRhdGFiYXNlIHNjaGVtYVxuICAgICAqL1xuICAgIGFzeW5jIGdldEN1cnJlbnRTY2hlbWEoKTogUHJvbWlzZTx1bmRlZmluZWQ+IHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRhYmxlIHdpdGggdGhlIGdpdmVuIG5hbWUgZXhpc3QgaW4gdGhlIGRhdGFiYXNlLlxuICAgICAqL1xuICAgIGFzeW5jIGhhc1RhYmxlKHRhYmxlT3JOYW1lOiBUYWJsZSB8IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBjb25zdCB0YWJsZU5hbWUgPSBJbnN0YW5jZUNoZWNrZXIuaXNUYWJsZSh0YWJsZU9yTmFtZSlcbiAgICAgICAgICAgID8gdGFibGVPck5hbWUubmFtZVxuICAgICAgICAgICAgOiB0YWJsZU9yTmFtZVxuICAgICAgICBjb25zdCBzcWwgPSBgU0VMRUNUICogRlJPTSBcInNxbGl0ZV9tYXN0ZXJcIiBXSEVSRSBcInR5cGVcIiA9ICd0YWJsZScgQU5EIFwibmFtZVwiID0gJyR7dGFibGVOYW1lfSdgXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucXVlcnkoc3FsKVxuICAgICAgICByZXR1cm4gcmVzdWx0Lmxlbmd0aCA/IHRydWUgOiBmYWxzZVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBjb2x1bW4gd2l0aCB0aGUgZ2l2ZW4gbmFtZSBleGlzdCBpbiB0aGUgZ2l2ZW4gdGFibGUuXG4gICAgICovXG4gICAgYXN5bmMgaGFzQ29sdW1uKFxuICAgICAgICB0YWJsZU9yTmFtZTogVGFibGUgfCBzdHJpbmcsXG4gICAgICAgIGNvbHVtbk5hbWU6IHN0cmluZyxcbiAgICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgY29uc3QgdGFibGVOYW1lID0gSW5zdGFuY2VDaGVja2VyLmlzVGFibGUodGFibGVPck5hbWUpXG4gICAgICAgICAgICA/IHRhYmxlT3JOYW1lLm5hbWVcbiAgICAgICAgICAgIDogdGFibGVPck5hbWVcbiAgICAgICAgY29uc3Qgc3FsID0gYFBSQUdNQSB0YWJsZV94aW5mbygke3RoaXMuZXNjYXBlUGF0aCh0YWJsZU5hbWUpfSlgXG4gICAgICAgIGNvbnN0IGNvbHVtbnM6IE9iamVjdExpdGVyYWxbXSA9IGF3YWl0IHRoaXMucXVlcnkoc3FsKVxuICAgICAgICByZXR1cm4gISFjb2x1bW5zLmZpbmQoKGNvbHVtbikgPT4gY29sdW1uW1wibmFtZVwiXSA9PT0gY29sdW1uTmFtZSlcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGRhdGFiYXNlLlxuICAgICAqL1xuICAgIGFzeW5jIGNyZWF0ZURhdGFiYXNlKFxuICAgICAgICBkYXRhYmFzZTogc3RyaW5nLFxuICAgICAgICBpZk5vdEV4aXN0PzogYm9vbGVhbixcbiAgICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRHJvcHMgZGF0YWJhc2UuXG4gICAgICovXG4gICAgYXN5bmMgZHJvcERhdGFiYXNlKGRhdGFiYXNlOiBzdHJpbmcsIGlmRXhpc3Q/OiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgdGFibGUgc2NoZW1hLlxuICAgICAqL1xuICAgIGFzeW5jIGNyZWF0ZVNjaGVtYShcbiAgICAgICAgc2NoZW1hUGF0aDogc3RyaW5nLFxuICAgICAgICBpZk5vdEV4aXN0PzogYm9vbGVhbixcbiAgICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRHJvcHMgdGFibGUgc2NoZW1hLlxuICAgICAqL1xuICAgIGFzeW5jIGRyb3BTY2hlbWEoc2NoZW1hUGF0aDogc3RyaW5nLCBpZkV4aXN0PzogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKClcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHRhYmxlLlxuICAgICAqL1xuICAgIGFzeW5jIGNyZWF0ZVRhYmxlKFxuICAgICAgICB0YWJsZTogVGFibGUsXG4gICAgICAgIGlmTm90RXhpc3Q6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICAgICAgY3JlYXRlRm9yZWlnbktleXM6IGJvb2xlYW4gPSB0cnVlLFxuICAgICAgICBjcmVhdGVJbmRpY2VzOiBib29sZWFuID0gdHJ1ZSxcbiAgICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgdXBRdWVyaWVzOiBRdWVyeVtdID0gW11cbiAgICAgICAgY29uc3QgZG93blF1ZXJpZXM6IFF1ZXJ5W10gPSBbXVxuXG4gICAgICAgIGlmIChpZk5vdEV4aXN0KSB7XG4gICAgICAgICAgICBjb25zdCBpc1RhYmxlRXhpc3QgPSBhd2FpdCB0aGlzLmhhc1RhYmxlKHRhYmxlKVxuICAgICAgICAgICAgaWYgKGlzVGFibGVFeGlzdCkgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG4gICAgICAgIH1cblxuICAgICAgICB1cFF1ZXJpZXMucHVzaCh0aGlzLmNyZWF0ZVRhYmxlU3FsKHRhYmxlLCBjcmVhdGVGb3JlaWduS2V5cykpXG4gICAgICAgIGRvd25RdWVyaWVzLnB1c2godGhpcy5kcm9wVGFibGVTcWwodGFibGUpKVxuXG4gICAgICAgIGlmIChjcmVhdGVJbmRpY2VzKSB7XG4gICAgICAgICAgICB0YWJsZS5pbmRpY2VzLmZvckVhY2goKGluZGV4KSA9PiB7XG5cbiAgICAgICAgICAgICAgICBpZiAoIWluZGV4Lm5hbWUpXG4gICAgICAgICAgICAgICAgICAgIGluZGV4Lm5hbWUgPSB0aGlzLmNvbm5lY3Rpb24ubmFtaW5nU3RyYXRlZ3kuaW5kZXhOYW1lKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleC5jb2x1bW5OYW1lcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LndoZXJlLFxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgdXBRdWVyaWVzLnB1c2godGhpcy5jcmVhdGVJbmRleFNxbCh0YWJsZSwgaW5kZXgpKVxuICAgICAgICAgICAgICAgIGRvd25RdWVyaWVzLnB1c2godGhpcy5kcm9wSW5kZXhTcWwoaW5kZXgpKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG5cbiAgICAgICAgY29uc3QgZ2VuZXJhdGVkQ29sdW1ucyA9IHRhYmxlLmNvbHVtbnMuZmlsdGVyKFxuICAgICAgICAgICAgKGNvbHVtbikgPT4gY29sdW1uLmdlbmVyYXRlZFR5cGUgJiYgY29sdW1uLmFzRXhwcmVzc2lvbixcbiAgICAgICAgKVxuXG4gICAgICAgIGZvciAoY29uc3QgY29sdW1uIG9mIGdlbmVyYXRlZENvbHVtbnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGluc2VydFF1ZXJ5ID0gdGhpcy5pbnNlcnRUeXBlb3JtTWV0YWRhdGFTcWwoe1xuICAgICAgICAgICAgICAgIHRhYmxlOiB0YWJsZS5uYW1lLFxuICAgICAgICAgICAgICAgIHR5cGU6IE1ldGFkYXRhVGFibGVUeXBlLkdFTkVSQVRFRF9DT0xVTU4sXG4gICAgICAgICAgICAgICAgbmFtZTogY29sdW1uLm5hbWUsXG4gICAgICAgICAgICAgICAgdmFsdWU6IGNvbHVtbi5hc0V4cHJlc3Npb24sXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICBjb25zdCBkZWxldGVRdWVyeSA9IHRoaXMuZGVsZXRlVHlwZW9ybU1ldGFkYXRhU3FsKHtcbiAgICAgICAgICAgICAgICB0YWJsZTogdGFibGUubmFtZSxcbiAgICAgICAgICAgICAgICB0eXBlOiBNZXRhZGF0YVRhYmxlVHlwZS5HRU5FUkFURURfQ09MVU1OLFxuICAgICAgICAgICAgICAgIG5hbWU6IGNvbHVtbi5uYW1lLFxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgdXBRdWVyaWVzLnB1c2goaW5zZXJ0UXVlcnkpXG4gICAgICAgICAgICBkb3duUXVlcmllcy5wdXNoKGRlbGV0ZVF1ZXJ5KVxuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgdGhpcy5leGVjdXRlUXVlcmllcyh1cFF1ZXJpZXMsIGRvd25RdWVyaWVzKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERyb3BzIHRoZSB0YWJsZS5cbiAgICAgKi9cbiAgICBhc3luYyBkcm9wVGFibGUoXG4gICAgICAgIHRhYmxlT3JOYW1lOiBUYWJsZSB8IHN0cmluZyxcbiAgICAgICAgaWZFeGlzdD86IGJvb2xlYW4sXG4gICAgICAgIGRyb3BGb3JlaWduS2V5czogYm9vbGVhbiA9IHRydWUsXG4gICAgICAgIGRyb3BJbmRpY2VzOiBib29sZWFuID0gdHJ1ZSxcbiAgICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKGlmRXhpc3QpIHtcbiAgICAgICAgICAgIGNvbnN0IGlzVGFibGVFeGlzdCA9IGF3YWl0IHRoaXMuaGFzVGFibGUodGFibGVPck5hbWUpXG4gICAgICAgICAgICBpZiAoIWlzVGFibGVFeGlzdCkgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG4gICAgICAgIH1cblxuXG4gICAgICAgIGNvbnN0IGNyZWF0ZUZvcmVpZ25LZXlzOiBib29sZWFuID0gZHJvcEZvcmVpZ25LZXlzXG4gICAgICAgIGNvbnN0IHRhYmxlID0gSW5zdGFuY2VDaGVja2VyLmlzVGFibGUodGFibGVPck5hbWUpXG4gICAgICAgICAgICA/IHRhYmxlT3JOYW1lXG4gICAgICAgICAgICA6IGF3YWl0IHRoaXMuZ2V0Q2FjaGVkVGFibGUodGFibGVPck5hbWUpXG4gICAgICAgIGNvbnN0IHVwUXVlcmllczogUXVlcnlbXSA9IFtdXG4gICAgICAgIGNvbnN0IGRvd25RdWVyaWVzOiBRdWVyeVtdID0gW11cblxuICAgICAgICBpZiAoZHJvcEluZGljZXMpIHtcbiAgICAgICAgICAgIHRhYmxlLmluZGljZXMuZm9yRWFjaCgoaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICB1cFF1ZXJpZXMucHVzaCh0aGlzLmRyb3BJbmRleFNxbChpbmRleCkpXG4gICAgICAgICAgICAgICAgZG93blF1ZXJpZXMucHVzaCh0aGlzLmNyZWF0ZUluZGV4U3FsKHRhYmxlLCBpbmRleCkpXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgdXBRdWVyaWVzLnB1c2godGhpcy5kcm9wVGFibGVTcWwodGFibGUsIGlmRXhpc3QpKVxuICAgICAgICBkb3duUXVlcmllcy5wdXNoKHRoaXMuY3JlYXRlVGFibGVTcWwodGFibGUsIGNyZWF0ZUZvcmVpZ25LZXlzKSlcblxuXG4gICAgICAgIGNvbnN0IGdlbmVyYXRlZENvbHVtbnMgPSB0YWJsZS5jb2x1bW5zLmZpbHRlcihcbiAgICAgICAgICAgIChjb2x1bW4pID0+IGNvbHVtbi5nZW5lcmF0ZWRUeXBlICYmIGNvbHVtbi5hc0V4cHJlc3Npb24sXG4gICAgICAgIClcblxuICAgICAgICBmb3IgKGNvbnN0IGNvbHVtbiBvZiBnZW5lcmF0ZWRDb2x1bW5zKSB7XG4gICAgICAgICAgICBjb25zdCBkZWxldGVRdWVyeSA9IHRoaXMuZGVsZXRlVHlwZW9ybU1ldGFkYXRhU3FsKHtcbiAgICAgICAgICAgICAgICB0YWJsZTogdGFibGUubmFtZSxcbiAgICAgICAgICAgICAgICB0eXBlOiBNZXRhZGF0YVRhYmxlVHlwZS5HRU5FUkFURURfQ09MVU1OLFxuICAgICAgICAgICAgICAgIG5hbWU6IGNvbHVtbi5uYW1lLFxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgY29uc3QgaW5zZXJ0UXVlcnkgPSB0aGlzLmluc2VydFR5cGVvcm1NZXRhZGF0YVNxbCh7XG4gICAgICAgICAgICAgICAgdGFibGU6IHRhYmxlLm5hbWUsXG4gICAgICAgICAgICAgICAgdHlwZTogTWV0YWRhdGFUYWJsZVR5cGUuR0VORVJBVEVEX0NPTFVNTixcbiAgICAgICAgICAgICAgICBuYW1lOiBjb2x1bW4ubmFtZSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogY29sdW1uLmFzRXhwcmVzc2lvbixcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKGRlbGV0ZVF1ZXJ5KVxuICAgICAgICAgICAgZG93blF1ZXJpZXMucHVzaChpbnNlcnRRdWVyeSlcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHRoaXMuZXhlY3V0ZVF1ZXJpZXModXBRdWVyaWVzLCBkb3duUXVlcmllcylcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHZpZXcuXG4gICAgICovXG4gICAgYXN5bmMgY3JlYXRlVmlldyhcbiAgICAgICAgdmlldzogVmlldyxcbiAgICAgICAgc3luY1dpdGhNZXRhZGF0YTogYm9vbGVhbiA9IGZhbHNlLFxuICAgICk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCB1cFF1ZXJpZXM6IFF1ZXJ5W10gPSBbXVxuICAgICAgICBjb25zdCBkb3duUXVlcmllczogUXVlcnlbXSA9IFtdXG4gICAgICAgIHVwUXVlcmllcy5wdXNoKHRoaXMuY3JlYXRlVmlld1NxbCh2aWV3KSlcbiAgICAgICAgaWYgKHN5bmNXaXRoTWV0YWRhdGEpIHVwUXVlcmllcy5wdXNoKHRoaXMuaW5zZXJ0Vmlld0RlZmluaXRpb25TcWwodmlldykpXG4gICAgICAgIGRvd25RdWVyaWVzLnB1c2godGhpcy5kcm9wVmlld1NxbCh2aWV3KSlcbiAgICAgICAgaWYgKHN5bmNXaXRoTWV0YWRhdGEpXG4gICAgICAgICAgICBkb3duUXVlcmllcy5wdXNoKHRoaXMuZGVsZXRlVmlld0RlZmluaXRpb25TcWwodmlldykpXG4gICAgICAgIGF3YWl0IHRoaXMuZXhlY3V0ZVF1ZXJpZXModXBRdWVyaWVzLCBkb3duUXVlcmllcylcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEcm9wcyB0aGUgdmlldy5cbiAgICAgKi9cbiAgICBhc3luYyBkcm9wVmlldyh0YXJnZXQ6IFZpZXcgfCBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3Qgdmlld05hbWUgPSBJbnN0YW5jZUNoZWNrZXIuaXNWaWV3KHRhcmdldCkgPyB0YXJnZXQubmFtZSA6IHRhcmdldFxuICAgICAgICBjb25zdCB2aWV3ID0gYXdhaXQgdGhpcy5nZXRDYWNoZWRWaWV3KHZpZXdOYW1lKVxuXG4gICAgICAgIGNvbnN0IHVwUXVlcmllczogUXVlcnlbXSA9IFtdXG4gICAgICAgIGNvbnN0IGRvd25RdWVyaWVzOiBRdWVyeVtdID0gW11cbiAgICAgICAgdXBRdWVyaWVzLnB1c2godGhpcy5kZWxldGVWaWV3RGVmaW5pdGlvblNxbCh2aWV3KSlcbiAgICAgICAgdXBRdWVyaWVzLnB1c2godGhpcy5kcm9wVmlld1NxbCh2aWV3KSlcbiAgICAgICAgZG93blF1ZXJpZXMucHVzaCh0aGlzLmluc2VydFZpZXdEZWZpbml0aW9uU3FsKHZpZXcpKVxuICAgICAgICBkb3duUXVlcmllcy5wdXNoKHRoaXMuY3JlYXRlVmlld1NxbCh2aWV3KSlcbiAgICAgICAgYXdhaXQgdGhpcy5leGVjdXRlUXVlcmllcyh1cFF1ZXJpZXMsIGRvd25RdWVyaWVzKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbmFtZXMgdGhlIGdpdmVuIHRhYmxlLlxuICAgICAqL1xuICAgIGFzeW5jIHJlbmFtZVRhYmxlKFxuICAgICAgICBvbGRUYWJsZU9yTmFtZTogVGFibGUgfCBzdHJpbmcsXG4gICAgICAgIG5ld1RhYmxlTmFtZTogc3RyaW5nLFxuICAgICk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBvbGRUYWJsZSA9IEluc3RhbmNlQ2hlY2tlci5pc1RhYmxlKG9sZFRhYmxlT3JOYW1lKVxuICAgICAgICAgICAgPyBvbGRUYWJsZU9yTmFtZVxuICAgICAgICAgICAgOiBhd2FpdCB0aGlzLmdldENhY2hlZFRhYmxlKG9sZFRhYmxlT3JOYW1lKVxuICAgICAgICBjb25zdCBuZXdUYWJsZSA9IG9sZFRhYmxlLmNsb25lKClcblxuICAgICAgICBuZXdUYWJsZS5uYW1lID0gbmV3VGFibGVOYW1lXG5cblxuICAgICAgICBjb25zdCB1cCA9IG5ldyBRdWVyeShcbiAgICAgICAgICAgIGBBTFRFUiBUQUJMRSAke3RoaXMuZXNjYXBlUGF0aChcbiAgICAgICAgICAgICAgICBvbGRUYWJsZS5uYW1lLFxuICAgICAgICAgICAgKX0gUkVOQU1FIFRPICR7dGhpcy5lc2NhcGVQYXRoKG5ld1RhYmxlTmFtZSl9YCxcbiAgICAgICAgKVxuICAgICAgICBjb25zdCBkb3duID0gbmV3IFF1ZXJ5KFxuICAgICAgICAgICAgYEFMVEVSIFRBQkxFICR7dGhpcy5lc2NhcGVQYXRoKFxuICAgICAgICAgICAgICAgIG5ld1RhYmxlTmFtZSxcbiAgICAgICAgICAgICl9IFJFTkFNRSBUTyAke3RoaXMuZXNjYXBlUGF0aChvbGRUYWJsZS5uYW1lKX1gLFxuICAgICAgICApXG4gICAgICAgIGF3YWl0IHRoaXMuZXhlY3V0ZVF1ZXJpZXModXAsIGRvd24pXG5cblxuICAgICAgICBuZXdUYWJsZS51bmlxdWVzLmZvckVhY2goKHVuaXF1ZSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb2xkVW5pcXVlTmFtZSA9XG4gICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uLm5hbWluZ1N0cmF0ZWd5LnVuaXF1ZUNvbnN0cmFpbnROYW1lKFxuICAgICAgICAgICAgICAgICAgICBvbGRUYWJsZSxcbiAgICAgICAgICAgICAgICAgICAgdW5pcXVlLmNvbHVtbk5hbWVzLFxuICAgICAgICAgICAgICAgIClcblxuXG4gICAgICAgICAgICBpZiAodW5pcXVlLm5hbWUgIT09IG9sZFVuaXF1ZU5hbWUpIHJldHVyblxuXG4gICAgICAgICAgICB1bmlxdWUubmFtZSA9IHRoaXMuY29ubmVjdGlvbi5uYW1pbmdTdHJhdGVneS51bmlxdWVDb25zdHJhaW50TmFtZShcbiAgICAgICAgICAgICAgICBuZXdUYWJsZSxcbiAgICAgICAgICAgICAgICB1bmlxdWUuY29sdW1uTmFtZXMsXG4gICAgICAgICAgICApXG4gICAgICAgIH0pXG5cblxuICAgICAgICBuZXdUYWJsZS5mb3JlaWduS2V5cy5mb3JFYWNoKChmb3JlaWduS2V5KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBvbGRGb3JlaWduS2V5TmFtZSA9XG4gICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uLm5hbWluZ1N0cmF0ZWd5LmZvcmVpZ25LZXlOYW1lKFxuICAgICAgICAgICAgICAgICAgICBvbGRUYWJsZSxcbiAgICAgICAgICAgICAgICAgICAgZm9yZWlnbktleS5jb2x1bW5OYW1lcyxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRUYWJsZVBhdGgoZm9yZWlnbktleSksXG4gICAgICAgICAgICAgICAgICAgIGZvcmVpZ25LZXkucmVmZXJlbmNlZENvbHVtbk5hbWVzLFxuICAgICAgICAgICAgICAgIClcblxuXG4gICAgICAgICAgICBpZiAoZm9yZWlnbktleS5uYW1lICE9PSBvbGRGb3JlaWduS2V5TmFtZSkgcmV0dXJuXG5cbiAgICAgICAgICAgIGZvcmVpZ25LZXkubmFtZSA9IHRoaXMuY29ubmVjdGlvbi5uYW1pbmdTdHJhdGVneS5mb3JlaWduS2V5TmFtZShcbiAgICAgICAgICAgICAgICBuZXdUYWJsZSxcbiAgICAgICAgICAgICAgICBmb3JlaWduS2V5LmNvbHVtbk5hbWVzLFxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0VGFibGVQYXRoKGZvcmVpZ25LZXkpLFxuICAgICAgICAgICAgICAgIGZvcmVpZ25LZXkucmVmZXJlbmNlZENvbHVtbk5hbWVzLFxuICAgICAgICAgICAgKVxuICAgICAgICB9KVxuXG5cbiAgICAgICAgbmV3VGFibGUuaW5kaWNlcy5mb3JFYWNoKChpbmRleCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb2xkSW5kZXhOYW1lID0gdGhpcy5jb25uZWN0aW9uLm5hbWluZ1N0cmF0ZWd5LmluZGV4TmFtZShcbiAgICAgICAgICAgICAgICBvbGRUYWJsZSxcbiAgICAgICAgICAgICAgICBpbmRleC5jb2x1bW5OYW1lcyxcbiAgICAgICAgICAgICAgICBpbmRleC53aGVyZSxcbiAgICAgICAgICAgIClcblxuXG4gICAgICAgICAgICBpZiAoaW5kZXgubmFtZSAhPT0gb2xkSW5kZXhOYW1lKSByZXR1cm5cblxuICAgICAgICAgICAgaW5kZXgubmFtZSA9IHRoaXMuY29ubmVjdGlvbi5uYW1pbmdTdHJhdGVneS5pbmRleE5hbWUoXG4gICAgICAgICAgICAgICAgbmV3VGFibGUsXG4gICAgICAgICAgICAgICAgaW5kZXguY29sdW1uTmFtZXMsXG4gICAgICAgICAgICAgICAgaW5kZXgud2hlcmUsXG4gICAgICAgICAgICApXG4gICAgICAgIH0pXG5cblxuICAgICAgICBvbGRUYWJsZS5uYW1lID0gbmV3VGFibGUubmFtZVxuXG5cbiAgICAgICAgYXdhaXQgdGhpcy5yZWNyZWF0ZVRhYmxlKG5ld1RhYmxlLCBvbGRUYWJsZSlcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGNvbHVtbiBmcm9tIHRoZSBjb2x1bW4gaW4gdGhlIHRhYmxlLlxuICAgICAqL1xuICAgIGFzeW5jIGFkZENvbHVtbihcbiAgICAgICAgdGFibGVPck5hbWU6IFRhYmxlIHwgc3RyaW5nLFxuICAgICAgICBjb2x1bW46IFRhYmxlQ29sdW1uLFxuICAgICk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCB0YWJsZSA9IEluc3RhbmNlQ2hlY2tlci5pc1RhYmxlKHRhYmxlT3JOYW1lKVxuICAgICAgICAgICAgPyB0YWJsZU9yTmFtZVxuICAgICAgICAgICAgOiBhd2FpdCB0aGlzLmdldENhY2hlZFRhYmxlKHRhYmxlT3JOYW1lKVxuICAgICAgICByZXR1cm4gdGhpcy5hZGRDb2x1bW5zKHRhYmxlISwgW2NvbHVtbl0pXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBjb2x1bW5zIGZyb20gdGhlIGNvbHVtbiBpbiB0aGUgdGFibGUuXG4gICAgICovXG4gICAgYXN5bmMgYWRkQ29sdW1ucyhcbiAgICAgICAgdGFibGVPck5hbWU6IFRhYmxlIHwgc3RyaW5nLFxuICAgICAgICBjb2x1bW5zOiBUYWJsZUNvbHVtbltdLFxuICAgICk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCB0YWJsZSA9IEluc3RhbmNlQ2hlY2tlci5pc1RhYmxlKHRhYmxlT3JOYW1lKVxuICAgICAgICAgICAgPyB0YWJsZU9yTmFtZVxuICAgICAgICAgICAgOiBhd2FpdCB0aGlzLmdldENhY2hlZFRhYmxlKHRhYmxlT3JOYW1lKVxuICAgICAgICBjb25zdCBjaGFuZ2VkVGFibGUgPSB0YWJsZS5jbG9uZSgpXG4gICAgICAgIGNvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PiBjaGFuZ2VkVGFibGUuYWRkQ29sdW1uKGNvbHVtbikpXG4gICAgICAgIGF3YWl0IHRoaXMucmVjcmVhdGVUYWJsZShjaGFuZ2VkVGFibGUsIHRhYmxlKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbmFtZXMgY29sdW1uIGluIHRoZSBnaXZlbiB0YWJsZS5cbiAgICAgKi9cbiAgICBhc3luYyByZW5hbWVDb2x1bW4oXG4gICAgICAgIHRhYmxlT3JOYW1lOiBUYWJsZSB8IHN0cmluZyxcbiAgICAgICAgb2xkVGFibGVDb2x1bW5Pck5hbWU6IFRhYmxlQ29sdW1uIHwgc3RyaW5nLFxuICAgICAgICBuZXdUYWJsZUNvbHVtbk9yTmFtZTogVGFibGVDb2x1bW4gfCBzdHJpbmcsXG4gICAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHRhYmxlID0gSW5zdGFuY2VDaGVja2VyLmlzVGFibGUodGFibGVPck5hbWUpXG4gICAgICAgICAgICA/IHRhYmxlT3JOYW1lXG4gICAgICAgICAgICA6IGF3YWl0IHRoaXMuZ2V0Q2FjaGVkVGFibGUodGFibGVPck5hbWUpXG4gICAgICAgIGNvbnN0IG9sZENvbHVtbiA9IEluc3RhbmNlQ2hlY2tlci5pc1RhYmxlQ29sdW1uKG9sZFRhYmxlQ29sdW1uT3JOYW1lKVxuICAgICAgICAgICAgPyBvbGRUYWJsZUNvbHVtbk9yTmFtZVxuICAgICAgICAgICAgOiB0YWJsZS5jb2x1bW5zLmZpbmQoKGMpID0+IGMubmFtZSA9PT0gb2xkVGFibGVDb2x1bW5Pck5hbWUpXG4gICAgICAgIGlmICghb2xkQ29sdW1uKVxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcbiAgICAgICAgICAgICAgICBgQ29sdW1uIFwiJHtvbGRUYWJsZUNvbHVtbk9yTmFtZX1cIiB3YXMgbm90IGZvdW5kIGluIHRoZSBcIiR7dGFibGUubmFtZX1cIiB0YWJsZS5gLFxuICAgICAgICAgICAgKVxuXG4gICAgICAgIGxldCBuZXdDb2x1bW46IFRhYmxlQ29sdW1uIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkXG4gICAgICAgIGlmIChJbnN0YW5jZUNoZWNrZXIuaXNUYWJsZUNvbHVtbihuZXdUYWJsZUNvbHVtbk9yTmFtZSkpIHtcbiAgICAgICAgICAgIG5ld0NvbHVtbiA9IG5ld1RhYmxlQ29sdW1uT3JOYW1lXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuZXdDb2x1bW4gPSBvbGRDb2x1bW4uY2xvbmUoKVxuICAgICAgICAgICAgbmV3Q29sdW1uLm5hbWUgPSBuZXdUYWJsZUNvbHVtbk9yTmFtZVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuY2hhbmdlQ29sdW1uKHRhYmxlLCBvbGRDb2x1bW4sIG5ld0NvbHVtbilcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGFuZ2VzIGEgY29sdW1uIGluIHRoZSB0YWJsZS5cbiAgICAgKi9cbiAgICBhc3luYyBjaGFuZ2VDb2x1bW4oXG4gICAgICAgIHRhYmxlT3JOYW1lOiBUYWJsZSB8IHN0cmluZyxcbiAgICAgICAgb2xkVGFibGVDb2x1bW5Pck5hbWU6IFRhYmxlQ29sdW1uIHwgc3RyaW5nLFxuICAgICAgICBuZXdDb2x1bW46IFRhYmxlQ29sdW1uLFxuICAgICk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCB0YWJsZSA9IEluc3RhbmNlQ2hlY2tlci5pc1RhYmxlKHRhYmxlT3JOYW1lKVxuICAgICAgICAgICAgPyB0YWJsZU9yTmFtZVxuICAgICAgICAgICAgOiBhd2FpdCB0aGlzLmdldENhY2hlZFRhYmxlKHRhYmxlT3JOYW1lKVxuICAgICAgICBjb25zdCBvbGRDb2x1bW4gPSBJbnN0YW5jZUNoZWNrZXIuaXNUYWJsZUNvbHVtbihvbGRUYWJsZUNvbHVtbk9yTmFtZSlcbiAgICAgICAgICAgID8gb2xkVGFibGVDb2x1bW5Pck5hbWVcbiAgICAgICAgICAgIDogdGFibGUuY29sdW1ucy5maW5kKChjKSA9PiBjLm5hbWUgPT09IG9sZFRhYmxlQ29sdW1uT3JOYW1lKVxuICAgICAgICBpZiAoIW9sZENvbHVtbilcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXG4gICAgICAgICAgICAgICAgYENvbHVtbiBcIiR7b2xkVGFibGVDb2x1bW5Pck5hbWV9XCIgd2FzIG5vdCBmb3VuZCBpbiB0aGUgXCIke3RhYmxlLm5hbWV9XCIgdGFibGUuYCxcbiAgICAgICAgICAgIClcblxuICAgICAgICBhd2FpdCB0aGlzLmNoYW5nZUNvbHVtbnModGFibGUsIFt7IG9sZENvbHVtbiwgbmV3Q29sdW1uIH1dKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoYW5nZXMgYSBjb2x1bW4gaW4gdGhlIHRhYmxlLlxuICAgICAqIENoYW5nZWQgY29sdW1uIGxvb3NlcyBhbGwgaXRzIGtleXMgaW4gdGhlIGRiLlxuICAgICAqL1xuICAgIGFzeW5jIGNoYW5nZUNvbHVtbnMoXG4gICAgICAgIHRhYmxlT3JOYW1lOiBUYWJsZSB8IHN0cmluZyxcbiAgICAgICAgY2hhbmdlZENvbHVtbnM6IHsgb2xkQ29sdW1uOiBUYWJsZUNvbHVtbjsgbmV3Q29sdW1uOiBUYWJsZUNvbHVtbiB9W10sXG4gICAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHRhYmxlID0gSW5zdGFuY2VDaGVja2VyLmlzVGFibGUodGFibGVPck5hbWUpXG4gICAgICAgICAgICA/IHRhYmxlT3JOYW1lXG4gICAgICAgICAgICA6IGF3YWl0IHRoaXMuZ2V0Q2FjaGVkVGFibGUodGFibGVPck5hbWUpXG4gICAgICAgIGNvbnN0IGNoYW5nZWRUYWJsZSA9IHRhYmxlLmNsb25lKClcbiAgICAgICAgY2hhbmdlZENvbHVtbnMuZm9yRWFjaCgoY2hhbmdlZENvbHVtblNldCkgPT4ge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGNoYW5nZWRDb2x1bW5TZXQubmV3Q29sdW1uLm5hbWUgIT09XG4gICAgICAgICAgICAgICAgY2hhbmdlZENvbHVtblNldC5vbGRDb2x1bW4ubmFtZVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgY2hhbmdlZFRhYmxlXG4gICAgICAgICAgICAgICAgICAgIC5maW5kQ29sdW1uVW5pcXVlcyhjaGFuZ2VkQ29sdW1uU2V0Lm9sZENvbHVtbilcbiAgICAgICAgICAgICAgICAgICAgLmZvckVhY2goKHVuaXF1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5pcXVlTmFtZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uLm5hbWluZ1N0cmF0ZWd5LnVuaXF1ZUNvbnN0cmFpbnROYW1lKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlLmNvbHVtbk5hbWVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcblxuICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlLmNvbHVtbk5hbWVzLnNwbGljZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlxdWUuY29sdW1uTmFtZXMuaW5kZXhPZihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZENvbHVtblNldC5vbGRDb2x1bW4ubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICB1bmlxdWUuY29sdW1uTmFtZXMucHVzaChjaGFuZ2VkQ29sdW1uU2V0Lm5ld0NvbHVtbi5uYW1lKVxuXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1bmlxdWUubmFtZSA9PT0gdW5pcXVlTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXF1ZS5uYW1lID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uLm5hbWluZ1N0cmF0ZWd5LnVuaXF1ZUNvbnN0cmFpbnROYW1lKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZFRhYmxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlLmNvbHVtbk5hbWVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICBjaGFuZ2VkVGFibGVcbiAgICAgICAgICAgICAgICAgICAgLmZpbmRDb2x1bW5Gb3JlaWduS2V5cyhjaGFuZ2VkQ29sdW1uU2V0Lm9sZENvbHVtbilcbiAgICAgICAgICAgICAgICAgICAgLmZvckVhY2goKGZvcmVpZ25LZXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvcmVpZ25LZXlOYW1lID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24ubmFtaW5nU3RyYXRlZ3kuZm9yZWlnbktleU5hbWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlaWduS2V5LmNvbHVtbk5hbWVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFRhYmxlUGF0aChmb3JlaWduS2V5KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWlnbktleS5yZWZlcmVuY2VkQ29sdW1uTmFtZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JlaWduS2V5LmNvbHVtbk5hbWVzLnNwbGljZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlaWduS2V5LmNvbHVtbk5hbWVzLmluZGV4T2YoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWRDb2x1bW5TZXQub2xkQ29sdW1uLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWlnbktleS5jb2x1bW5OYW1lcy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWRDb2x1bW5TZXQubmV3Q29sdW1uLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICApXG5cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvcmVpZ25LZXkubmFtZSA9PT0gZm9yZWlnbktleU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlaWduS2V5Lm5hbWUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24ubmFtaW5nU3RyYXRlZ3kuZm9yZWlnbktleU5hbWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkVGFibGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlaWduS2V5LmNvbHVtbk5hbWVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRUYWJsZVBhdGgoZm9yZWlnbktleSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlaWduS2V5LnJlZmVyZW5jZWRDb2x1bW5OYW1lcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgY2hhbmdlZFRhYmxlXG4gICAgICAgICAgICAgICAgICAgIC5maW5kQ29sdW1uSW5kaWNlcyhjaGFuZ2VkQ29sdW1uU2V0Lm9sZENvbHVtbilcbiAgICAgICAgICAgICAgICAgICAgLmZvckVhY2goKGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmRleE5hbWUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbi5uYW1pbmdTdHJhdGVneS5pbmRleE5hbWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleC5jb2x1bW5OYW1lcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgud2hlcmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleC5jb2x1bW5OYW1lcy5zcGxpY2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXguY29sdW1uTmFtZXMuaW5kZXhPZihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZENvbHVtblNldC5vbGRDb2x1bW4ubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleC5jb2x1bW5OYW1lcy5wdXNoKGNoYW5nZWRDb2x1bW5TZXQubmV3Q29sdW1uLm5hbWUpXG5cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4Lm5hbWUgPT09IGluZGV4TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4Lm5hbWUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24ubmFtaW5nU3RyYXRlZ3kuaW5kZXhOYW1lKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZFRhYmxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXguY29sdW1uTmFtZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleC53aGVyZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxDb2x1bW4gPSBjaGFuZ2VkVGFibGUuY29sdW1ucy5maW5kKFxuICAgICAgICAgICAgICAgIChjb2x1bW4pID0+IGNvbHVtbi5uYW1lID09PSBjaGFuZ2VkQ29sdW1uU2V0Lm9sZENvbHVtbi5uYW1lLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgaWYgKG9yaWdpbmFsQ29sdW1uKVxuICAgICAgICAgICAgICAgIGNoYW5nZWRUYWJsZS5jb2x1bW5zW1xuICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkVGFibGUuY29sdW1ucy5pbmRleE9mKG9yaWdpbmFsQ29sdW1uKVxuICAgICAgICAgICAgICAgIF0gPSBjaGFuZ2VkQ29sdW1uU2V0Lm5ld0NvbHVtblxuICAgICAgICB9KVxuXG4gICAgICAgIGF3YWl0IHRoaXMucmVjcmVhdGVUYWJsZShjaGFuZ2VkVGFibGUsIHRhYmxlKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERyb3BzIGNvbHVtbiBpbiB0aGUgdGFibGUuXG4gICAgICovXG4gICAgYXN5bmMgZHJvcENvbHVtbihcbiAgICAgICAgdGFibGVPck5hbWU6IFRhYmxlIHwgc3RyaW5nLFxuICAgICAgICBjb2x1bW5Pck5hbWU6IFRhYmxlQ29sdW1uIHwgc3RyaW5nLFxuICAgICk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCB0YWJsZSA9IEluc3RhbmNlQ2hlY2tlci5pc1RhYmxlKHRhYmxlT3JOYW1lKVxuICAgICAgICAgICAgPyB0YWJsZU9yTmFtZVxuICAgICAgICAgICAgOiBhd2FpdCB0aGlzLmdldENhY2hlZFRhYmxlKHRhYmxlT3JOYW1lKVxuICAgICAgICBjb25zdCBjb2x1bW4gPSBJbnN0YW5jZUNoZWNrZXIuaXNUYWJsZUNvbHVtbihjb2x1bW5Pck5hbWUpXG4gICAgICAgICAgICA/IGNvbHVtbk9yTmFtZVxuICAgICAgICAgICAgOiB0YWJsZS5maW5kQ29sdW1uQnlOYW1lKGNvbHVtbk9yTmFtZSlcbiAgICAgICAgaWYgKCFjb2x1bW4pXG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKFxuICAgICAgICAgICAgICAgIGBDb2x1bW4gXCIke2NvbHVtbk9yTmFtZX1cIiB3YXMgbm90IGZvdW5kIGluIHRhYmxlIFwiJHt0YWJsZS5uYW1lfVwiYCxcbiAgICAgICAgICAgIClcblxuICAgICAgICBhd2FpdCB0aGlzLmRyb3BDb2x1bW5zKHRhYmxlLCBbY29sdW1uXSlcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEcm9wcyB0aGUgY29sdW1ucyBpbiB0aGUgdGFibGUuXG4gICAgICovXG4gICAgYXN5bmMgZHJvcENvbHVtbnMoXG4gICAgICAgIHRhYmxlT3JOYW1lOiBUYWJsZSB8IHN0cmluZyxcbiAgICAgICAgY29sdW1uczogVGFibGVDb2x1bW5bXSB8IHN0cmluZ1tdLFxuICAgICk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCB0YWJsZSA9IEluc3RhbmNlQ2hlY2tlci5pc1RhYmxlKHRhYmxlT3JOYW1lKVxuICAgICAgICAgICAgPyB0YWJsZU9yTmFtZVxuICAgICAgICAgICAgOiBhd2FpdCB0aGlzLmdldENhY2hlZFRhYmxlKHRhYmxlT3JOYW1lKVxuXG5cbiAgICAgICAgY29uc3QgY2hhbmdlZFRhYmxlID0gdGFibGUuY2xvbmUoKVxuICAgICAgICBjb2x1bW5zLmZvckVhY2goKGNvbHVtbjogVGFibGVDb2x1bW4gfCBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbHVtbkluc3RhbmNlID0gSW5zdGFuY2VDaGVja2VyLmlzVGFibGVDb2x1bW4oY29sdW1uKVxuICAgICAgICAgICAgICAgID8gY29sdW1uXG4gICAgICAgICAgICAgICAgOiB0YWJsZS5maW5kQ29sdW1uQnlOYW1lKGNvbHVtbilcbiAgICAgICAgICAgIGlmICghY29sdW1uSW5zdGFuY2UpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICBgQ29sdW1uIFwiJHtjb2x1bW59XCIgd2FzIG5vdCBmb3VuZCBpbiB0YWJsZSBcIiR7dGFibGUubmFtZX1cImAsXG4gICAgICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICBjaGFuZ2VkVGFibGUucmVtb3ZlQ29sdW1uKGNvbHVtbkluc3RhbmNlKVxuICAgICAgICAgICAgY2hhbmdlZFRhYmxlXG4gICAgICAgICAgICAgICAgLmZpbmRDb2x1bW5VbmlxdWVzKGNvbHVtbkluc3RhbmNlKVxuICAgICAgICAgICAgICAgIC5mb3JFYWNoKCh1bmlxdWUpID0+XG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZWRUYWJsZS5yZW1vdmVVbmlxdWVDb25zdHJhaW50KHVuaXF1ZSksXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgY2hhbmdlZFRhYmxlXG4gICAgICAgICAgICAgICAgLmZpbmRDb2x1bW5JbmRpY2VzKGNvbHVtbkluc3RhbmNlKVxuICAgICAgICAgICAgICAgIC5mb3JFYWNoKChpbmRleCkgPT4gY2hhbmdlZFRhYmxlLnJlbW92ZUluZGV4KGluZGV4KSlcbiAgICAgICAgICAgIGNoYW5nZWRUYWJsZVxuICAgICAgICAgICAgICAgIC5maW5kQ29sdW1uRm9yZWlnbktleXMoY29sdW1uSW5zdGFuY2UpXG4gICAgICAgICAgICAgICAgLmZvckVhY2goKGZrKSA9PiBjaGFuZ2VkVGFibGUucmVtb3ZlRm9yZWlnbktleShmaykpXG4gICAgICAgIH0pXG5cbiAgICAgICAgYXdhaXQgdGhpcy5yZWNyZWF0ZVRhYmxlKGNoYW5nZWRUYWJsZSwgdGFibGUpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBwcmltYXJ5IGtleS5cbiAgICAgKi9cbiAgICBhc3luYyBjcmVhdGVQcmltYXJ5S2V5KFxuICAgICAgICB0YWJsZU9yTmFtZTogVGFibGUgfCBzdHJpbmcsXG4gICAgICAgIGNvbHVtbk5hbWVzOiBzdHJpbmdbXSxcbiAgICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgdGFibGUgPSBJbnN0YW5jZUNoZWNrZXIuaXNUYWJsZSh0YWJsZU9yTmFtZSlcbiAgICAgICAgICAgID8gdGFibGVPck5hbWVcbiAgICAgICAgICAgIDogYXdhaXQgdGhpcy5nZXRDYWNoZWRUYWJsZSh0YWJsZU9yTmFtZSlcblxuICAgICAgICBjb25zdCBjaGFuZ2VkVGFibGUgPSB0YWJsZS5jbG9uZSgpXG4gICAgICAgIGNoYW5nZWRUYWJsZS5jb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xuICAgICAgICAgICAgaWYgKGNvbHVtbk5hbWVzLmZpbmQoKGNvbHVtbk5hbWUpID0+IGNvbHVtbk5hbWUgPT09IGNvbHVtbi5uYW1lKSlcbiAgICAgICAgICAgICAgICBjb2x1bW4uaXNQcmltYXJ5ID0gdHJ1ZVxuICAgICAgICB9KVxuXG4gICAgICAgIGF3YWl0IHRoaXMucmVjcmVhdGVUYWJsZShjaGFuZ2VkVGFibGUsIHRhYmxlKVxuXG4gICAgICAgIHRhYmxlLmNvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XG4gICAgICAgICAgICBpZiAoY29sdW1uTmFtZXMuZmluZCgoY29sdW1uTmFtZSkgPT4gY29sdW1uTmFtZSA9PT0gY29sdW1uLm5hbWUpKVxuICAgICAgICAgICAgICAgIGNvbHVtbi5pc1ByaW1hcnkgPSB0cnVlXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyBjb21wb3NpdGUgcHJpbWFyeSBrZXlzLlxuICAgICAqL1xuICAgIGFzeW5jIHVwZGF0ZVByaW1hcnlLZXlzKFxuICAgICAgICB0YWJsZU9yTmFtZTogVGFibGUgfCBzdHJpbmcsXG4gICAgICAgIGNvbHVtbnM6IFRhYmxlQ29sdW1uW10sXG4gICAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IFByb21pc2UucmVzb2x2ZSgpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRHJvcHMgYSBwcmltYXJ5IGtleS5cbiAgICAgKi9cbiAgICBhc3luYyBkcm9wUHJpbWFyeUtleSh0YWJsZU9yTmFtZTogVGFibGUgfCBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgdGFibGUgPSBJbnN0YW5jZUNoZWNrZXIuaXNUYWJsZSh0YWJsZU9yTmFtZSlcbiAgICAgICAgICAgID8gdGFibGVPck5hbWVcbiAgICAgICAgICAgIDogYXdhaXQgdGhpcy5nZXRDYWNoZWRUYWJsZSh0YWJsZU9yTmFtZSlcblxuICAgICAgICBjb25zdCBjaGFuZ2VkVGFibGUgPSB0YWJsZS5jbG9uZSgpXG4gICAgICAgIGNoYW5nZWRUYWJsZS5wcmltYXJ5Q29sdW1ucy5mb3JFYWNoKChjb2x1bW4pID0+IHtcbiAgICAgICAgICAgIGNvbHVtbi5pc1ByaW1hcnkgPSBmYWxzZVxuICAgICAgICB9KVxuXG4gICAgICAgIGF3YWl0IHRoaXMucmVjcmVhdGVUYWJsZShjaGFuZ2VkVGFibGUsIHRhYmxlKVxuXG4gICAgICAgIHRhYmxlLnByaW1hcnlDb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xuICAgICAgICAgICAgY29sdW1uLmlzUHJpbWFyeSA9IGZhbHNlXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyB1bmlxdWUgY29uc3RyYWludC5cbiAgICAgKi9cbiAgICBhc3luYyBjcmVhdGVVbmlxdWVDb25zdHJhaW50KFxuICAgICAgICB0YWJsZU9yTmFtZTogVGFibGUgfCBzdHJpbmcsXG4gICAgICAgIHVuaXF1ZUNvbnN0cmFpbnQ6IFRhYmxlVW5pcXVlLFxuICAgICk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmNyZWF0ZVVuaXF1ZUNvbnN0cmFpbnRzKHRhYmxlT3JOYW1lLCBbdW5pcXVlQ29uc3RyYWludF0pXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyB1bmlxdWUgY29uc3RyYWludHMuXG4gICAgICovXG4gICAgYXN5bmMgY3JlYXRlVW5pcXVlQ29uc3RyYWludHMoXG4gICAgICAgIHRhYmxlT3JOYW1lOiBUYWJsZSB8IHN0cmluZyxcbiAgICAgICAgdW5pcXVlQ29uc3RyYWludHM6IFRhYmxlVW5pcXVlW10sXG4gICAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHRhYmxlID0gSW5zdGFuY2VDaGVja2VyLmlzVGFibGUodGFibGVPck5hbWUpXG4gICAgICAgICAgICA/IHRhYmxlT3JOYW1lXG4gICAgICAgICAgICA6IGF3YWl0IHRoaXMuZ2V0Q2FjaGVkVGFibGUodGFibGVPck5hbWUpXG5cblxuICAgICAgICBjb25zdCBjaGFuZ2VkVGFibGUgPSB0YWJsZS5jbG9uZSgpXG4gICAgICAgIHVuaXF1ZUNvbnN0cmFpbnRzLmZvckVhY2goKHVuaXF1ZUNvbnN0cmFpbnQpID0+XG4gICAgICAgICAgICBjaGFuZ2VkVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCh1bmlxdWVDb25zdHJhaW50KSxcbiAgICAgICAgKVxuICAgICAgICBhd2FpdCB0aGlzLnJlY3JlYXRlVGFibGUoY2hhbmdlZFRhYmxlLCB0YWJsZSlcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEcm9wcyBhbiB1bmlxdWUgY29uc3RyYWludC5cbiAgICAgKi9cbiAgICBhc3luYyBkcm9wVW5pcXVlQ29uc3RyYWludChcbiAgICAgICAgdGFibGVPck5hbWU6IFRhYmxlIHwgc3RyaW5nLFxuICAgICAgICB1bmlxdWVPck5hbWU6IFRhYmxlVW5pcXVlIHwgc3RyaW5nLFxuICAgICk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCB0YWJsZSA9IEluc3RhbmNlQ2hlY2tlci5pc1RhYmxlKHRhYmxlT3JOYW1lKVxuICAgICAgICAgICAgPyB0YWJsZU9yTmFtZVxuICAgICAgICAgICAgOiBhd2FpdCB0aGlzLmdldENhY2hlZFRhYmxlKHRhYmxlT3JOYW1lKVxuICAgICAgICBjb25zdCB1bmlxdWVDb25zdHJhaW50ID0gSW5zdGFuY2VDaGVja2VyLmlzVGFibGVVbmlxdWUodW5pcXVlT3JOYW1lKVxuICAgICAgICAgICAgPyB1bmlxdWVPck5hbWVcbiAgICAgICAgICAgIDogdGFibGUudW5pcXVlcy5maW5kKCh1KSA9PiB1Lm5hbWUgPT09IHVuaXF1ZU9yTmFtZSlcbiAgICAgICAgaWYgKCF1bmlxdWVDb25zdHJhaW50KVxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcbiAgICAgICAgICAgICAgICBgU3VwcGxpZWQgdW5pcXVlIGNvbnN0cmFpbnQgd2FzIG5vdCBmb3VuZCBpbiB0YWJsZSAke3RhYmxlLm5hbWV9YCxcbiAgICAgICAgICAgIClcblxuICAgICAgICBhd2FpdCB0aGlzLmRyb3BVbmlxdWVDb25zdHJhaW50cyh0YWJsZSwgW3VuaXF1ZUNvbnN0cmFpbnRdKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gdW5pcXVlIGNvbnN0cmFpbnRzLlxuICAgICAqL1xuICAgIGFzeW5jIGRyb3BVbmlxdWVDb25zdHJhaW50cyhcbiAgICAgICAgdGFibGVPck5hbWU6IFRhYmxlIHwgc3RyaW5nLFxuICAgICAgICB1bmlxdWVDb25zdHJhaW50czogVGFibGVVbmlxdWVbXSxcbiAgICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgdGFibGUgPSBJbnN0YW5jZUNoZWNrZXIuaXNUYWJsZSh0YWJsZU9yTmFtZSlcbiAgICAgICAgICAgID8gdGFibGVPck5hbWVcbiAgICAgICAgICAgIDogYXdhaXQgdGhpcy5nZXRDYWNoZWRUYWJsZSh0YWJsZU9yTmFtZSlcblxuXG4gICAgICAgIGNvbnN0IGNoYW5nZWRUYWJsZSA9IHRhYmxlLmNsb25lKClcbiAgICAgICAgdW5pcXVlQ29uc3RyYWludHMuZm9yRWFjaCgodW5pcXVlQ29uc3RyYWludCkgPT5cbiAgICAgICAgICAgIGNoYW5nZWRUYWJsZS5yZW1vdmVVbmlxdWVDb25zdHJhaW50KHVuaXF1ZUNvbnN0cmFpbnQpLFxuICAgICAgICApXG5cbiAgICAgICAgYXdhaXQgdGhpcy5yZWNyZWF0ZVRhYmxlKGNoYW5nZWRUYWJsZSwgdGFibGUpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBuZXcgY2hlY2sgY29uc3RyYWludC5cbiAgICAgKi9cbiAgICBhc3luYyBjcmVhdGVDaGVja0NvbnN0cmFpbnQoXG4gICAgICAgIHRhYmxlT3JOYW1lOiBUYWJsZSB8IHN0cmluZyxcbiAgICAgICAgY2hlY2tDb25zdHJhaW50OiBUYWJsZUNoZWNrLFxuICAgICk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLmNyZWF0ZUNoZWNrQ29uc3RyYWludHModGFibGVPck5hbWUsIFtjaGVja0NvbnN0cmFpbnRdKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgbmV3IGNoZWNrIGNvbnN0cmFpbnRzLlxuICAgICAqL1xuICAgIGFzeW5jIGNyZWF0ZUNoZWNrQ29uc3RyYWludHMoXG4gICAgICAgIHRhYmxlT3JOYW1lOiBUYWJsZSB8IHN0cmluZyxcbiAgICAgICAgY2hlY2tDb25zdHJhaW50czogVGFibGVDaGVja1tdLFxuICAgICk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCB0YWJsZSA9IEluc3RhbmNlQ2hlY2tlci5pc1RhYmxlKHRhYmxlT3JOYW1lKVxuICAgICAgICAgICAgPyB0YWJsZU9yTmFtZVxuICAgICAgICAgICAgOiBhd2FpdCB0aGlzLmdldENhY2hlZFRhYmxlKHRhYmxlT3JOYW1lKVxuXG5cbiAgICAgICAgY29uc3QgY2hhbmdlZFRhYmxlID0gdGFibGUuY2xvbmUoKVxuICAgICAgICBjaGVja0NvbnN0cmFpbnRzLmZvckVhY2goKGNoZWNrQ29uc3RyYWludCkgPT5cbiAgICAgICAgICAgIGNoYW5nZWRUYWJsZS5hZGRDaGVja0NvbnN0cmFpbnQoY2hlY2tDb25zdHJhaW50KSxcbiAgICAgICAgKVxuICAgICAgICBhd2FpdCB0aGlzLnJlY3JlYXRlVGFibGUoY2hhbmdlZFRhYmxlLCB0YWJsZSlcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEcm9wcyBjaGVjayBjb25zdHJhaW50LlxuICAgICAqL1xuICAgIGFzeW5jIGRyb3BDaGVja0NvbnN0cmFpbnQoXG4gICAgICAgIHRhYmxlT3JOYW1lOiBUYWJsZSB8IHN0cmluZyxcbiAgICAgICAgY2hlY2tPck5hbWU6IFRhYmxlQ2hlY2sgfCBzdHJpbmcsXG4gICAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHRhYmxlID0gSW5zdGFuY2VDaGVja2VyLmlzVGFibGUodGFibGVPck5hbWUpXG4gICAgICAgICAgICA/IHRhYmxlT3JOYW1lXG4gICAgICAgICAgICA6IGF3YWl0IHRoaXMuZ2V0Q2FjaGVkVGFibGUodGFibGVPck5hbWUpXG4gICAgICAgIGNvbnN0IGNoZWNrQ29uc3RyYWludCA9IEluc3RhbmNlQ2hlY2tlci5pc1RhYmxlQ2hlY2soY2hlY2tPck5hbWUpXG4gICAgICAgICAgICA/IGNoZWNrT3JOYW1lXG4gICAgICAgICAgICA6IHRhYmxlLmNoZWNrcy5maW5kKChjKSA9PiBjLm5hbWUgPT09IGNoZWNrT3JOYW1lKVxuICAgICAgICBpZiAoIWNoZWNrQ29uc3RyYWludClcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXG4gICAgICAgICAgICAgICAgYFN1cHBsaWVkIGNoZWNrIGNvbnN0cmFpbnQgd2FzIG5vdCBmb3VuZCBpbiB0YWJsZSAke3RhYmxlLm5hbWV9YCxcbiAgICAgICAgICAgIClcblxuICAgICAgICBhd2FpdCB0aGlzLmRyb3BDaGVja0NvbnN0cmFpbnRzKHRhYmxlLCBbY2hlY2tDb25zdHJhaW50XSlcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEcm9wcyBjaGVjayBjb25zdHJhaW50cy5cbiAgICAgKi9cbiAgICBhc3luYyBkcm9wQ2hlY2tDb25zdHJhaW50cyhcbiAgICAgICAgdGFibGVPck5hbWU6IFRhYmxlIHwgc3RyaW5nLFxuICAgICAgICBjaGVja0NvbnN0cmFpbnRzOiBUYWJsZUNoZWNrW10sXG4gICAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHRhYmxlID0gSW5zdGFuY2VDaGVja2VyLmlzVGFibGUodGFibGVPck5hbWUpXG4gICAgICAgICAgICA/IHRhYmxlT3JOYW1lXG4gICAgICAgICAgICA6IGF3YWl0IHRoaXMuZ2V0Q2FjaGVkVGFibGUodGFibGVPck5hbWUpXG5cblxuICAgICAgICBjb25zdCBjaGFuZ2VkVGFibGUgPSB0YWJsZS5jbG9uZSgpXG4gICAgICAgIGNoZWNrQ29uc3RyYWludHMuZm9yRWFjaCgoY2hlY2tDb25zdHJhaW50KSA9PlxuICAgICAgICAgICAgY2hhbmdlZFRhYmxlLnJlbW92ZUNoZWNrQ29uc3RyYWludChjaGVja0NvbnN0cmFpbnQpLFxuICAgICAgICApXG5cbiAgICAgICAgYXdhaXQgdGhpcy5yZWNyZWF0ZVRhYmxlKGNoYW5nZWRUYWJsZSwgdGFibGUpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBleGNsdXNpb24gY29uc3RyYWludC5cbiAgICAgKi9cbiAgICBhc3luYyBjcmVhdGVFeGNsdXNpb25Db25zdHJhaW50KFxuICAgICAgICB0YWJsZU9yTmFtZTogVGFibGUgfCBzdHJpbmcsXG4gICAgICAgIGV4Y2x1c2lvbkNvbnN0cmFpbnQ6IFRhYmxlRXhjbHVzaW9uLFxuICAgICk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZU9STUVycm9yKGBTcWxpdGUgZG9lcyBub3Qgc3VwcG9ydCBleGNsdXNpb24gY29uc3RyYWludHMuYClcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGV4Y2x1c2lvbiBjb25zdHJhaW50cy5cbiAgICAgKi9cbiAgICBhc3luYyBjcmVhdGVFeGNsdXNpb25Db25zdHJhaW50cyhcbiAgICAgICAgdGFibGVPck5hbWU6IFRhYmxlIHwgc3RyaW5nLFxuICAgICAgICBleGNsdXNpb25Db25zdHJhaW50czogVGFibGVFeGNsdXNpb25bXSxcbiAgICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihgU3FsaXRlIGRvZXMgbm90IHN1cHBvcnQgZXhjbHVzaW9uIGNvbnN0cmFpbnRzLmApXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRHJvcHMgZXhjbHVzaW9uIGNvbnN0cmFpbnQuXG4gICAgICovXG4gICAgYXN5bmMgZHJvcEV4Y2x1c2lvbkNvbnN0cmFpbnQoXG4gICAgICAgIHRhYmxlT3JOYW1lOiBUYWJsZSB8IHN0cmluZyxcbiAgICAgICAgZXhjbHVzaW9uT3JOYW1lOiBUYWJsZUV4Y2x1c2lvbiB8IHN0cmluZyxcbiAgICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihgU3FsaXRlIGRvZXMgbm90IHN1cHBvcnQgZXhjbHVzaW9uIGNvbnN0cmFpbnRzLmApXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRHJvcHMgZXhjbHVzaW9uIGNvbnN0cmFpbnRzLlxuICAgICAqL1xuICAgIGFzeW5jIGRyb3BFeGNsdXNpb25Db25zdHJhaW50cyhcbiAgICAgICAgdGFibGVPck5hbWU6IFRhYmxlIHwgc3RyaW5nLFxuICAgICAgICBleGNsdXNpb25Db25zdHJhaW50czogVGFibGVFeGNsdXNpb25bXSxcbiAgICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihgU3FsaXRlIGRvZXMgbm90IHN1cHBvcnQgZXhjbHVzaW9uIGNvbnN0cmFpbnRzLmApXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBmb3JlaWduIGtleS5cbiAgICAgKi9cbiAgICBhc3luYyBjcmVhdGVGb3JlaWduS2V5KFxuICAgICAgICB0YWJsZU9yTmFtZTogVGFibGUgfCBzdHJpbmcsXG4gICAgICAgIGZvcmVpZ25LZXk6IFRhYmxlRm9yZWlnbktleSxcbiAgICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5jcmVhdGVGb3JlaWduS2V5cyh0YWJsZU9yTmFtZSwgW2ZvcmVpZ25LZXldKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgZm9yZWlnbiBrZXlzLlxuICAgICAqL1xuICAgIGFzeW5jIGNyZWF0ZUZvcmVpZ25LZXlzKFxuICAgICAgICB0YWJsZU9yTmFtZTogVGFibGUgfCBzdHJpbmcsXG4gICAgICAgIGZvcmVpZ25LZXlzOiBUYWJsZUZvcmVpZ25LZXlbXSxcbiAgICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgdGFibGUgPSBJbnN0YW5jZUNoZWNrZXIuaXNUYWJsZSh0YWJsZU9yTmFtZSlcbiAgICAgICAgICAgID8gdGFibGVPck5hbWVcbiAgICAgICAgICAgIDogYXdhaXQgdGhpcy5nZXRDYWNoZWRUYWJsZSh0YWJsZU9yTmFtZSlcblxuICAgICAgICBjb25zdCBjaGFuZ2VkVGFibGUgPSB0YWJsZS5jbG9uZSgpXG4gICAgICAgIGZvcmVpZ25LZXlzLmZvckVhY2goKGZvcmVpZ25LZXkpID0+XG4gICAgICAgICAgICBjaGFuZ2VkVGFibGUuYWRkRm9yZWlnbktleShmb3JlaWduS2V5KSxcbiAgICAgICAgKVxuXG4gICAgICAgIGF3YWl0IHRoaXMucmVjcmVhdGVUYWJsZShjaGFuZ2VkVGFibGUsIHRhYmxlKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERyb3BzIGEgZm9yZWlnbiBrZXkgZnJvbSB0aGUgdGFibGUuXG4gICAgICovXG4gICAgYXN5bmMgZHJvcEZvcmVpZ25LZXkoXG4gICAgICAgIHRhYmxlT3JOYW1lOiBUYWJsZSB8IHN0cmluZyxcbiAgICAgICAgZm9yZWlnbktleU9yTmFtZTogVGFibGVGb3JlaWduS2V5IHwgc3RyaW5nLFxuICAgICk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCB0YWJsZSA9IEluc3RhbmNlQ2hlY2tlci5pc1RhYmxlKHRhYmxlT3JOYW1lKVxuICAgICAgICAgICAgPyB0YWJsZU9yTmFtZVxuICAgICAgICAgICAgOiBhd2FpdCB0aGlzLmdldENhY2hlZFRhYmxlKHRhYmxlT3JOYW1lKVxuICAgICAgICBjb25zdCBmb3JlaWduS2V5ID0gSW5zdGFuY2VDaGVja2VyLmlzVGFibGVGb3JlaWduS2V5KGZvcmVpZ25LZXlPck5hbWUpXG4gICAgICAgICAgICA/IGZvcmVpZ25LZXlPck5hbWVcbiAgICAgICAgICAgIDogdGFibGUuZm9yZWlnbktleXMuZmluZCgoZmspID0+IGZrLm5hbWUgPT09IGZvcmVpZ25LZXlPck5hbWUpXG4gICAgICAgIGlmICghZm9yZWlnbktleSlcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXG4gICAgICAgICAgICAgICAgYFN1cHBsaWVkIGZvcmVpZ24ga2V5IHdhcyBub3QgZm91bmQgaW4gdGFibGUgJHt0YWJsZS5uYW1lfWAsXG4gICAgICAgICAgICApXG5cbiAgICAgICAgYXdhaXQgdGhpcy5kcm9wRm9yZWlnbktleXModGFibGVPck5hbWUsIFtmb3JlaWduS2V5XSlcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEcm9wcyBhIGZvcmVpZ24ga2V5cyBmcm9tIHRoZSB0YWJsZS5cbiAgICAgKi9cbiAgICBhc3luYyBkcm9wRm9yZWlnbktleXMoXG4gICAgICAgIHRhYmxlT3JOYW1lOiBUYWJsZSB8IHN0cmluZyxcbiAgICAgICAgZm9yZWlnbktleXM6IFRhYmxlRm9yZWlnbktleVtdLFxuICAgICk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCB0YWJsZSA9IEluc3RhbmNlQ2hlY2tlci5pc1RhYmxlKHRhYmxlT3JOYW1lKVxuICAgICAgICAgICAgPyB0YWJsZU9yTmFtZVxuICAgICAgICAgICAgOiBhd2FpdCB0aGlzLmdldENhY2hlZFRhYmxlKHRhYmxlT3JOYW1lKVxuXG5cbiAgICAgICAgY29uc3QgY2hhbmdlZFRhYmxlID0gdGFibGUuY2xvbmUoKVxuICAgICAgICBmb3JlaWduS2V5cy5mb3JFYWNoKChmb3JlaWduS2V5KSA9PlxuICAgICAgICAgICAgY2hhbmdlZFRhYmxlLnJlbW92ZUZvcmVpZ25LZXkoZm9yZWlnbktleSksXG4gICAgICAgIClcblxuICAgICAgICBhd2FpdCB0aGlzLnJlY3JlYXRlVGFibGUoY2hhbmdlZFRhYmxlLCB0YWJsZSlcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGluZGV4LlxuICAgICAqL1xuICAgIGFzeW5jIGNyZWF0ZUluZGV4KFxuICAgICAgICB0YWJsZU9yTmFtZTogVGFibGUgfCBzdHJpbmcsXG4gICAgICAgIGluZGV4OiBUYWJsZUluZGV4LFxuICAgICk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCB0YWJsZSA9IEluc3RhbmNlQ2hlY2tlci5pc1RhYmxlKHRhYmxlT3JOYW1lKVxuICAgICAgICAgICAgPyB0YWJsZU9yTmFtZVxuICAgICAgICAgICAgOiBhd2FpdCB0aGlzLmdldENhY2hlZFRhYmxlKHRhYmxlT3JOYW1lKVxuXG5cbiAgICAgICAgaWYgKCFpbmRleC5uYW1lKSBpbmRleC5uYW1lID0gdGhpcy5nZW5lcmF0ZUluZGV4TmFtZSh0YWJsZSwgaW5kZXgpXG5cbiAgICAgICAgY29uc3QgdXAgPSB0aGlzLmNyZWF0ZUluZGV4U3FsKHRhYmxlLCBpbmRleClcbiAgICAgICAgY29uc3QgZG93biA9IHRoaXMuZHJvcEluZGV4U3FsKGluZGV4KVxuICAgICAgICBhd2FpdCB0aGlzLmV4ZWN1dGVRdWVyaWVzKHVwLCBkb3duKVxuICAgICAgICB0YWJsZS5hZGRJbmRleChpbmRleClcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGluZGljZXNcbiAgICAgKi9cbiAgICBhc3luYyBjcmVhdGVJbmRpY2VzKFxuICAgICAgICB0YWJsZU9yTmFtZTogVGFibGUgfCBzdHJpbmcsXG4gICAgICAgIGluZGljZXM6IFRhYmxlSW5kZXhbXSxcbiAgICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgcHJvbWlzZXMgPSBpbmRpY2VzLm1hcCgoaW5kZXgpID0+XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUluZGV4KHRhYmxlT3JOYW1lLCBpbmRleCksXG4gICAgICAgIClcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRHJvcHMgYW4gaW5kZXggZnJvbSB0aGUgdGFibGUuXG4gICAgICovXG4gICAgYXN5bmMgZHJvcEluZGV4KFxuICAgICAgICB0YWJsZU9yTmFtZTogVGFibGUgfCBzdHJpbmcsXG4gICAgICAgIGluZGV4T3JOYW1lOiBUYWJsZUluZGV4IHwgc3RyaW5nLFxuICAgICk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCB0YWJsZSA9IEluc3RhbmNlQ2hlY2tlci5pc1RhYmxlKHRhYmxlT3JOYW1lKVxuICAgICAgICAgICAgPyB0YWJsZU9yTmFtZVxuICAgICAgICAgICAgOiBhd2FpdCB0aGlzLmdldENhY2hlZFRhYmxlKHRhYmxlT3JOYW1lKVxuICAgICAgICBjb25zdCBpbmRleCA9IEluc3RhbmNlQ2hlY2tlci5pc1RhYmxlSW5kZXgoaW5kZXhPck5hbWUpXG4gICAgICAgICAgICA/IGluZGV4T3JOYW1lXG4gICAgICAgICAgICA6IHRhYmxlLmluZGljZXMuZmluZCgoaSkgPT4gaS5uYW1lID09PSBpbmRleE9yTmFtZSlcbiAgICAgICAgaWYgKCFpbmRleClcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlT1JNRXJyb3IoXG4gICAgICAgICAgICAgICAgYFN1cHBsaWVkIGluZGV4ICR7aW5kZXhPck5hbWV9IHdhcyBub3QgZm91bmQgaW4gdGFibGUgJHt0YWJsZS5uYW1lfWAsXG4gICAgICAgICAgICApXG5cblxuICAgICAgICBpZiAoIWluZGV4Lm5hbWUpIGluZGV4Lm5hbWUgPSB0aGlzLmdlbmVyYXRlSW5kZXhOYW1lKHRhYmxlLCBpbmRleClcblxuICAgICAgICBjb25zdCB1cCA9IHRoaXMuZHJvcEluZGV4U3FsKGluZGV4KVxuICAgICAgICBjb25zdCBkb3duID0gdGhpcy5jcmVhdGVJbmRleFNxbCh0YWJsZSwgaW5kZXgpXG4gICAgICAgIGF3YWl0IHRoaXMuZXhlY3V0ZVF1ZXJpZXModXAsIGRvd24pXG4gICAgICAgIHRhYmxlLnJlbW92ZUluZGV4KGluZGV4KVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERyb3BzIGFuIGluZGljZXMgZnJvbSB0aGUgdGFibGUuXG4gICAgICovXG4gICAgYXN5bmMgZHJvcEluZGljZXMoXG4gICAgICAgIHRhYmxlT3JOYW1lOiBUYWJsZSB8IHN0cmluZyxcbiAgICAgICAgaW5kaWNlczogVGFibGVJbmRleFtdLFxuICAgICk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCBwcm9taXNlcyA9IGluZGljZXMubWFwKChpbmRleCkgPT5cbiAgICAgICAgICAgIHRoaXMuZHJvcEluZGV4KHRhYmxlT3JOYW1lLCBpbmRleCksXG4gICAgICAgIClcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xlYXJzIGFsbCB0YWJsZSBjb250ZW50cy5cbiAgICAgKiBOb3RlOiB0aGlzIG9wZXJhdGlvbiB1c2VzIFNRTCdzIFRSVU5DQVRFIHF1ZXJ5IHdoaWNoIGNhbm5vdCBiZSByZXZlcnRlZCBpbiB0cmFuc2FjdGlvbnMuXG4gICAgICovXG4gICAgYXN5bmMgY2xlYXJUYWJsZSh0YWJsZU5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBhd2FpdCB0aGlzLnF1ZXJ5KGBERUxFVEUgRlJPTSAke3RoaXMuZXNjYXBlUGF0aCh0YWJsZU5hbWUpfWApXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbGwgdGFibGVzIGZyb20gdGhlIGN1cnJlbnRseSBjb25uZWN0ZWQgZGF0YWJhc2UuXG4gICAgICovXG4gICAgYXN5bmMgY2xlYXJEYXRhYmFzZShkYXRhYmFzZT86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgZGJQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWRcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgZGF0YWJhc2UgJiZcbiAgICAgICAgICAgIHRoaXMuZHJpdmVyLmdldEF0dGFjaGVkRGF0YWJhc2VIYW5kbGVCeVJlbGF0aXZlUGF0aChkYXRhYmFzZSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBkYlBhdGggPVxuICAgICAgICAgICAgICAgIHRoaXMuZHJpdmVyLmdldEF0dGFjaGVkRGF0YWJhc2VIYW5kbGVCeVJlbGF0aXZlUGF0aChkYXRhYmFzZSlcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHRoaXMucXVlcnkoYFBSQUdNQSBmb3JlaWduX2tleXMgPSBPRkZgKVxuXG4gICAgICAgIGNvbnN0IGlzQW5vdGhlclRyYW5zYWN0aW9uQWN0aXZlID0gdGhpcy5pc1RyYW5zYWN0aW9uQWN0aXZlXG4gICAgICAgIGlmICghaXNBbm90aGVyVHJhbnNhY3Rpb25BY3RpdmUpIGF3YWl0IHRoaXMuc3RhcnRUcmFuc2FjdGlvbigpXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RWaWV3RHJvcHNRdWVyeSA9IGRiUGF0aFxuICAgICAgICAgICAgICAgID8gYFNFTEVDVCAnRFJPUCBWSUVXIFwiJHtkYlBhdGh9XCIuXCInIHx8IG5hbWUgfHwgJ1wiOycgYXMgcXVlcnkgRlJPTSBcIiR7ZGJQYXRofVwiLlwic3FsaXRlX21hc3RlclwiIFdIRVJFIFwidHlwZVwiID0gJ3ZpZXcnYFxuICAgICAgICAgICAgICAgIDogYFNFTEVDVCAnRFJPUCBWSUVXIFwiJyB8fCBuYW1lIHx8ICdcIjsnIGFzIHF1ZXJ5IEZST00gXCJzcWxpdGVfbWFzdGVyXCIgV0hFUkUgXCJ0eXBlXCIgPSAndmlldydgXG4gICAgICAgICAgICBjb25zdCBkcm9wVmlld1F1ZXJpZXM6IE9iamVjdExpdGVyYWxbXSA9IGF3YWl0IHRoaXMucXVlcnkoXG4gICAgICAgICAgICAgICAgc2VsZWN0Vmlld0Ryb3BzUXVlcnksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICAgICAgICBkcm9wVmlld1F1ZXJpZXMubWFwKChxKSA9PiB0aGlzLnF1ZXJ5KHFbXCJxdWVyeVwiXSkpLFxuICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICBjb25zdCBzZWxlY3RUYWJsZURyb3BzUXVlcnkgPSBkYlBhdGhcbiAgICAgICAgICAgICAgICA/IGBTRUxFQ1QgJ0RST1AgVEFCTEUgXCIke2RiUGF0aH1cIi5cIicgfHwgbmFtZSB8fCAnXCI7JyBhcyBxdWVyeSBGUk9NIFwiJHtkYlBhdGh9XCIuXCJzcWxpdGVfbWFzdGVyXCIgV0hFUkUgXCJ0eXBlXCIgPSAndGFibGUnIEFORCBcIm5hbWVcIiAhPSAnc3FsaXRlX3NlcXVlbmNlJ2BcbiAgICAgICAgICAgICAgICA6IGBTRUxFQ1QgJ0RST1AgVEFCTEUgXCInIHx8IG5hbWUgfHwgJ1wiOycgYXMgcXVlcnkgRlJPTSBcInNxbGl0ZV9tYXN0ZXJcIiBXSEVSRSBcInR5cGVcIiA9ICd0YWJsZScgQU5EIFwibmFtZVwiICE9ICdzcWxpdGVfc2VxdWVuY2UnYFxuICAgICAgICAgICAgY29uc3QgZHJvcFRhYmxlUXVlcmllczogT2JqZWN0TGl0ZXJhbFtdID0gYXdhaXQgdGhpcy5xdWVyeShcbiAgICAgICAgICAgICAgICBzZWxlY3RUYWJsZURyb3BzUXVlcnksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICAgICAgICBkcm9wVGFibGVRdWVyaWVzLm1hcCgocSkgPT4gdGhpcy5xdWVyeShxW1wicXVlcnlcIl0pKSxcbiAgICAgICAgICAgIClcblxuICAgICAgICAgICAgaWYgKCFpc0Fub3RoZXJUcmFuc2FjdGlvbkFjdGl2ZSkgYXdhaXQgdGhpcy5jb21taXRUcmFuc2FjdGlvbigpXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB0cnkge1xuXG4gICAgICAgICAgICAgICAgaWYgKCFpc0Fub3RoZXJUcmFuc2FjdGlvbkFjdGl2ZSlcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yb2xsYmFja1RyYW5zYWN0aW9uKClcbiAgICAgICAgICAgIH0gY2F0Y2ggKHJvbGxiYWNrRXJyb3IpIHt9XG4gICAgICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5xdWVyeShgUFJBR01BIGZvcmVpZ25fa2V5cyA9IE9OYClcbiAgICAgICAgfVxuICAgIH1cblxuXG5cblxuXG4gICAgcHJvdGVjdGVkIGFzeW5jIGxvYWRWaWV3cyh2aWV3TmFtZXM/OiBzdHJpbmdbXSk6IFByb21pc2U8Vmlld1tdPiB7XG4gICAgICAgIGNvbnN0IGhhc1RhYmxlID0gYXdhaXQgdGhpcy5oYXNUYWJsZSh0aGlzLmdldFR5cGVvcm1NZXRhZGF0YVRhYmxlTmFtZSgpKVxuICAgICAgICBpZiAoIWhhc1RhYmxlKSB7XG4gICAgICAgICAgICByZXR1cm4gW11cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdmlld05hbWVzKSB7XG4gICAgICAgICAgICB2aWV3TmFtZXMgPSBbXVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgdmlld05hbWVzU3RyaW5nID0gdmlld05hbWVzXG4gICAgICAgICAgICAubWFwKChuYW1lKSA9PiBcIidcIiArIG5hbWUgKyBcIidcIilcbiAgICAgICAgICAgIC5qb2luKFwiLCBcIilcbiAgICAgICAgbGV0IHF1ZXJ5ID0gYFNFTEVDVCBcInRcIi4qIEZST00gXCIke3RoaXMuZ2V0VHlwZW9ybU1ldGFkYXRhVGFibGVOYW1lKCl9XCIgXCJ0XCIgSU5ORVIgSk9JTiBcInNxbGl0ZV9tYXN0ZXJcIiBzIE9OIFwic1wiLlwibmFtZVwiID0gXCJ0XCIuXCJuYW1lXCIgQU5EIFwic1wiLlwidHlwZVwiID0gJ3ZpZXcnIFdIRVJFIFwidFwiLlwidHlwZVwiID0gJyR7XG4gICAgICAgICAgICBNZXRhZGF0YVRhYmxlVHlwZS5WSUVXXG4gICAgICAgIH0nYFxuICAgICAgICBpZiAodmlld05hbWVzU3RyaW5nLmxlbmd0aCA+IDApXG4gICAgICAgICAgICBxdWVyeSArPSBgIEFORCBcInRcIi5cIm5hbWVcIiBJTiAoJHt2aWV3TmFtZXNTdHJpbmd9KWBcbiAgICAgICAgY29uc3QgZGJWaWV3cyA9IGF3YWl0IHRoaXMucXVlcnkocXVlcnkpXG4gICAgICAgIHJldHVybiBkYlZpZXdzLm1hcCgoZGJWaWV3OiBhbnkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZpZXcgPSBuZXcgVmlldygpXG4gICAgICAgICAgICB2aWV3Lm5hbWUgPSBkYlZpZXdbXCJuYW1lXCJdXG4gICAgICAgICAgICB2aWV3LmV4cHJlc3Npb24gPSBkYlZpZXdbXCJ2YWx1ZVwiXVxuICAgICAgICAgICAgcmV0dXJuIHZpZXdcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYXN5bmMgbG9hZFRhYmxlUmVjb3JkcyhcbiAgICAgICAgdGFibGVQYXRoOiBzdHJpbmcsXG4gICAgICAgIHRhYmxlT3JJbmRleDogXCJ0YWJsZVwiIHwgXCJpbmRleFwiLFxuICAgICkge1xuICAgICAgICBsZXQgZGF0YWJhc2U6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZFxuICAgICAgICBjb25zdCBbc2NoZW1hLCB0YWJsZU5hbWVdID0gdGhpcy5zcGxpdFRhYmxlUGF0aCh0YWJsZVBhdGgpXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHNjaGVtYSAmJlxuICAgICAgICAgICAgdGhpcy5kcml2ZXIuZ2V0QXR0YWNoZWREYXRhYmFzZVBhdGhSZWxhdGl2ZUJ5SGFuZGxlKHNjaGVtYSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBkYXRhYmFzZSA9XG4gICAgICAgICAgICAgICAgdGhpcy5kcml2ZXIuZ2V0QXR0YWNoZWREYXRhYmFzZVBhdGhSZWxhdGl2ZUJ5SGFuZGxlKHNjaGVtYSlcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLnF1ZXJ5KFxuICAgICAgICAgICAgYFNFTEVDVCAke2RhdGFiYXNlID8gYCcke2RhdGFiYXNlfSdgIDogbnVsbH0gYXMgZGF0YWJhc2UsICR7XG4gICAgICAgICAgICAgICAgc2NoZW1hID8gYCcke3NjaGVtYX0nYCA6IG51bGxcbiAgICAgICAgICAgIH0gYXMgc2NoZW1hLCAqIEZST00gJHtcbiAgICAgICAgICAgICAgICBzY2hlbWEgPyBgXCIke3NjaGVtYX1cIi5gIDogXCJcIlxuICAgICAgICAgICAgfSR7dGhpcy5lc2NhcGVQYXRoKFxuICAgICAgICAgICAgICAgIGBzcWxpdGVfbWFzdGVyYCxcbiAgICAgICAgICAgICl9IFdIRVJFIFwidHlwZVwiID0gJyR7dGFibGVPckluZGV4fScgQU5EIFwiJHtcbiAgICAgICAgICAgICAgICB0YWJsZU9ySW5kZXggPT09IFwidGFibGVcIiA/IFwibmFtZVwiIDogXCJ0YmxfbmFtZVwiXG4gICAgICAgICAgICB9XCIgSU4gKCcke3RhYmxlTmFtZX0nKWAsXG4gICAgICAgIClcbiAgICAgICAgcmV0dXJuIHJlc1xuICAgIH1cbiAgICBwcm90ZWN0ZWQgYXN5bmMgbG9hZFByYWdtYVJlY29yZHModGFibGVQYXRoOiBzdHJpbmcsIHByYWdtYTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IFssIHRhYmxlTmFtZV0gPSB0aGlzLnNwbGl0VGFibGVQYXRoKHRhYmxlUGF0aClcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5xdWVyeShgUFJBR01BICR7cHJhZ21hfShcIiR7dGFibGVOYW1lfVwiKWApXG4gICAgICAgIHJldHVybiByZXNcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkcyBhbGwgdGFibGVzICh3aXRoIGdpdmVuIG5hbWVzKSBmcm9tIHRoZSBkYXRhYmFzZSBhbmQgY3JlYXRlcyBhIFRhYmxlIGZyb20gdGhlbS5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgYXN5bmMgbG9hZFRhYmxlcyh0YWJsZU5hbWVzPzogc3RyaW5nW10pOiBQcm9taXNlPFRhYmxlW10+IHtcblxuICAgICAgICBpZiAodGFibGVOYW1lcyAmJiB0YWJsZU5hbWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFtdXG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZGJUYWJsZXM6IHsgZGF0YWJhc2U/OiBzdHJpbmc7IG5hbWU6IHN0cmluZzsgc3FsOiBzdHJpbmcgfVtdID0gW11cbiAgICAgICAgbGV0IGRiSW5kaWNlc0RlZjogT2JqZWN0TGl0ZXJhbFtdXG5cbiAgICAgICAgaWYgKCF0YWJsZU5hbWVzKSB7XG4gICAgICAgICAgICBjb25zdCB0YWJsZXNTcWwgPSBgU0VMRUNUICogRlJPTSBcInNxbGl0ZV9tYXN0ZXJcIiBXSEVSRSBcInR5cGVcIiA9ICd0YWJsZSdgXG4gICAgICAgICAgICBkYlRhYmxlcy5wdXNoKC4uLihhd2FpdCB0aGlzLnF1ZXJ5KHRhYmxlc1NxbCkpKVxuXG4gICAgICAgICAgICBjb25zdCB0YWJsZU5hbWVzU3RyaW5nID0gZGJUYWJsZXNcbiAgICAgICAgICAgICAgICAubWFwKCh7IG5hbWUgfSkgPT4gYCcke25hbWV9J2ApXG4gICAgICAgICAgICAgICAgLmpvaW4oXCIsIFwiKVxuICAgICAgICAgICAgZGJJbmRpY2VzRGVmID0gYXdhaXQgdGhpcy5xdWVyeShcbiAgICAgICAgICAgICAgICBgU0VMRUNUICogRlJPTSBcInNxbGl0ZV9tYXN0ZXJcIiBXSEVSRSBcInR5cGVcIiA9ICdpbmRleCcgQU5EIFwidGJsX25hbWVcIiBJTiAoJHt0YWJsZU5hbWVzU3RyaW5nfSlgLFxuICAgICAgICAgICAgKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGJUYWJsZXMgPSAoXG4gICAgICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICAgICAgICAgIHRhYmxlTmFtZXMubWFwKCh0YWJsZU5hbWUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRUYWJsZVJlY29yZHModGFibGVOYW1lLCBcInRhYmxlXCIpLFxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAucmVkdWNlKChhY2MsIHJlcykgPT4gWy4uLmFjYywgLi4ucmVzXSwgW10pXG4gICAgICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgICAgICAgZGJJbmRpY2VzRGVmID0gKFxuICAgICAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgICAgICAgICAgICAodGFibGVOYW1lcyA/PyBbXSkubWFwKCh0YWJsZU5hbWUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRUYWJsZVJlY29yZHModGFibGVOYW1lLCBcImluZGV4XCIpLFxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAucmVkdWNlKChhY2MsIHJlcykgPT4gWy4uLmFjYywgLi4ucmVzXSwgW10pXG4gICAgICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgICB9XG5cblxuICAgICAgICBpZiAoZGJUYWJsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gW11cbiAgICAgICAgfVxuXG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKFxuICAgICAgICAgICAgZGJUYWJsZXMubWFwKGFzeW5jIChkYlRhYmxlKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGFibGVQYXRoID1cbiAgICAgICAgICAgICAgICAgICAgZGJUYWJsZVtcImRhdGFiYXNlXCJdICYmXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZHJpdmVyLmdldEF0dGFjaGVkRGF0YWJhc2VIYW5kbGVCeVJlbGF0aXZlUGF0aChcbiAgICAgICAgICAgICAgICAgICAgICAgIGRiVGFibGVbXCJkYXRhYmFzZVwiXSxcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBgJHt0aGlzLmRyaXZlci5nZXRBdHRhY2hlZERhdGFiYXNlSGFuZGxlQnlSZWxhdGl2ZVBhdGgoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYlRhYmxlW1wiZGF0YWJhc2VcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICl9LiR7ZGJUYWJsZVtcIm5hbWVcIl19YFxuICAgICAgICAgICAgICAgICAgICAgICAgOiBkYlRhYmxlW1wibmFtZVwiXVxuXG4gICAgICAgICAgICAgICAgY29uc3Qgc3FsID0gZGJUYWJsZVtcInNxbFwiXVxuXG4gICAgICAgICAgICAgICAgY29uc3Qgd2l0aG91dFJvd2lkID0gc3FsLmluY2x1ZGVzKFwiV0lUSE9VVCBST1dJRFwiKVxuICAgICAgICAgICAgICAgIGNvbnN0IHRhYmxlID0gbmV3IFRhYmxlKHsgbmFtZTogdGFibGVQYXRoLCB3aXRob3V0Um93aWQgfSlcblxuXG4gICAgICAgICAgICAgICAgY29uc3QgW2RiQ29sdW1ucywgZGJJbmRpY2VzLCBkYkZvcmVpZ25LZXlzXTogT2JqZWN0TGl0ZXJhbFtdW10gPVxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRQcmFnbWFSZWNvcmRzKHRhYmxlUGF0aCwgYHRhYmxlX3hpbmZvYCksXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRQcmFnbWFSZWNvcmRzKHRhYmxlUGF0aCwgYGluZGV4X2xpc3RgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZFByYWdtYVJlY29yZHModGFibGVQYXRoLCBgZm9yZWlnbl9rZXlfbGlzdGApLFxuICAgICAgICAgICAgICAgICAgICBdKVxuXG5cbiAgICAgICAgICAgICAgICBsZXQgYXV0b0luY3JlbWVudENvbHVtbk5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIGNvbnN0IHRhYmxlU3FsOiBzdHJpbmcgPSBkYlRhYmxlW1wic3FsXCJdXG4gICAgICAgICAgICAgICAgbGV0IGF1dG9JbmNyZW1lbnRJbmRleCA9IHRhYmxlU3FsXG4gICAgICAgICAgICAgICAgICAgIC50b1VwcGVyQ2FzZSgpXG4gICAgICAgICAgICAgICAgICAgIC5pbmRleE9mKFwiQVVUT0lOQ1JFTUVOVFwiKVxuICAgICAgICAgICAgICAgIGlmIChhdXRvSW5jcmVtZW50SW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGF1dG9JbmNyZW1lbnRDb2x1bW5OYW1lID0gdGFibGVTcWwuc3Vic3RyKFxuICAgICAgICAgICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9JbmNyZW1lbnRJbmRleCxcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21tYSA9IGF1dG9JbmNyZW1lbnRDb2x1bW5OYW1lLmxhc3RJbmRleE9mKFwiLFwiKVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBicmFja2V0ID0gYXV0b0luY3JlbWVudENvbHVtbk5hbWUubGFzdEluZGV4T2YoXCIoXCIpXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb21tYSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9JbmNyZW1lbnRDb2x1bW5OYW1lID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvSW5jcmVtZW50Q29sdW1uTmFtZS5zdWJzdHIoY29tbWEpXG4gICAgICAgICAgICAgICAgICAgICAgICBhdXRvSW5jcmVtZW50Q29sdW1uTmFtZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b0luY3JlbWVudENvbHVtbk5hbWUuc3Vic3RyKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvSW5jcmVtZW50Q29sdW1uTmFtZS5sYXN0SW5kZXhPZignXCInKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICBhdXRvSW5jcmVtZW50Q29sdW1uTmFtZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b0luY3JlbWVudENvbHVtbk5hbWUuc3Vic3RyKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvSW5jcmVtZW50Q29sdW1uTmFtZS5pbmRleE9mKCdcIicpICsgMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYnJhY2tldCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9JbmNyZW1lbnRDb2x1bW5OYW1lID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvSW5jcmVtZW50Q29sdW1uTmFtZS5zdWJzdHIoYnJhY2tldClcbiAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9JbmNyZW1lbnRDb2x1bW5OYW1lID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvSW5jcmVtZW50Q29sdW1uTmFtZS5zdWJzdHIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9JbmNyZW1lbnRDb2x1bW5OYW1lLmxhc3RJbmRleE9mKCdcIicpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9JbmNyZW1lbnRDb2x1bW5OYW1lID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvSW5jcmVtZW50Q29sdW1uTmFtZS5zdWJzdHIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9JbmNyZW1lbnRDb2x1bW5OYW1lLmluZGV4T2YoJ1wiJykgKyAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICAgICAgdGFibGUuY29sdW1ucyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgICAgICAgICAgICBkYkNvbHVtbnMubWFwKGFzeW5jIChkYkNvbHVtbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFibGVDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4oKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVDb2x1bW4ubmFtZSA9IGRiQ29sdW1uW1wibmFtZVwiXVxuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVDb2x1bW4udHlwZSA9IGRiQ29sdW1uW1widHlwZVwiXS50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZUNvbHVtbi5kZWZhdWx0ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYkNvbHVtbltcImRmbHRfdmFsdWVcIl0gIT09IG51bGwgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYkNvbHVtbltcImRmbHRfdmFsdWVcIl0gIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGRiQ29sdW1uW1wiZGZsdF92YWx1ZVwiXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVDb2x1bW4uaXNOdWxsYWJsZSA9IGRiQ29sdW1uW1wibm90bnVsbFwiXSA9PT0gMFxuXG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZUNvbHVtbi5pc1ByaW1hcnkgPSBkYkNvbHVtbltcInBrXCJdID4gMFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVDb2x1bW4uY29tbWVudCA9IFwiXCIgLy8gU1FMaXRlIGRvZXMgbm90IHN1cHBvcnQgY29sdW1uIGNvbW1lbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZUNvbHVtbi5pc0dlbmVyYXRlZCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b0luY3JlbWVudENvbHVtbk5hbWUgPT09IGRiQ29sdW1uW1wibmFtZVwiXVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhYmxlQ29sdW1uLmlzR2VuZXJhdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVDb2x1bW4uZ2VuZXJhdGlvblN0cmF0ZWd5ID0gXCJpbmNyZW1lbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJDb2x1bW5bXCJoaWRkZW5cIl0gPT09IDIgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYkNvbHVtbltcImhpZGRlblwiXSA9PT0gM1xuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVDb2x1bW4uZ2VuZXJhdGVkVHlwZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiQ29sdW1uW1wiaGlkZGVuXCJdID09PSAyID8gXCJWSVJUVUFMXCIgOiBcIlNUT1JFRFwiXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhc0V4cHJlc3Npb25RdWVyeSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2VsZWN0VHlwZW9ybU1ldGFkYXRhU3FsKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlOiB0YWJsZS5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogTWV0YWRhdGFUYWJsZVR5cGUuR0VORVJBVEVEX0NPTFVNTixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHRhYmxlQ29sdW1uLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgdGhpcy5xdWVyeShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNFeHByZXNzaW9uUXVlcnkucXVlcnksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzRXhwcmVzc2lvblF1ZXJ5LnBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHRzWzBdICYmIHJlc3VsdHNbMF0udmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVDb2x1bW4uYXNFeHByZXNzaW9uID0gcmVzdWx0c1swXS52YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlQ29sdW1uLmFzRXhwcmVzc2lvbiA9IFwiXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YWJsZUNvbHVtbi50eXBlID09PSBcInZhcmNoYXJcIikge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW51bU1hdGNoID0gc3FsLm1hdGNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUmVnRXhwKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1wiKCcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlQ29sdW1uLm5hbWUgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiKVxcXCIgdmFyY2hhciBDSEVDS1xcXFxzKlxcXFwoXFxcXHMqXFxcIlxcXFwxXFxcIlxcXFxzK0lOXFxcXHMqXFxcXCgoJ1teJ10rJyg/OlxcXFxzKixcXFxccyonW14nXSsnKSspXFxcXHMqXFxcXClcXFxccypcXFxcKVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW51bU1hdGNoKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVDb2x1bW4uZW51bSA9IGVudW1NYXRjaFsyXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN1YnN0cigxLCBlbnVtTWF0Y2hbMl0ubGVuZ3RoIC0gMilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zcGxpdChcIicsJ1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcG9zID0gdGFibGVDb2x1bW4udHlwZS5pbmRleE9mKFwiKFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvcyAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmdWxsVHlwZSA9IHRhYmxlQ29sdW1uLnR5cGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGF0YVR5cGUgPSBmdWxsVHlwZS5zdWJzdHIoMCwgcG9zKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgISF0aGlzLmRyaXZlci53aXRoTGVuZ3RoQ29sdW1uVHlwZXMuZmluZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb2wpID0+IGNvbCA9PT0gZGF0YVR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxlbiA9IHBhcnNlSW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbFR5cGUuc3Vic3RyaW5nKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcyArIDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbFR5cGUubGVuZ3RoIC0gMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVDb2x1bW4ubGVuZ3RoID0gbGVuLnRvU3RyaW5nKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlQ29sdW1uLnR5cGUgPSBkYXRhVHlwZSAvLyByZW1vdmUgdGhlIGxlbmd0aCBwYXJ0IGZyb20gdGhlIGRhdGF0eXBlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhIXRoaXMuZHJpdmVyLndpdGhQcmVjaXNpb25Db2x1bW5UeXBlcy5maW5kKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbCkgPT4gY29sID09PSBkYXRhVHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZSA9IG5ldyBSZWdFeHAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgXiR7ZGF0YVR5cGV9XFxcXCgoXFxcXGQrKSw/XFxcXHM/KFxcXFxkKyk/XFxcXClgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoZXMgPSBmdWxsVHlwZS5tYXRjaChyZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoZXMgJiYgbWF0Y2hlc1sxXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVDb2x1bW4ucHJlY2lzaW9uID0gK21hdGNoZXNbMV1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhIXRoaXMuZHJpdmVyLndpdGhTY2FsZUNvbHVtblR5cGVzLmZpbmQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbCkgPT4gY29sID09PSBkYXRhVHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2hlcyAmJiBtYXRjaGVzWzJdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVDb2x1bW4uc2NhbGUgPSArbWF0Y2hlc1syXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlQ29sdW1uLnR5cGUgPSBkYXRhVHlwZSAvLyByZW1vdmUgdGhlIHByZWNpc2lvbi9zY2FsZSBwYXJ0IGZyb20gdGhlIGRhdGF0eXBlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFibGVDb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgKVxuXG5cbiAgICAgICAgICAgICAgICBsZXQgZmtSZXN1bHRcbiAgICAgICAgICAgICAgICBjb25zdCBma01hcHBpbmdzOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IHN0cmluZ1xuICAgICAgICAgICAgICAgICAgICBjb2x1bW5zOiBzdHJpbmdbXVxuICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2VkVGFibGVOYW1lOiBzdHJpbmdcbiAgICAgICAgICAgICAgICB9W10gPSBbXVxuICAgICAgICAgICAgICAgIGNvbnN0IGZrUmVnZXggPVxuICAgICAgICAgICAgICAgICAgICAvQ09OU1RSQUlOVCBcIihbXlwiXSopXCIgRk9SRUlHTiBLRVkgP1xcKCguKj8pXFwpIFJFRkVSRU5DRVMgXCIoW15cIl0qKVwiL2dcbiAgICAgICAgICAgICAgICB3aGlsZSAoKGZrUmVzdWx0ID0gZmtSZWdleC5leGVjKHNxbCkpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGZrTWFwcGluZ3MucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBma1Jlc3VsdFsxXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbnM6IGZrUmVzdWx0WzJdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN1YnN0cigxLCBma1Jlc3VsdFsyXS5sZW5ndGggLSAyKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zcGxpdChgXCIsIFwiYCksXG4gICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2VkVGFibGVOYW1lOiBma1Jlc3VsdFszXSxcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgICAgIGNvbnN0IHRhYmxlRm9yZWlnbktleUNvbnN0cmFpbnRzID0gT3JtVXRpbHMudW5pcShcbiAgICAgICAgICAgICAgICAgICAgZGJGb3JlaWduS2V5cyxcbiAgICAgICAgICAgICAgICAgICAgKGRiRm9yZWlnbktleSkgPT4gZGJGb3JlaWduS2V5W1wiaWRcIl0sXG4gICAgICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICAgICAgdGFibGUuZm9yZWlnbktleXMgPSB0YWJsZUZvcmVpZ25LZXlDb25zdHJhaW50cy5tYXAoXG4gICAgICAgICAgICAgICAgICAgIChmb3JlaWduS2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvd25Gb3JlaWduS2V5cyA9IGRiRm9yZWlnbktleXMuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkYkZvcmVpZ25LZXkpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiRm9yZWlnbktleVtcImlkXCJdID09PSBmb3JlaWduS2V5W1wiaWRcIl0gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJGb3JlaWduS2V5W1widGFibGVcIl0gPT09IGZvcmVpZ25LZXlbXCJ0YWJsZVwiXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbHVtbk5hbWVzID0gb3duRm9yZWlnbktleXMubWFwKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkYkZvcmVpZ25LZXkpID0+IGRiRm9yZWlnbktleVtcImZyb21cIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWZlcmVuY2VkQ29sdW1uTmFtZXMgPSBvd25Gb3JlaWduS2V5cy5tYXAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRiRm9yZWlnbktleSkgPT4gZGJGb3JlaWduS2V5W1widG9cIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICApXG5cblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmtNYXBwaW5nID0gZmtNYXBwaW5ncy5maW5kKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpdCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQucmVmZXJlbmNlZFRhYmxlTmFtZSA9PT1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVpZ25LZXlbXCJ0YWJsZVwiXSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdC5jb2x1bW5zLmV2ZXJ5KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbHVtbikgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5OYW1lcy5pbmRleE9mKGNvbHVtbikgIT09IC0xLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRhYmxlRm9yZWlnbktleSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogZmtNYXBwaW5nIS5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbk5hbWVzOiBjb2x1bW5OYW1lcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2VkVGFibGVOYW1lOiBmb3JlaWduS2V5W1widGFibGVcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlZENvbHVtbk5hbWVzOiByZWZlcmVuY2VkQ29sdW1uTmFtZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25EZWxldGU6IGZvcmVpZ25LZXlbXCJvbl9kZWxldGVcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25VcGRhdGU6IGZvcmVpZ25LZXlbXCJvbl91cGRhdGVcIl0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIClcblxuXG4gICAgICAgICAgICAgICAgbGV0IHVuaXF1ZVJlZ2V4UmVzdWx0XG4gICAgICAgICAgICAgICAgY29uc3QgdW5pcXVlTWFwcGluZ3M6IHsgbmFtZTogc3RyaW5nOyBjb2x1bW5zOiBzdHJpbmdbXSB9W10gPSBbXVxuICAgICAgICAgICAgICAgIGNvbnN0IHVuaXF1ZVJlZ2V4ID0gL0NPTlNUUkFJTlQgXCIoW15cIl0qKVwiIFVOSVFVRSA/XFwoKC4qPylcXCkvZ1xuICAgICAgICAgICAgICAgIHdoaWxlICgodW5pcXVlUmVnZXhSZXN1bHQgPSB1bmlxdWVSZWdleC5leGVjKHNxbCkpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHVuaXF1ZU1hcHBpbmdzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogdW5pcXVlUmVnZXhSZXN1bHRbMV0sXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5zOiB1bmlxdWVSZWdleFJlc3VsdFsyXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdWJzdHIoMSwgdW5pcXVlUmVnZXhSZXN1bHRbMl0ubGVuZ3RoIC0gMilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3BsaXQoYFwiLCBcImApLFxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICAgICAgY29uc3QgdGFibGVVbmlxdWVQcm9taXNlcyA9IGRiSW5kaWNlc1xuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChkYkluZGV4KSA9PiBkYkluZGV4W1wib3JpZ2luXCJdID09PSBcInVcIilcbiAgICAgICAgICAgICAgICAgICAgLm1hcCgoZGJJbmRleCkgPT4gZGJJbmRleFtcIm5hbWVcIl0pXG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAodmFsdWUsIGluZGV4LCBzZWxmKSA9PiBzZWxmLmluZGV4T2YodmFsdWUpID09PSBpbmRleCxcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAubWFwKGFzeW5jIChkYkluZGV4TmFtZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGJJbmRleCA9IGRiSW5kaWNlcy5maW5kKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkYkluZGV4KSA9PiBkYkluZGV4W1wibmFtZVwiXSA9PT0gZGJJbmRleE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmRleEluZm9zOiBPYmplY3RMaXRlcmFsW10gPSBhd2FpdCB0aGlzLnF1ZXJ5KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBQUkFHTUEgaW5kZXhfaW5mbyhcIiR7ZGJJbmRleCFbXCJuYW1lXCJdfVwiKWAsXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmRleENvbHVtbnMgPSBpbmRleEluZm9zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNvcnQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbmRleEluZm8xLCBpbmRleEluZm8yKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VJbnQoaW5kZXhJbmZvMVtcInNlcW5vXCJdKSAtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZUludChpbmRleEluZm8yW1wic2Vxbm9cIl0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKChpbmRleEluZm8pID0+IGluZGV4SW5mb1tcIm5hbWVcIl0pXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXhDb2x1bW5zLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbHVtbiA9IHRhYmxlLmNvbHVtbnMuZmluZCgoY29sdW1uKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhIWluZGV4Q29sdW1ucy5maW5kKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGluZGV4Q29sdW1uKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4Q29sdW1uID09PSBjb2x1bW4ubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbHVtbikgY29sdW1uLmlzVW5pcXVlID0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvdW5kTWFwcGluZyA9IHVuaXF1ZU1hcHBpbmdzLmZpbmQoKG1hcHBpbmcpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWFwcGluZyEuY29sdW1ucy5ldmVyeShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbHVtbikgPT4gaW5kZXhDb2x1bW5zLmluZGV4T2YoY29sdW1uKSAhPT0gLTEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUYWJsZVVuaXF1ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogZm91bmRNYXBwaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZm91bmRNYXBwaW5nLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLmNvbm5lY3Rpb24ubmFtaW5nU3RyYXRlZ3kudW5pcXVlQ29uc3RyYWludE5hbWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleENvbHVtbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5OYW1lczogaW5kZXhDb2x1bW5zLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB0YWJsZS51bmlxdWVzID0gKGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgICAgICAgICAgICB0YWJsZVVuaXF1ZVByb21pc2VzLFxuICAgICAgICAgICAgICAgICkpIGFzIFRhYmxlVW5pcXVlW11cblxuXG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdFxuICAgICAgICAgICAgICAgIGNvbnN0IHJlZ2V4cCA9XG4gICAgICAgICAgICAgICAgICAgIC9DT05TVFJBSU5UIFwiKFteXCJdKilcIiBDSEVDSyA/KFxcKC4qP1xcKSkoWyxdfFspXSQpL2dcbiAgICAgICAgICAgICAgICB3aGlsZSAoKHJlc3VsdCA9IHJlZ2V4cC5leGVjKHNxbCkpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRhYmxlLmNoZWNrcy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFRhYmxlQ2hlY2soe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHJlc3VsdFsxXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uOiByZXN1bHRbMl0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICAgICAgY29uc3QgaW5kaWNlc1Byb21pc2VzID0gZGJJbmRpY2VzXG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKGRiSW5kZXgpID0+IGRiSW5kZXhbXCJvcmlnaW5cIl0gPT09IFwiY1wiKVxuICAgICAgICAgICAgICAgICAgICAubWFwKChkYkluZGV4KSA9PiBkYkluZGV4W1wibmFtZVwiXSlcbiAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZSwgaW5kZXgsIHNlbGYpID0+IHNlbGYuaW5kZXhPZih2YWx1ZSkgPT09IGluZGV4LFxuICAgICAgICAgICAgICAgICAgICApIC8vIHVucWl1ZVxuICAgICAgICAgICAgICAgICAgICAubWFwKGFzeW5jIChkYkluZGV4TmFtZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXhEZWYgPSBkYkluZGljZXNEZWYuZmluZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGJJbmRleERlZikgPT4gZGJJbmRleERlZltcIm5hbWVcIl0gPT09IGRiSW5kZXhOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29uZGl0aW9uID0gL1dIRVJFICguKikvLmV4ZWMoaW5kZXhEZWYhW1wic3FsXCJdKVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGJJbmRleCA9IGRiSW5kaWNlcy5maW5kKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkYkluZGV4KSA9PiBkYkluZGV4W1wibmFtZVwiXSA9PT0gZGJJbmRleE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmRleEluZm9zOiBPYmplY3RMaXRlcmFsW10gPSBhd2FpdCB0aGlzLnF1ZXJ5KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBQUkFHTUEgaW5kZXhfaW5mbyhcIiR7ZGJJbmRleCFbXCJuYW1lXCJdfVwiKWAsXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmRleENvbHVtbnMgPSBpbmRleEluZm9zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNvcnQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbmRleEluZm8xLCBpbmRleEluZm8yKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VJbnQoaW5kZXhJbmZvMVtcInNlcW5vXCJdKSAtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZUludChpbmRleEluZm8yW1wic2Vxbm9cIl0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKChpbmRleEluZm8pID0+IGluZGV4SW5mb1tcIm5hbWVcIl0pXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkYkluZGV4UGF0aCA9IGAke1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiVGFibGVbXCJkYXRhYmFzZVwiXSA/IGAke2RiVGFibGVbXCJkYXRhYmFzZVwiXX0uYCA6IFwiXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0ke2RiSW5kZXghW1wibmFtZVwiXX1gXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzVW5pcXVlID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYkluZGV4IVtcInVuaXF1ZVwiXSA9PT0gXCIxXCIgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYkluZGV4IVtcInVuaXF1ZVwiXSA9PT0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUYWJsZUluZGV4KDxUYWJsZUluZGV4T3B0aW9ucz57XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGU6IHRhYmxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGRiSW5kZXhQYXRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbk5hbWVzOiBpbmRleENvbHVtbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNVbmlxdWU6IGlzVW5pcXVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlOiBjb25kaXRpb24gPyBjb25kaXRpb25bMV0gOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIGNvbnN0IGluZGljZXMgPSBhd2FpdCBQcm9taXNlLmFsbChpbmRpY2VzUHJvbWlzZXMpXG4gICAgICAgICAgICAgICAgdGFibGUuaW5kaWNlcyA9IGluZGljZXMuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgICAoaW5kZXgpID0+ICEhaW5kZXgsXG4gICAgICAgICAgICAgICAgKSBhcyBUYWJsZUluZGV4W11cblxuICAgICAgICAgICAgICAgIHJldHVybiB0YWJsZVxuICAgICAgICAgICAgfSksXG4gICAgICAgIClcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCdWlsZHMgY3JlYXRlIHRhYmxlIHNxbC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgY3JlYXRlVGFibGVTcWwoXG4gICAgICAgIHRhYmxlOiBUYWJsZSxcbiAgICAgICAgY3JlYXRlRm9yZWlnbktleXM/OiBib29sZWFuLFxuICAgICAgICB0ZW1wb3JhcnlUYWJsZT86IGJvb2xlYW4sXG4gICAgKTogUXVlcnkge1xuICAgICAgICBjb25zdCBwcmltYXJ5Q29sdW1ucyA9IHRhYmxlLmNvbHVtbnMuZmlsdGVyKFxuICAgICAgICAgICAgKGNvbHVtbikgPT4gY29sdW1uLmlzUHJpbWFyeSxcbiAgICAgICAgKVxuICAgICAgICBjb25zdCBoYXNBdXRvSW5jcmVtZW50ID0gcHJpbWFyeUNvbHVtbnMuZmluZChcbiAgICAgICAgICAgIChjb2x1bW4pID0+XG4gICAgICAgICAgICAgICAgY29sdW1uLmlzR2VuZXJhdGVkICYmIGNvbHVtbi5nZW5lcmF0aW9uU3RyYXRlZ3kgPT09IFwiaW5jcmVtZW50XCIsXG4gICAgICAgIClcbiAgICAgICAgY29uc3Qgc2tpcFByaW1hcnkgPSBwcmltYXJ5Q29sdW1ucy5sZW5ndGggPiAxXG4gICAgICAgIGlmIChza2lwUHJpbWFyeSAmJiBoYXNBdXRvSW5jcmVtZW50KVxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVPUk1FcnJvcihcbiAgICAgICAgICAgICAgICBgU3FsaXRlIGRvZXMgbm90IHN1cHBvcnQgQVVUT0lOQ1JFTUVOVCBvbiBjb21wb3NpdGUgcHJpbWFyeSBrZXlgLFxuICAgICAgICAgICAgKVxuXG4gICAgICAgIGNvbnN0IGNvbHVtbkRlZmluaXRpb25zID0gdGFibGUuY29sdW1uc1xuICAgICAgICAgICAgLm1hcCgoY29sdW1uKSA9PiB0aGlzLmJ1aWxkQ3JlYXRlQ29sdW1uU3FsKGNvbHVtbiwgc2tpcFByaW1hcnkpKVxuICAgICAgICAgICAgLmpvaW4oXCIsIFwiKVxuICAgICAgICBjb25zdCBbZGF0YWJhc2VdID0gdGhpcy5zcGxpdFRhYmxlUGF0aCh0YWJsZS5uYW1lKVxuICAgICAgICBsZXQgc3FsID0gYENSRUFURSBUQUJMRSAke3RoaXMuZXNjYXBlUGF0aChcbiAgICAgICAgICAgIHRhYmxlLm5hbWUsXG4gICAgICAgICl9ICgke2NvbHVtbkRlZmluaXRpb25zfWBcblxuICAgICAgICBsZXQgW2RhdGFiYXNlTmV3LCB0YWJsZU5hbWVdID0gdGhpcy5zcGxpdFRhYmxlUGF0aCh0YWJsZS5uYW1lKVxuICAgICAgICBjb25zdCBuZXdUYWJsZU5hbWUgPSB0ZW1wb3JhcnlUYWJsZVxuICAgICAgICAgICAgPyBgJHtkYXRhYmFzZU5ldyA/IGAke2RhdGFiYXNlTmV3fS5gIDogXCJcIn0ke3RhYmxlTmFtZS5yZXBsYWNlKFxuICAgICAgICAgICAgICAgICAgL150ZW1wb3JhcnlfLyxcbiAgICAgICAgICAgICAgICAgIFwiXCIsXG4gICAgICAgICAgICAgICl9YFxuICAgICAgICAgICAgOiB0YWJsZS5uYW1lXG5cblxuICAgICAgICB0YWJsZS5jb2x1bW5zXG4gICAgICAgICAgICAuZmlsdGVyKChjb2x1bW4pID0+IGNvbHVtbi5pc1VuaXF1ZSlcbiAgICAgICAgICAgIC5mb3JFYWNoKChjb2x1bW4pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpc1VuaXF1ZUV4aXN0ID0gdGFibGUudW5pcXVlcy5zb21lKFxuICAgICAgICAgICAgICAgICAgICAodW5pcXVlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlLmNvbHVtbk5hbWVzLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlLmNvbHVtbk5hbWVzWzBdID09PSBjb2x1bW4ubmFtZSxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgaWYgKCFpc1VuaXF1ZUV4aXN0KVxuICAgICAgICAgICAgICAgICAgICB0YWJsZS51bmlxdWVzLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgVGFibGVVbmlxdWUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHRoaXMuY29ubmVjdGlvbi5uYW1pbmdTdHJhdGVneS51bmlxdWVDb25zdHJhaW50TmFtZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb2x1bW4ubmFtZV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5OYW1lczogW2NvbHVtbi5uYW1lXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgIGlmICh0YWJsZS51bmlxdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHVuaXF1ZXNTcWwgPSB0YWJsZS51bmlxdWVzXG4gICAgICAgICAgICAgICAgLm1hcCgodW5pcXVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuaXF1ZU5hbWUgPSB1bmlxdWUubmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgPyB1bmlxdWUubmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLmNvbm5lY3Rpb24ubmFtaW5nU3RyYXRlZ3kudW5pcXVlQ29uc3RyYWludE5hbWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdUYWJsZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlxdWUuY29sdW1uTmFtZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29sdW1uTmFtZXMgPSB1bmlxdWUuY29sdW1uTmFtZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKGNvbHVtbk5hbWUpID0+IGBcIiR7Y29sdW1uTmFtZX1cImApXG4gICAgICAgICAgICAgICAgICAgICAgICAuam9pbihcIiwgXCIpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgQ09OU1RSQUlOVCBcIiR7dW5pcXVlTmFtZX1cIiBVTklRVUUgKCR7Y29sdW1uTmFtZXN9KWBcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5qb2luKFwiLCBcIilcblxuICAgICAgICAgICAgc3FsICs9IGAsICR7dW5pcXVlc1NxbH1gXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGFibGUuY2hlY2tzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGNoZWNrc1NxbCA9IHRhYmxlLmNoZWNrc1xuICAgICAgICAgICAgICAgIC5tYXAoKGNoZWNrKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoZWNrTmFtZSA9IGNoZWNrLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgID8gY2hlY2submFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLmNvbm5lY3Rpb24ubmFtaW5nU3RyYXRlZ3kuY2hlY2tDb25zdHJhaW50TmFtZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1RhYmxlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrLmV4cHJlc3Npb24hLFxuICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgQ09OU1RSQUlOVCBcIiR7Y2hlY2tOYW1lfVwiIENIRUNLICgke2NoZWNrLmV4cHJlc3Npb259KWBcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5qb2luKFwiLCBcIilcblxuICAgICAgICAgICAgc3FsICs9IGAsICR7Y2hlY2tzU3FsfWBcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0YWJsZS5mb3JlaWduS2V5cy5sZW5ndGggPiAwICYmIGNyZWF0ZUZvcmVpZ25LZXlzKSB7XG4gICAgICAgICAgICBjb25zdCBmb3JlaWduS2V5c1NxbCA9IHRhYmxlLmZvcmVpZ25LZXlzXG4gICAgICAgICAgICAgICAgLmZpbHRlcigoZmspID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgW3JlZmVyZW5jZWREYXRhYmFzZV0gPSB0aGlzLnNwbGl0VGFibGVQYXRoKFxuICAgICAgICAgICAgICAgICAgICAgICAgZmsucmVmZXJlbmNlZFRhYmxlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICBpZiAocmVmZXJlbmNlZERhdGFiYXNlICE9PSBkYXRhYmFzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5tYXAoKGZrKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IFssIHJlZmVyZW5jZWRUYWJsZV0gPSB0aGlzLnNwbGl0VGFibGVQYXRoKFxuICAgICAgICAgICAgICAgICAgICAgICAgZmsucmVmZXJlbmNlZFRhYmxlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb2x1bW5OYW1lcyA9IGZrLmNvbHVtbk5hbWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAubWFwKChjb2x1bW5OYW1lKSA9PiBgXCIke2NvbHVtbk5hbWV9XCJgKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmpvaW4oXCIsIFwiKVxuICAgICAgICAgICAgICAgICAgICBpZiAoIWZrLm5hbWUpXG4gICAgICAgICAgICAgICAgICAgICAgICBmay5uYW1lID0gdGhpcy5jb25uZWN0aW9uLm5hbWluZ1N0cmF0ZWd5LmZvcmVpZ25LZXlOYW1lKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1RhYmxlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmay5jb2x1bW5OYW1lcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFRhYmxlUGF0aChmayksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmsucmVmZXJlbmNlZENvbHVtbk5hbWVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZWZlcmVuY2VkQ29sdW1uTmFtZXMgPSBmay5yZWZlcmVuY2VkQ29sdW1uTmFtZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKGNvbHVtbk5hbWUpID0+IGBcIiR7Y29sdW1uTmFtZX1cImApXG4gICAgICAgICAgICAgICAgICAgICAgICAuam9pbihcIiwgXCIpXG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnN0cmFpbnQgPSBgQ09OU1RSQUlOVCBcIiR7ZmsubmFtZX1cIiBGT1JFSUdOIEtFWSAoJHtjb2x1bW5OYW1lc30pIFJFRkVSRU5DRVMgXCIke3JlZmVyZW5jZWRUYWJsZX1cIiAoJHtyZWZlcmVuY2VkQ29sdW1uTmFtZXN9KWBcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZrLm9uRGVsZXRlKSBjb25zdHJhaW50ICs9IGAgT04gREVMRVRFICR7Zmsub25EZWxldGV9YFxuICAgICAgICAgICAgICAgICAgICBpZiAoZmsub25VcGRhdGUpIGNvbnN0cmFpbnQgKz0gYCBPTiBVUERBVEUgJHtmay5vblVwZGF0ZX1gXG4gICAgICAgICAgICAgICAgICAgIGlmIChmay5kZWZlcnJhYmxlKVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RyYWludCArPSBgIERFRkVSUkFCTEUgJHtmay5kZWZlcnJhYmxlfWBcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29uc3RyYWludFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmpvaW4oXCIsIFwiKVxuXG4gICAgICAgICAgICBzcWwgKz0gYCwgJHtmb3JlaWduS2V5c1NxbH1gXG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJpbWFyeUNvbHVtbnMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgY29uc3QgY29sdW1uTmFtZXMgPSBwcmltYXJ5Q29sdW1uc1xuICAgICAgICAgICAgICAgIC5tYXAoKGNvbHVtbikgPT4gYFwiJHtjb2x1bW4ubmFtZX1cImApXG4gICAgICAgICAgICAgICAgLmpvaW4oXCIsIFwiKVxuICAgICAgICAgICAgc3FsICs9IGAsIFBSSU1BUlkgS0VZICgke2NvbHVtbk5hbWVzfSlgXG4gICAgICAgIH1cblxuICAgICAgICBzcWwgKz0gYClgXG5cbiAgICAgICAgaWYgKHRhYmxlLndpdGhvdXRSb3dpZCkge1xuICAgICAgICAgICAgc3FsICs9IFwiIFdJVEhPVVQgUk9XSURcIlxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBRdWVyeShzcWwpXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQnVpbGRzIGRyb3AgdGFibGUgc3FsLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBkcm9wVGFibGVTcWwoXG4gICAgICAgIHRhYmxlT3JOYW1lOiBUYWJsZSB8IHN0cmluZyxcbiAgICAgICAgaWZFeGlzdD86IGJvb2xlYW4sXG4gICAgKTogUXVlcnkge1xuICAgICAgICBjb25zdCB0YWJsZU5hbWUgPSBJbnN0YW5jZUNoZWNrZXIuaXNUYWJsZSh0YWJsZU9yTmFtZSlcbiAgICAgICAgICAgID8gdGFibGVPck5hbWUubmFtZVxuICAgICAgICAgICAgOiB0YWJsZU9yTmFtZVxuICAgICAgICBjb25zdCBxdWVyeSA9IGlmRXhpc3RcbiAgICAgICAgICAgID8gYERST1AgVEFCTEUgSUYgRVhJU1RTICR7dGhpcy5lc2NhcGVQYXRoKHRhYmxlTmFtZSl9YFxuICAgICAgICAgICAgOiBgRFJPUCBUQUJMRSAke3RoaXMuZXNjYXBlUGF0aCh0YWJsZU5hbWUpfWBcbiAgICAgICAgcmV0dXJuIG5ldyBRdWVyeShxdWVyeSlcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgY3JlYXRlVmlld1NxbCh2aWV3OiBWaWV3KTogUXVlcnkge1xuICAgICAgICBpZiAodHlwZW9mIHZpZXcuZXhwcmVzc2lvbiA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBRdWVyeShgQ1JFQVRFIFZJRVcgXCIke3ZpZXcubmFtZX1cIiBBUyAke3ZpZXcuZXhwcmVzc2lvbn1gKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBRdWVyeShcbiAgICAgICAgICAgICAgICBgQ1JFQVRFIFZJRVcgXCIke3ZpZXcubmFtZX1cIiBBUyAke3ZpZXdcbiAgICAgICAgICAgICAgICAgICAgLmV4cHJlc3Npb24odGhpcy5jb25uZWN0aW9uKVxuICAgICAgICAgICAgICAgICAgICAuZ2V0UXVlcnkoKX1gLFxuICAgICAgICAgICAgKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGluc2VydFZpZXdEZWZpbml0aW9uU3FsKHZpZXc6IFZpZXcpOiBRdWVyeSB7XG4gICAgICAgIGNvbnN0IGV4cHJlc3Npb24gPVxuICAgICAgICAgICAgdHlwZW9mIHZpZXcuZXhwcmVzc2lvbiA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgICAgICAgID8gdmlldy5leHByZXNzaW9uLnRyaW0oKVxuICAgICAgICAgICAgICAgIDogdmlldy5leHByZXNzaW9uKHRoaXMuY29ubmVjdGlvbikuZ2V0UXVlcnkoKVxuICAgICAgICByZXR1cm4gdGhpcy5pbnNlcnRUeXBlb3JtTWV0YWRhdGFTcWwoe1xuICAgICAgICAgICAgdHlwZTogTWV0YWRhdGFUYWJsZVR5cGUuVklFVyxcbiAgICAgICAgICAgIG5hbWU6IHZpZXcubmFtZSxcbiAgICAgICAgICAgIHZhbHVlOiBleHByZXNzaW9uLFxuICAgICAgICB9KVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJ1aWxkcyBkcm9wIHZpZXcgc3FsLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBkcm9wVmlld1NxbCh2aWV3T3JQYXRoOiBWaWV3IHwgc3RyaW5nKTogUXVlcnkge1xuICAgICAgICBjb25zdCB2aWV3TmFtZSA9IEluc3RhbmNlQ2hlY2tlci5pc1ZpZXcodmlld09yUGF0aClcbiAgICAgICAgICAgID8gdmlld09yUGF0aC5uYW1lXG4gICAgICAgICAgICA6IHZpZXdPclBhdGhcbiAgICAgICAgcmV0dXJuIG5ldyBRdWVyeShgRFJPUCBWSUVXIFwiJHt2aWV3TmFtZX1cImApXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQnVpbGRzIHJlbW92ZSB2aWV3IHNxbC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZGVsZXRlVmlld0RlZmluaXRpb25TcWwodmlld09yUGF0aDogVmlldyB8IHN0cmluZyk6IFF1ZXJ5IHtcbiAgICAgICAgY29uc3Qgdmlld05hbWUgPSBJbnN0YW5jZUNoZWNrZXIuaXNWaWV3KHZpZXdPclBhdGgpXG4gICAgICAgICAgICA/IHZpZXdPclBhdGgubmFtZVxuICAgICAgICAgICAgOiB2aWV3T3JQYXRoXG4gICAgICAgIHJldHVybiB0aGlzLmRlbGV0ZVR5cGVvcm1NZXRhZGF0YVNxbCh7XG4gICAgICAgICAgICB0eXBlOiBNZXRhZGF0YVRhYmxlVHlwZS5WSUVXLFxuICAgICAgICAgICAgbmFtZTogdmlld05hbWUsXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQnVpbGRzIGNyZWF0ZSBpbmRleCBzcWwuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNyZWF0ZUluZGV4U3FsKHRhYmxlOiBUYWJsZSwgaW5kZXg6IFRhYmxlSW5kZXgpOiBRdWVyeSB7XG4gICAgICAgIGNvbnN0IGNvbHVtbnMgPSBpbmRleC5jb2x1bW5OYW1lc1xuICAgICAgICAgICAgLm1hcCgoY29sdW1uTmFtZSkgPT4gYFwiJHtjb2x1bW5OYW1lfVwiYClcbiAgICAgICAgICAgIC5qb2luKFwiLCBcIilcbiAgICAgICAgY29uc3QgW2RhdGFiYXNlLCB0YWJsZU5hbWVdID0gdGhpcy5zcGxpdFRhYmxlUGF0aCh0YWJsZS5uYW1lKVxuICAgICAgICByZXR1cm4gbmV3IFF1ZXJ5KFxuICAgICAgICAgICAgYENSRUFURSAke2luZGV4LmlzVW5pcXVlID8gXCJVTklRVUUgXCIgOiBcIlwifUlOREVYICR7XG4gICAgICAgICAgICAgICAgZGF0YWJhc2UgPyBgXCIke2RhdGFiYXNlfVwiLmAgOiBcIlwiXG4gICAgICAgICAgICB9JHt0aGlzLmVzY2FwZVBhdGgoaW5kZXgubmFtZSEpfSBPTiBcIiR7dGFibGVOYW1lfVwiICgke2NvbHVtbnN9KSAke1xuICAgICAgICAgICAgICAgIGluZGV4LndoZXJlID8gXCJXSEVSRSBcIiArIGluZGV4LndoZXJlIDogXCJcIlxuICAgICAgICAgICAgfWAsXG4gICAgICAgIClcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCdWlsZHMgZHJvcCBpbmRleCBzcWwuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGRyb3BJbmRleFNxbChpbmRleE9yTmFtZTogVGFibGVJbmRleCB8IHN0cmluZyk6IFF1ZXJ5IHtcbiAgICAgICAgbGV0IGluZGV4TmFtZSA9IEluc3RhbmNlQ2hlY2tlci5pc1RhYmxlSW5kZXgoaW5kZXhPck5hbWUpXG4gICAgICAgICAgICA/IGluZGV4T3JOYW1lLm5hbWVcbiAgICAgICAgICAgIDogaW5kZXhPck5hbWVcbiAgICAgICAgcmV0dXJuIG5ldyBRdWVyeShgRFJPUCBJTkRFWCAke3RoaXMuZXNjYXBlUGF0aChpbmRleE5hbWUhKX1gKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJ1aWxkcyBhIHF1ZXJ5IGZvciBjcmVhdGUgY29sdW1uLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBidWlsZENyZWF0ZUNvbHVtblNxbChcbiAgICAgICAgY29sdW1uOiBUYWJsZUNvbHVtbixcbiAgICAgICAgc2tpcFByaW1hcnk/OiBib29sZWFuLFxuICAgICk6IHN0cmluZyB7XG4gICAgICAgIGxldCBjID0gJ1wiJyArIGNvbHVtbi5uYW1lICsgJ1wiJ1xuICAgICAgICBpZiAoSW5zdGFuY2VDaGVja2VyLmlzQ29sdW1uTWV0YWRhdGEoY29sdW1uKSkge1xuICAgICAgICAgICAgYyArPSBcIiBcIiArIHRoaXMuZHJpdmVyLm5vcm1hbGl6ZVR5cGUoY29sdW1uKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYyArPSBcIiBcIiArIHRoaXMuY29ubmVjdGlvbi5kcml2ZXIuY3JlYXRlRnVsbFR5cGUoY29sdW1uKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbHVtbi5lbnVtKVxuICAgICAgICAgICAgYyArPVxuICAgICAgICAgICAgICAgICcgQ0hFQ0soIFwiJyArXG4gICAgICAgICAgICAgICAgY29sdW1uLm5hbWUgK1xuICAgICAgICAgICAgICAgICdcIiBJTiAoJyArXG4gICAgICAgICAgICAgICAgY29sdW1uLmVudW0ubWFwKCh2YWwpID0+IFwiJ1wiICsgdmFsICsgXCInXCIpLmpvaW4oXCIsXCIpICtcbiAgICAgICAgICAgICAgICBcIikgKVwiXG4gICAgICAgIGlmIChjb2x1bW4uaXNQcmltYXJ5ICYmICFza2lwUHJpbWFyeSkgYyArPSBcIiBQUklNQVJZIEtFWVwiXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGNvbHVtbi5pc0dlbmVyYXRlZCA9PT0gdHJ1ZSAmJlxuICAgICAgICAgICAgY29sdW1uLmdlbmVyYXRpb25TdHJhdGVneSA9PT0gXCJpbmNyZW1lbnRcIlxuICAgICAgICApXG5cbiAgICAgICAgICAgIGMgKz0gXCIgQVVUT0lOQ1JFTUVOVFwiXG4gICAgICAgIGlmIChjb2x1bW4uY29sbGF0aW9uKSBjICs9IFwiIENPTExBVEUgXCIgKyBjb2x1bW4uY29sbGF0aW9uXG4gICAgICAgIGlmIChjb2x1bW4uaXNOdWxsYWJsZSAhPT0gdHJ1ZSkgYyArPSBcIiBOT1QgTlVMTFwiXG5cbiAgICAgICAgaWYgKGNvbHVtbi5hc0V4cHJlc3Npb24pIHtcbiAgICAgICAgICAgIGMgKz0gYCBBUyAoJHtjb2x1bW4uYXNFeHByZXNzaW9ufSkgJHtcbiAgICAgICAgICAgICAgICBjb2x1bW4uZ2VuZXJhdGVkVHlwZSA/IGNvbHVtbi5nZW5lcmF0ZWRUeXBlIDogXCJWSVJUVUFMXCJcbiAgICAgICAgICAgIH1gXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoY29sdW1uLmRlZmF1bHQgIT09IHVuZGVmaW5lZCAmJiBjb2x1bW4uZGVmYXVsdCAhPT0gbnVsbClcbiAgICAgICAgICAgICAgICBjICs9IFwiIERFRkFVTFQgKFwiICsgY29sdW1uLmRlZmF1bHQgKyBcIilcIlxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYXN5bmMgcmVjcmVhdGVUYWJsZShcbiAgICAgICAgbmV3VGFibGU6IFRhYmxlLFxuICAgICAgICBvbGRUYWJsZTogVGFibGUsXG4gICAgICAgIG1pZ3JhdGVEYXRhID0gdHJ1ZSxcbiAgICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgdXBRdWVyaWVzOiBRdWVyeVtdID0gW11cbiAgICAgICAgY29uc3QgZG93blF1ZXJpZXM6IFF1ZXJ5W10gPSBbXVxuXG5cbiAgICAgICAgb2xkVGFibGUuaW5kaWNlcy5mb3JFYWNoKChpbmRleCkgPT4ge1xuICAgICAgICAgICAgdXBRdWVyaWVzLnB1c2godGhpcy5kcm9wSW5kZXhTcWwoaW5kZXgpKVxuICAgICAgICAgICAgZG93blF1ZXJpZXMucHVzaCh0aGlzLmNyZWF0ZUluZGV4U3FsKG9sZFRhYmxlLCBpbmRleCkpXG4gICAgICAgIH0pXG5cblxuICAgICAgICBsZXQgW2RhdGFiYXNlTmV3LCB0YWJsZU5hbWVOZXddID0gdGhpcy5zcGxpdFRhYmxlUGF0aChuZXdUYWJsZS5uYW1lKVxuICAgICAgICBsZXQgWywgdGFibGVOYW1lT2xkXSA9IHRoaXMuc3BsaXRUYWJsZVBhdGgob2xkVGFibGUubmFtZSlcbiAgICAgICAgbmV3VGFibGUubmFtZSA9IHRhYmxlTmFtZU5ldyA9IGAke1xuICAgICAgICAgICAgZGF0YWJhc2VOZXcgPyBgJHtkYXRhYmFzZU5ld30uYCA6IFwiXCJcbiAgICAgICAgfXRlbXBvcmFyeV8ke3RhYmxlTmFtZU5ld31gXG5cblxuICAgICAgICB1cFF1ZXJpZXMucHVzaCh0aGlzLmNyZWF0ZVRhYmxlU3FsKG5ld1RhYmxlLCB0cnVlLCB0cnVlKSlcbiAgICAgICAgZG93blF1ZXJpZXMucHVzaCh0aGlzLmRyb3BUYWJsZVNxbChuZXdUYWJsZSkpXG5cblxuICAgICAgICBpZiAobWlncmF0ZURhdGEpIHtcbiAgICAgICAgICAgIGxldCBuZXdDb2x1bW5OYW1lcyA9IG5ld1RhYmxlLmNvbHVtbnNcbiAgICAgICAgICAgICAgICAuZmlsdGVyKChjb2x1bW4pID0+ICFjb2x1bW4uZ2VuZXJhdGVkVHlwZSlcbiAgICAgICAgICAgICAgICAubWFwKChjb2x1bW4pID0+IGBcIiR7Y29sdW1uLm5hbWV9XCJgKVxuXG4gICAgICAgICAgICBsZXQgb2xkQ29sdW1uTmFtZXMgPSBvbGRUYWJsZS5jb2x1bW5zXG4gICAgICAgICAgICAgICAgLmZpbHRlcigoY29sdW1uKSA9PiAhY29sdW1uLmdlbmVyYXRlZFR5cGUpXG4gICAgICAgICAgICAgICAgLm1hcCgoY29sdW1uKSA9PiBgXCIke2NvbHVtbi5uYW1lfVwiYClcblxuICAgICAgICAgICAgaWYgKG9sZENvbHVtbk5hbWVzLmxlbmd0aCA8IG5ld0NvbHVtbk5hbWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIG5ld0NvbHVtbk5hbWVzID0gbmV3VGFibGUuY29sdW1uc1xuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChjb2x1bW4pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9sZENvbHVtbiA9IG9sZFRhYmxlLmNvbHVtbnMuZmluZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYykgPT4gYy5uYW1lID09PSBjb2x1bW4ubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvbGRDb2x1bW4gJiYgb2xkQ29sdW1uLmdlbmVyYXRlZFR5cGUpIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFjb2x1bW4uZ2VuZXJhdGVkVHlwZSAmJiBvbGRDb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLm1hcCgoY29sdW1uKSA9PiBgXCIke2NvbHVtbi5uYW1lfVwiYClcbiAgICAgICAgICAgIH0gZWxzZSBpZiAob2xkQ29sdW1uTmFtZXMubGVuZ3RoID4gbmV3Q29sdW1uTmFtZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgb2xkQ29sdW1uTmFtZXMgPSBvbGRUYWJsZS5jb2x1bW5zXG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKGNvbHVtbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhY29sdW1uLmdlbmVyYXRlZFR5cGUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdUYWJsZS5jb2x1bW5zLmZpbmQoKGMpID0+IGMubmFtZSA9PT0gY29sdW1uLm5hbWUpXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoKGNvbHVtbikgPT4gYFwiJHtjb2x1bW4ubmFtZX1cImApXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKFxuICAgICAgICAgICAgICAgIG5ldyBRdWVyeShcbiAgICAgICAgICAgICAgICAgICAgYElOU0VSVCBJTlRPICR7dGhpcy5lc2NhcGVQYXRoKFxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3VGFibGUubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgKX0oJHtuZXdDb2x1bW5OYW1lcy5qb2luKFxuICAgICAgICAgICAgICAgICAgICAgICAgXCIsIFwiLFxuICAgICAgICAgICAgICAgICAgICApfSkgU0VMRUNUICR7b2xkQ29sdW1uTmFtZXMuam9pbihcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiLCBcIixcbiAgICAgICAgICAgICAgICAgICAgKX0gRlJPTSAke3RoaXMuZXNjYXBlUGF0aChvbGRUYWJsZS5uYW1lKX1gLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBkb3duUXVlcmllcy5wdXNoKFxuICAgICAgICAgICAgICAgIG5ldyBRdWVyeShcbiAgICAgICAgICAgICAgICAgICAgYElOU0VSVCBJTlRPICR7dGhpcy5lc2NhcGVQYXRoKFxuICAgICAgICAgICAgICAgICAgICAgICAgb2xkVGFibGUubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgKX0oJHtvbGRDb2x1bW5OYW1lcy5qb2luKFxuICAgICAgICAgICAgICAgICAgICAgICAgXCIsIFwiLFxuICAgICAgICAgICAgICAgICAgICApfSkgU0VMRUNUICR7bmV3Q29sdW1uTmFtZXMuam9pbihcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiLCBcIixcbiAgICAgICAgICAgICAgICAgICAgKX0gRlJPTSAke3RoaXMuZXNjYXBlUGF0aChuZXdUYWJsZS5uYW1lKX1gLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICApXG4gICAgICAgIH1cblxuXG4gICAgICAgIHVwUXVlcmllcy5wdXNoKHRoaXMuZHJvcFRhYmxlU3FsKG9sZFRhYmxlKSlcbiAgICAgICAgZG93blF1ZXJpZXMucHVzaCh0aGlzLmNyZWF0ZVRhYmxlU3FsKG9sZFRhYmxlLCB0cnVlKSlcblxuXG4gICAgICAgIHVwUXVlcmllcy5wdXNoKFxuICAgICAgICAgICAgbmV3IFF1ZXJ5KFxuICAgICAgICAgICAgICAgIGBBTFRFUiBUQUJMRSAke3RoaXMuZXNjYXBlUGF0aChcbiAgICAgICAgICAgICAgICAgICAgbmV3VGFibGUubmFtZSxcbiAgICAgICAgICAgICAgICApfSBSRU5BTUUgVE8gJHt0aGlzLmVzY2FwZVBhdGgodGFibGVOYW1lT2xkKX1gLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgKVxuICAgICAgICBkb3duUXVlcmllcy5wdXNoKFxuICAgICAgICAgICAgbmV3IFF1ZXJ5KFxuICAgICAgICAgICAgICAgIGBBTFRFUiBUQUJMRSAke3RoaXMuZXNjYXBlUGF0aChcbiAgICAgICAgICAgICAgICAgICAgb2xkVGFibGUubmFtZSxcbiAgICAgICAgICAgICAgICApfSBSRU5BTUUgVE8gJHt0aGlzLmVzY2FwZVBhdGgodGFibGVOYW1lTmV3KX1gLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgKVxuXG4gICAgICAgIG5ld1RhYmxlLm5hbWUgPSBvbGRUYWJsZS5uYW1lXG5cblxuICAgICAgICBuZXdUYWJsZS5pbmRpY2VzLmZvckVhY2goKGluZGV4KSA9PiB7XG5cbiAgICAgICAgICAgIGlmICghaW5kZXgubmFtZSlcbiAgICAgICAgICAgICAgICBpbmRleC5uYW1lID0gdGhpcy5jb25uZWN0aW9uLm5hbWluZ1N0cmF0ZWd5LmluZGV4TmFtZShcbiAgICAgICAgICAgICAgICAgICAgbmV3VGFibGUsXG4gICAgICAgICAgICAgICAgICAgIGluZGV4LmNvbHVtbk5hbWVzLFxuICAgICAgICAgICAgICAgICAgICBpbmRleC53aGVyZSxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICB1cFF1ZXJpZXMucHVzaCh0aGlzLmNyZWF0ZUluZGV4U3FsKG5ld1RhYmxlLCBpbmRleCkpXG4gICAgICAgICAgICBkb3duUXVlcmllcy5wdXNoKHRoaXMuZHJvcEluZGV4U3FsKGluZGV4KSlcbiAgICAgICAgfSlcblxuXG5cbiAgICAgICAgb2xkVGFibGUuY29sdW1uc1xuICAgICAgICAgICAgLmZpbHRlcigoY29sdW1uKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3VGFibGVDb2x1bW4gPSBuZXdUYWJsZS5jb2x1bW5zLmZpbmQoXG4gICAgICAgICAgICAgICAgICAgIChjKSA9PiBjLm5hbWUgPT09IGNvbHVtbi5uYW1lLFxuICAgICAgICAgICAgICAgIClcblxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uLmdlbmVyYXRlZFR5cGUgJiZcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uLmFzRXhwcmVzc2lvbiAmJlxuICAgICAgICAgICAgICAgICAgICAoIW5ld1RhYmxlQ29sdW1uIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAoIW5ld1RhYmxlQ29sdW1uLmdlbmVyYXRlZFR5cGUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhbmV3VGFibGVDb2x1bW4uYXNFeHByZXNzaW9uKSlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmZvckVhY2goKGNvbHVtbikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlbGV0ZVF1ZXJ5ID0gdGhpcy5kZWxldGVUeXBlb3JtTWV0YWRhdGFTcWwoe1xuICAgICAgICAgICAgICAgICAgICB0YWJsZTogb2xkVGFibGUubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogTWV0YWRhdGFUYWJsZVR5cGUuR0VORVJBVEVEX0NPTFVNTixcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogY29sdW1uLm5hbWUsXG4gICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgIGNvbnN0IGluc2VydFF1ZXJ5ID0gdGhpcy5pbnNlcnRUeXBlb3JtTWV0YWRhdGFTcWwoe1xuICAgICAgICAgICAgICAgICAgICB0YWJsZTogb2xkVGFibGUubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogTWV0YWRhdGFUYWJsZVR5cGUuR0VORVJBVEVEX0NPTFVNTixcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogY29sdW1uLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBjb2x1bW4uYXNFeHByZXNzaW9uLFxuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICB1cFF1ZXJpZXMucHVzaChkZWxldGVRdWVyeSlcbiAgICAgICAgICAgICAgICBkb3duUXVlcmllcy5wdXNoKGluc2VydFF1ZXJ5KVxuICAgICAgICAgICAgfSlcblxuXG4gICAgICAgIG5ld1RhYmxlLmNvbHVtbnNcbiAgICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAgICAgKGNvbHVtbikgPT5cbiAgICAgICAgICAgICAgICAgICAgY29sdW1uLmdlbmVyYXRlZFR5cGUgJiZcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uLmFzRXhwcmVzc2lvbiAmJlxuICAgICAgICAgICAgICAgICAgICAhb2xkVGFibGUuY29sdW1ucy5zb21lKChjKSA9PiBjLm5hbWUgPT09IGNvbHVtbi5uYW1lKSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5mb3JFYWNoKChjb2x1bW4pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbnNlcnRRdWVyeSA9IHRoaXMuaW5zZXJ0VHlwZW9ybU1ldGFkYXRhU3FsKHtcbiAgICAgICAgICAgICAgICAgICAgdGFibGU6IG5ld1RhYmxlLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IE1ldGFkYXRhVGFibGVUeXBlLkdFTkVSQVRFRF9DT0xVTU4sXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IGNvbHVtbi5uYW1lLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogY29sdW1uLmFzRXhwcmVzc2lvbixcbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgY29uc3QgZGVsZXRlUXVlcnkgPSB0aGlzLmRlbGV0ZVR5cGVvcm1NZXRhZGF0YVNxbCh7XG4gICAgICAgICAgICAgICAgICAgIHRhYmxlOiBuZXdUYWJsZS5uYW1lLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBNZXRhZGF0YVRhYmxlVHlwZS5HRU5FUkFURURfQ09MVU1OLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBjb2x1bW4ubmFtZSxcbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgdXBRdWVyaWVzLnB1c2goaW5zZXJ0UXVlcnkpXG4gICAgICAgICAgICAgICAgZG93blF1ZXJpZXMucHVzaChkZWxldGVRdWVyeSlcbiAgICAgICAgICAgIH0pXG5cblxuICAgICAgICBuZXdUYWJsZS5jb2x1bW5zXG4gICAgICAgICAgICAuZmlsdGVyKChjb2x1bW4pID0+IGNvbHVtbi5nZW5lcmF0ZWRUeXBlICYmIGNvbHVtbi5hc0V4cHJlc3Npb24pXG4gICAgICAgICAgICAuZm9yRWFjaCgoY29sdW1uKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb2xkQ29sdW1uID0gb2xkVGFibGUuY29sdW1ucy5maW5kKFxuICAgICAgICAgICAgICAgICAgICAoYykgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIGMubmFtZSA9PT0gY29sdW1uLm5hbWUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGMuZ2VuZXJhdGVkVHlwZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLmdlbmVyYXRlZFR5cGUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGMuYXNFeHByZXNzaW9uICE9PSBjb2x1bW4uYXNFeHByZXNzaW9uLFxuICAgICAgICAgICAgICAgIClcblxuICAgICAgICAgICAgICAgIGlmICghb2xkQ29sdW1uKSByZXR1cm5cblxuXG4gICAgICAgICAgICAgICAgY29uc3QgZGVsZXRlUXVlcnkgPSB0aGlzLmRlbGV0ZVR5cGVvcm1NZXRhZGF0YVNxbCh7XG4gICAgICAgICAgICAgICAgICAgIHRhYmxlOiBvbGRUYWJsZS5uYW1lLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBNZXRhZGF0YVRhYmxlVHlwZS5HRU5FUkFURURfQ09MVU1OLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBvbGRDb2x1bW4ubmFtZSxcbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgY29uc3QgaW5zZXJ0UXVlcnkgPSB0aGlzLmluc2VydFR5cGVvcm1NZXRhZGF0YVNxbCh7XG4gICAgICAgICAgICAgICAgICAgIHRhYmxlOiBuZXdUYWJsZS5uYW1lLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBNZXRhZGF0YVRhYmxlVHlwZS5HRU5FUkFURURfQ09MVU1OLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBjb2x1bW4ubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGNvbHVtbi5hc0V4cHJlc3Npb24sXG4gICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKGRlbGV0ZVF1ZXJ5KVxuICAgICAgICAgICAgICAgIHVwUXVlcmllcy5wdXNoKGluc2VydFF1ZXJ5KVxuXG5cbiAgICAgICAgICAgICAgICBjb25zdCByZXZlcnRJbnNlcnRRdWVyeSA9IHRoaXMuaW5zZXJ0VHlwZW9ybU1ldGFkYXRhU3FsKHtcbiAgICAgICAgICAgICAgICAgICAgdGFibGU6IG5ld1RhYmxlLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IE1ldGFkYXRhVGFibGVUeXBlLkdFTkVSQVRFRF9DT0xVTU4sXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IG9sZENvbHVtbi5uYW1lLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogb2xkQ29sdW1uLmFzRXhwcmVzc2lvbixcbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgY29uc3QgcmV2ZXJ0RGVsZXRlUXVlcnkgPSB0aGlzLmRlbGV0ZVR5cGVvcm1NZXRhZGF0YVNxbCh7XG4gICAgICAgICAgICAgICAgICAgIHRhYmxlOiBvbGRUYWJsZS5uYW1lLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBNZXRhZGF0YVRhYmxlVHlwZS5HRU5FUkFURURfQ09MVU1OLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBjb2x1bW4ubmFtZSxcbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgZG93blF1ZXJpZXMucHVzaChyZXZlcnRJbnNlcnRRdWVyeSlcbiAgICAgICAgICAgICAgICBkb3duUXVlcmllcy5wdXNoKHJldmVydERlbGV0ZVF1ZXJ5KVxuICAgICAgICAgICAgfSlcblxuICAgICAgICBhd2FpdCB0aGlzLmV4ZWN1dGVRdWVyaWVzKHVwUXVlcmllcywgZG93blF1ZXJpZXMpXG4gICAgICAgIHRoaXMucmVwbGFjZUNhY2hlZFRhYmxlKG9sZFRhYmxlLCBuZXdUYWJsZSlcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB0YWJsZVBhdGggZS5nLiBcIm15REIubXlUYWJsZVwiLCBcIm15VGFibGVcIlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBzcGxpdFRhYmxlUGF0aCh0YWJsZVBhdGg6IHN0cmluZyk6IFtzdHJpbmcgfCB1bmRlZmluZWQsIHN0cmluZ10ge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdGFibGVQYXRoLmluZGV4T2YoXCIuXCIpICE9PSAtMVxuICAgICAgICAgICAgICAgID8gdGFibGVQYXRoLnNwbGl0KFwiLlwiKVxuICAgICAgICAgICAgICAgIDogW3VuZGVmaW5lZCwgdGFibGVQYXRoXVxuICAgICAgICApIGFzIFtzdHJpbmcgfCB1bmRlZmluZWQsIHN0cmluZ11cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFc2NhcGVzIGdpdmVuIHRhYmxlIG9yIHZpZXcgcGF0aC4gVG9sZXJhdGVzIGxlYWRpbmcvdHJhaWxpbmcgZG90c1xuICAgICAqL1xuICAgIHByb3RlY3RlZCBlc2NhcGVQYXRoKFxuICAgICAgICB0YXJnZXQ6IFRhYmxlIHwgVmlldyB8IHN0cmluZyxcbiAgICAgICAgZGlzYWJsZUVzY2FwZT86IGJvb2xlYW4sXG4gICAgKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgdGFibGVOYW1lID1cbiAgICAgICAgICAgIEluc3RhbmNlQ2hlY2tlci5pc1RhYmxlKHRhcmdldCkgfHwgSW5zdGFuY2VDaGVja2VyLmlzVmlldyh0YXJnZXQpXG4gICAgICAgICAgICAgICAgPyB0YXJnZXQubmFtZVxuICAgICAgICAgICAgICAgIDogdGFyZ2V0XG4gICAgICAgIHJldHVybiB0YWJsZU5hbWVcbiAgICAgICAgICAgIC5yZXBsYWNlKC9eXFwuK3xcXC4rJC9nLCBcIlwiKVxuICAgICAgICAgICAgLnNwbGl0KFwiLlwiKVxuICAgICAgICAgICAgLm1hcCgoaSkgPT4gKGRpc2FibGVFc2NhcGUgPyBpIDogYFwiJHtpfVwiYCkpXG4gICAgICAgICAgICAuam9pbihcIi5cIilcbiAgICB9XG59XG5cbiA7KHt9KTsgLy8gQC0tZW5kLW9mLWZpbGUtZm9yLW1vZHVsZT10YW9uLXR5cGVvcm0gbGliL3R5cGVvcm0vZHJpdmVyL3NxbGl0ZS1hYnN0cmFjdC9BYnN0cmFjdFNxbGl0ZVF1ZXJ5UnVubmVyLnRzIl19
|