// generated from terraform resource schema
import * as cdktf from 'cdktf';
export function elasticacheReplicationGroupClusterModeToTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    return {
        num_node_groups: cdktf.numberToTerraform(struct.numNodeGroups),
        replicas_per_node_group: cdktf.numberToTerraform(struct.replicasPerNodeGroup),
    };
}
export class ElasticacheReplicationGroupClusterModeOutputReference extends cdktf.ComplexObject {
    isEmptyObject = false;
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    * @param isSingleItem True if this is a block, false if it's a list
    */
    constructor(terraformResource, terraformAttribute, isSingleItem) {
        super(terraformResource, terraformAttribute, isSingleItem);
    }
    get internalValue() {
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._numNodeGroups !== undefined) {
            hasAnyValues = true;
            internalValueResult.numNodeGroups = this._numNodeGroups;
        }
        if (this._replicasPerNodeGroup !== undefined) {
            hasAnyValues = true;
            internalValueResult.replicasPerNodeGroup = this._replicasPerNodeGroup;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._numNodeGroups = undefined;
            this._replicasPerNodeGroup = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._numNodeGroups = value.numNodeGroups;
            this._replicasPerNodeGroup = value.replicasPerNodeGroup;
        }
    }
    // num_node_groups - computed: true, optional: true, required: false
    _numNodeGroups;
    get numNodeGroups() {
        return this.getNumberAttribute('num_node_groups');
    }
    set numNodeGroups(value) {
        this._numNodeGroups = value;
    }
    resetNumNodeGroups() {
        this._numNodeGroups = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get numNodeGroupsInput() {
        return this._numNodeGroups;
    }
    // replicas_per_node_group - computed: true, optional: true, required: false
    _replicasPerNodeGroup;
    get replicasPerNodeGroup() {
        return this.getNumberAttribute('replicas_per_node_group');
    }
    set replicasPerNodeGroup(value) {
        this._replicasPerNodeGroup = value;
    }
    resetReplicasPerNodeGroup() {
        this._replicasPerNodeGroup = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get replicasPerNodeGroupInput() {
        return this._replicasPerNodeGroup;
    }
}
export function elasticacheReplicationGroupTimeoutsToTerraform(struct) {
    if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
        return struct;
    }
    if (cdktf.isComplexElement(struct)) {
        throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
    }
    return {
        create: cdktf.stringToTerraform(struct.create),
        delete: cdktf.stringToTerraform(struct.delete),
        update: cdktf.stringToTerraform(struct.update),
    };
}
export class ElasticacheReplicationGroupTimeoutsOutputReference extends cdktf.ComplexObject {
    isEmptyObject = false;
    /**
    * @param terraformResource The parent resource
    * @param terraformAttribute The attribute on the parent resource this class is referencing
    * @param isSingleItem True if this is a block, false if it's a list
    */
    constructor(terraformResource, terraformAttribute, isSingleItem) {
        super(terraformResource, terraformAttribute, isSingleItem);
    }
    get internalValue() {
        let hasAnyValues = this.isEmptyObject;
        const internalValueResult = {};
        if (this._create !== undefined) {
            hasAnyValues = true;
            internalValueResult.create = this._create;
        }
        if (this._delete !== undefined) {
            hasAnyValues = true;
            internalValueResult.delete = this._delete;
        }
        if (this._update !== undefined) {
            hasAnyValues = true;
            internalValueResult.update = this._update;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._create = undefined;
            this._delete = undefined;
            this._update = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._create = value.create;
            this._delete = value.delete;
            this._update = value.update;
        }
    }
    // create - computed: false, optional: true, required: false
    _create;
    get create() {
        return this.getStringAttribute('create');
    }
    set create(value) {
        this._create = value;
    }
    resetCreate() {
        this._create = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get createInput() {
        return this._create;
    }
    // delete - computed: false, optional: true, required: false
    _delete;
    get delete() {
        return this.getStringAttribute('delete');
    }
    set delete(value) {
        this._delete = value;
    }
    resetDelete() {
        this._delete = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get deleteInput() {
        return this._delete;
    }
    // update - computed: false, optional: true, required: false
    _update;
    get update() {
        return this.getStringAttribute('update');
    }
    set update(value) {
        this._update = value;
    }
    resetUpdate() {
        this._update = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get updateInput() {
        return this._update;
    }
}
/**
* Represents a {@link https://www.terraform.io/docs/providers/aws/r/elasticache_replication_group aws_elasticache_replication_group}
*/
export class ElasticacheReplicationGroup extends cdktf.TerraformResource {
    // =================
    // STATIC PROPERTIES
    // =================
    static tfResourceType = "aws_elasticache_replication_group";
    // ===========
    // INITIALIZER
    // ===========
    /**
    * Create a new {@link https://www.terraform.io/docs/providers/aws/r/elasticache_replication_group aws_elasticache_replication_group} Resource
    *
    * @param scope The scope in which to define this construct
    * @param id The scoped construct ID. Must be unique amongst siblings in the same scope
    * @param options ElasticacheReplicationGroupConfig
    */
    constructor(scope, id, config) {
        super(scope, id, {
            terraformResourceType: 'aws_elasticache_replication_group',
            terraformGeneratorMetadata: {
                providerName: 'aws'
            },
            provider: config.provider,
            dependsOn: config.dependsOn,
            count: config.count,
            lifecycle: config.lifecycle
        });
        this._applyImmediately = config.applyImmediately;
        this._atRestEncryptionEnabled = config.atRestEncryptionEnabled;
        this._authToken = config.authToken;
        this._autoMinorVersionUpgrade = config.autoMinorVersionUpgrade;
        this._automaticFailoverEnabled = config.automaticFailoverEnabled;
        this._availabilityZones = config.availabilityZones;
        this._dataTieringEnabled = config.dataTieringEnabled;
        this._description = config.description;
        this._engine = config.engine;
        this._engineVersion = config.engineVersion;
        this._finalSnapshotIdentifier = config.finalSnapshotIdentifier;
        this._globalReplicationGroupId = config.globalReplicationGroupId;
        this._kmsKeyId = config.kmsKeyId;
        this._maintenanceWindow = config.maintenanceWindow;
        this._multiAzEnabled = config.multiAzEnabled;
        this._nodeType = config.nodeType;
        this._notificationTopicArn = config.notificationTopicArn;
        this._numCacheClusters = config.numCacheClusters;
        this._numNodeGroups = config.numNodeGroups;
        this._numberCacheClusters = config.numberCacheClusters;
        this._parameterGroupName = config.parameterGroupName;
        this._port = config.port;
        this._preferredCacheClusterAzs = config.preferredCacheClusterAzs;
        this._replicasPerNodeGroup = config.replicasPerNodeGroup;
        this._replicationGroupDescription = config.replicationGroupDescription;
        this._replicationGroupId = config.replicationGroupId;
        this._securityGroupIds = config.securityGroupIds;
        this._securityGroupNames = config.securityGroupNames;
        this._snapshotArns = config.snapshotArns;
        this._snapshotName = config.snapshotName;
        this._snapshotRetentionLimit = config.snapshotRetentionLimit;
        this._snapshotWindow = config.snapshotWindow;
        this._subnetGroupName = config.subnetGroupName;
        this._tags = config.tags;
        this._tagsAll = config.tagsAll;
        this._transitEncryptionEnabled = config.transitEncryptionEnabled;
        this._userGroupIds = config.userGroupIds;
        this._clusterMode.internalValue = config.clusterMode;
        this._timeouts.internalValue = config.timeouts;
    }
    // ==========
    // ATTRIBUTES
    // ==========
    // apply_immediately - computed: true, optional: true, required: false
    _applyImmediately;
    get applyImmediately() {
        return this.getBooleanAttribute('apply_immediately');
    }
    set applyImmediately(value) {
        this._applyImmediately = value;
    }
    resetApplyImmediately() {
        this._applyImmediately = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get applyImmediatelyInput() {
        return this._applyImmediately;
    }
    // arn - computed: true, optional: false, required: false
    get arn() {
        return this.getStringAttribute('arn');
    }
    // at_rest_encryption_enabled - computed: true, optional: true, required: false
    _atRestEncryptionEnabled;
    get atRestEncryptionEnabled() {
        return this.getBooleanAttribute('at_rest_encryption_enabled');
    }
    set atRestEncryptionEnabled(value) {
        this._atRestEncryptionEnabled = value;
    }
    resetAtRestEncryptionEnabled() {
        this._atRestEncryptionEnabled = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get atRestEncryptionEnabledInput() {
        return this._atRestEncryptionEnabled;
    }
    // auth_token - computed: false, optional: true, required: false
    _authToken;
    get authToken() {
        return this.getStringAttribute('auth_token');
    }
    set authToken(value) {
        this._authToken = value;
    }
    resetAuthToken() {
        this._authToken = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get authTokenInput() {
        return this._authToken;
    }
    // auto_minor_version_upgrade - computed: false, optional: true, required: false
    _autoMinorVersionUpgrade;
    get autoMinorVersionUpgrade() {
        return this.getBooleanAttribute('auto_minor_version_upgrade');
    }
    set autoMinorVersionUpgrade(value) {
        this._autoMinorVersionUpgrade = value;
    }
    resetAutoMinorVersionUpgrade() {
        this._autoMinorVersionUpgrade = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get autoMinorVersionUpgradeInput() {
        return this._autoMinorVersionUpgrade;
    }
    // automatic_failover_enabled - computed: false, optional: true, required: false
    _automaticFailoverEnabled;
    get automaticFailoverEnabled() {
        return this.getBooleanAttribute('automatic_failover_enabled');
    }
    set automaticFailoverEnabled(value) {
        this._automaticFailoverEnabled = value;
    }
    resetAutomaticFailoverEnabled() {
        this._automaticFailoverEnabled = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get automaticFailoverEnabledInput() {
        return this._automaticFailoverEnabled;
    }
    // availability_zones - computed: false, optional: true, required: false
    _availabilityZones;
    get availabilityZones() {
        return cdktf.Fn.tolist(this.getListAttribute('availability_zones'));
    }
    set availabilityZones(value) {
        this._availabilityZones = value;
    }
    resetAvailabilityZones() {
        this._availabilityZones = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get availabilityZonesInput() {
        return this._availabilityZones;
    }
    // cluster_enabled - computed: true, optional: false, required: false
    get clusterEnabled() {
        return this.getBooleanAttribute('cluster_enabled');
    }
    // configuration_endpoint_address - computed: true, optional: false, required: false
    get configurationEndpointAddress() {
        return this.getStringAttribute('configuration_endpoint_address');
    }
    // data_tiering_enabled - computed: true, optional: true, required: false
    _dataTieringEnabled;
    get dataTieringEnabled() {
        return this.getBooleanAttribute('data_tiering_enabled');
    }
    set dataTieringEnabled(value) {
        this._dataTieringEnabled = value;
    }
    resetDataTieringEnabled() {
        this._dataTieringEnabled = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get dataTieringEnabledInput() {
        return this._dataTieringEnabled;
    }
    // description - computed: true, optional: true, required: false
    _description;
    get description() {
        return this.getStringAttribute('description');
    }
    set description(value) {
        this._description = value;
    }
    resetDescription() {
        this._description = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get descriptionInput() {
        return this._description;
    }
    // engine - computed: false, optional: true, required: false
    _engine;
    get engine() {
        return this.getStringAttribute('engine');
    }
    set engine(value) {
        this._engine = value;
    }
    resetEngine() {
        this._engine = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get engineInput() {
        return this._engine;
    }
    // engine_version - computed: true, optional: true, required: false
    _engineVersion;
    get engineVersion() {
        return this.getStringAttribute('engine_version');
    }
    set engineVersion(value) {
        this._engineVersion = value;
    }
    resetEngineVersion() {
        this._engineVersion = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get engineVersionInput() {
        return this._engineVersion;
    }
    // engine_version_actual - computed: true, optional: false, required: false
    get engineVersionActual() {
        return this.getStringAttribute('engine_version_actual');
    }
    // final_snapshot_identifier - computed: false, optional: true, required: false
    _finalSnapshotIdentifier;
    get finalSnapshotIdentifier() {
        return this.getStringAttribute('final_snapshot_identifier');
    }
    set finalSnapshotIdentifier(value) {
        this._finalSnapshotIdentifier = value;
    }
    resetFinalSnapshotIdentifier() {
        this._finalSnapshotIdentifier = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get finalSnapshotIdentifierInput() {
        return this._finalSnapshotIdentifier;
    }
    // global_replication_group_id - computed: true, optional: true, required: false
    _globalReplicationGroupId;
    get globalReplicationGroupId() {
        return this.getStringAttribute('global_replication_group_id');
    }
    set globalReplicationGroupId(value) {
        this._globalReplicationGroupId = value;
    }
    resetGlobalReplicationGroupId() {
        this._globalReplicationGroupId = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get globalReplicationGroupIdInput() {
        return this._globalReplicationGroupId;
    }
    // id - computed: true, optional: true, required: false
    get id() {
        return this.getStringAttribute('id');
    }
    // kms_key_id - computed: false, optional: true, required: false
    _kmsKeyId;
    get kmsKeyId() {
        return this.getStringAttribute('kms_key_id');
    }
    set kmsKeyId(value) {
        this._kmsKeyId = value;
    }
    resetKmsKeyId() {
        this._kmsKeyId = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get kmsKeyIdInput() {
        return this._kmsKeyId;
    }
    // maintenance_window - computed: true, optional: true, required: false
    _maintenanceWindow;
    get maintenanceWindow() {
        return this.getStringAttribute('maintenance_window');
    }
    set maintenanceWindow(value) {
        this._maintenanceWindow = value;
    }
    resetMaintenanceWindow() {
        this._maintenanceWindow = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get maintenanceWindowInput() {
        return this._maintenanceWindow;
    }
    // member_clusters - computed: true, optional: false, required: false
    get memberClusters() {
        return cdktf.Fn.tolist(this.getListAttribute('member_clusters'));
    }
    // multi_az_enabled - computed: false, optional: true, required: false
    _multiAzEnabled;
    get multiAzEnabled() {
        return this.getBooleanAttribute('multi_az_enabled');
    }
    set multiAzEnabled(value) {
        this._multiAzEnabled = value;
    }
    resetMultiAzEnabled() {
        this._multiAzEnabled = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get multiAzEnabledInput() {
        return this._multiAzEnabled;
    }
    // node_type - computed: true, optional: true, required: false
    _nodeType;
    get nodeType() {
        return this.getStringAttribute('node_type');
    }
    set nodeType(value) {
        this._nodeType = value;
    }
    resetNodeType() {
        this._nodeType = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get nodeTypeInput() {
        return this._nodeType;
    }
    // notification_topic_arn - computed: false, optional: true, required: false
    _notificationTopicArn;
    get notificationTopicArn() {
        return this.getStringAttribute('notification_topic_arn');
    }
    set notificationTopicArn(value) {
        this._notificationTopicArn = value;
    }
    resetNotificationTopicArn() {
        this._notificationTopicArn = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get notificationTopicArnInput() {
        return this._notificationTopicArn;
    }
    // num_cache_clusters - computed: true, optional: true, required: false
    _numCacheClusters;
    get numCacheClusters() {
        return this.getNumberAttribute('num_cache_clusters');
    }
    set numCacheClusters(value) {
        this._numCacheClusters = value;
    }
    resetNumCacheClusters() {
        this._numCacheClusters = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get numCacheClustersInput() {
        return this._numCacheClusters;
    }
    // num_node_groups - computed: true, optional: true, required: false
    _numNodeGroups;
    get numNodeGroups() {
        return this.getNumberAttribute('num_node_groups');
    }
    set numNodeGroups(value) {
        this._numNodeGroups = value;
    }
    resetNumNodeGroups() {
        this._numNodeGroups = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get numNodeGroupsInput() {
        return this._numNodeGroups;
    }
    // number_cache_clusters - computed: true, optional: true, required: false
    _numberCacheClusters;
    get numberCacheClusters() {
        return this.getNumberAttribute('number_cache_clusters');
    }
    set numberCacheClusters(value) {
        this._numberCacheClusters = value;
    }
    resetNumberCacheClusters() {
        this._numberCacheClusters = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get numberCacheClustersInput() {
        return this._numberCacheClusters;
    }
    // parameter_group_name - computed: true, optional: true, required: false
    _parameterGroupName;
    get parameterGroupName() {
        return this.getStringAttribute('parameter_group_name');
    }
    set parameterGroupName(value) {
        this._parameterGroupName = value;
    }
    resetParameterGroupName() {
        this._parameterGroupName = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get parameterGroupNameInput() {
        return this._parameterGroupName;
    }
    // port - computed: false, optional: true, required: false
    _port;
    get port() {
        return this.getNumberAttribute('port');
    }
    set port(value) {
        this._port = value;
    }
    resetPort() {
        this._port = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get portInput() {
        return this._port;
    }
    // preferred_cache_cluster_azs - computed: false, optional: true, required: false
    _preferredCacheClusterAzs;
    get preferredCacheClusterAzs() {
        return this.getListAttribute('preferred_cache_cluster_azs');
    }
    set preferredCacheClusterAzs(value) {
        this._preferredCacheClusterAzs = value;
    }
    resetPreferredCacheClusterAzs() {
        this._preferredCacheClusterAzs = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get preferredCacheClusterAzsInput() {
        return this._preferredCacheClusterAzs;
    }
    // primary_endpoint_address - computed: true, optional: false, required: false
    get primaryEndpointAddress() {
        return this.getStringAttribute('primary_endpoint_address');
    }
    // reader_endpoint_address - computed: true, optional: false, required: false
    get readerEndpointAddress() {
        return this.getStringAttribute('reader_endpoint_address');
    }
    // replicas_per_node_group - computed: true, optional: true, required: false
    _replicasPerNodeGroup;
    get replicasPerNodeGroup() {
        return this.getNumberAttribute('replicas_per_node_group');
    }
    set replicasPerNodeGroup(value) {
        this._replicasPerNodeGroup = value;
    }
    resetReplicasPerNodeGroup() {
        this._replicasPerNodeGroup = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get replicasPerNodeGroupInput() {
        return this._replicasPerNodeGroup;
    }
    // replication_group_description - computed: true, optional: true, required: false
    _replicationGroupDescription;
    get replicationGroupDescription() {
        return this.getStringAttribute('replication_group_description');
    }
    set replicationGroupDescription(value) {
        this._replicationGroupDescription = value;
    }
    resetReplicationGroupDescription() {
        this._replicationGroupDescription = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get replicationGroupDescriptionInput() {
        return this._replicationGroupDescription;
    }
    // replication_group_id - computed: false, optional: false, required: true
    _replicationGroupId;
    get replicationGroupId() {
        return this.getStringAttribute('replication_group_id');
    }
    set replicationGroupId(value) {
        this._replicationGroupId = value;
    }
    // Temporarily expose input value. Use with caution.
    get replicationGroupIdInput() {
        return this._replicationGroupId;
    }
    // security_group_ids - computed: true, optional: true, required: false
    _securityGroupIds;
    get securityGroupIds() {
        return cdktf.Fn.tolist(this.getListAttribute('security_group_ids'));
    }
    set securityGroupIds(value) {
        this._securityGroupIds = value;
    }
    resetSecurityGroupIds() {
        this._securityGroupIds = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get securityGroupIdsInput() {
        return this._securityGroupIds;
    }
    // security_group_names - computed: true, optional: true, required: false
    _securityGroupNames;
    get securityGroupNames() {
        return cdktf.Fn.tolist(this.getListAttribute('security_group_names'));
    }
    set securityGroupNames(value) {
        this._securityGroupNames = value;
    }
    resetSecurityGroupNames() {
        this._securityGroupNames = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get securityGroupNamesInput() {
        return this._securityGroupNames;
    }
    // snapshot_arns - computed: false, optional: true, required: false
    _snapshotArns;
    get snapshotArns() {
        return cdktf.Fn.tolist(this.getListAttribute('snapshot_arns'));
    }
    set snapshotArns(value) {
        this._snapshotArns = value;
    }
    resetSnapshotArns() {
        this._snapshotArns = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get snapshotArnsInput() {
        return this._snapshotArns;
    }
    // snapshot_name - computed: false, optional: true, required: false
    _snapshotName;
    get snapshotName() {
        return this.getStringAttribute('snapshot_name');
    }
    set snapshotName(value) {
        this._snapshotName = value;
    }
    resetSnapshotName() {
        this._snapshotName = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get snapshotNameInput() {
        return this._snapshotName;
    }
    // snapshot_retention_limit - computed: false, optional: true, required: false
    _snapshotRetentionLimit;
    get snapshotRetentionLimit() {
        return this.getNumberAttribute('snapshot_retention_limit');
    }
    set snapshotRetentionLimit(value) {
        this._snapshotRetentionLimit = value;
    }
    resetSnapshotRetentionLimit() {
        this._snapshotRetentionLimit = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get snapshotRetentionLimitInput() {
        return this._snapshotRetentionLimit;
    }
    // snapshot_window - computed: true, optional: true, required: false
    _snapshotWindow;
    get snapshotWindow() {
        return this.getStringAttribute('snapshot_window');
    }
    set snapshotWindow(value) {
        this._snapshotWindow = value;
    }
    resetSnapshotWindow() {
        this._snapshotWindow = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get snapshotWindowInput() {
        return this._snapshotWindow;
    }
    // subnet_group_name - computed: true, optional: true, required: false
    _subnetGroupName;
    get subnetGroupName() {
        return this.getStringAttribute('subnet_group_name');
    }
    set subnetGroupName(value) {
        this._subnetGroupName = value;
    }
    resetSubnetGroupName() {
        this._subnetGroupName = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get subnetGroupNameInput() {
        return this._subnetGroupName;
    }
    // tags - computed: false, optional: true, required: false
    _tags;
    get tags() {
        return this.getStringMapAttribute('tags');
    }
    set tags(value) {
        this._tags = value;
    }
    resetTags() {
        this._tags = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get tagsInput() {
        return this._tags;
    }
    // tags_all - computed: true, optional: true, required: false
    _tagsAll;
    get tagsAll() {
        return this.getStringMapAttribute('tags_all');
    }
    set tagsAll(value) {
        this._tagsAll = value;
    }
    resetTagsAll() {
        this._tagsAll = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get tagsAllInput() {
        return this._tagsAll;
    }
    // transit_encryption_enabled - computed: true, optional: true, required: false
    _transitEncryptionEnabled;
    get transitEncryptionEnabled() {
        return this.getBooleanAttribute('transit_encryption_enabled');
    }
    set transitEncryptionEnabled(value) {
        this._transitEncryptionEnabled = value;
    }
    resetTransitEncryptionEnabled() {
        this._transitEncryptionEnabled = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get transitEncryptionEnabledInput() {
        return this._transitEncryptionEnabled;
    }
    // user_group_ids - computed: false, optional: true, required: false
    _userGroupIds;
    get userGroupIds() {
        return cdktf.Fn.tolist(this.getListAttribute('user_group_ids'));
    }
    set userGroupIds(value) {
        this._userGroupIds = value;
    }
    resetUserGroupIds() {
        this._userGroupIds = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get userGroupIdsInput() {
        return this._userGroupIds;
    }
    // cluster_mode - computed: false, optional: true, required: false
    _clusterMode = new ElasticacheReplicationGroupClusterModeOutputReference(this, "cluster_mode", true);
    get clusterMode() {
        return this._clusterMode;
    }
    putClusterMode(value) {
        this._clusterMode.internalValue = value;
    }
    resetClusterMode() {
        this._clusterMode.internalValue = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get clusterModeInput() {
        return this._clusterMode.internalValue;
    }
    // timeouts - computed: false, optional: true, required: false
    _timeouts = new ElasticacheReplicationGroupTimeoutsOutputReference(this, "timeouts", true);
    get timeouts() {
        return this._timeouts;
    }
    putTimeouts(value) {
        this._timeouts.internalValue = value;
    }
    resetTimeouts() {
        this._timeouts.internalValue = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get timeoutsInput() {
        return this._timeouts.internalValue;
    }
    // =========
    // SYNTHESIS
    // =========
    synthesizeAttributes() {
        return {
            apply_immediately: cdktf.booleanToTerraform(this._applyImmediately),
            at_rest_encryption_enabled: cdktf.booleanToTerraform(this._atRestEncryptionEnabled),
            auth_token: cdktf.stringToTerraform(this._authToken),
            auto_minor_version_upgrade: cdktf.booleanToTerraform(this._autoMinorVersionUpgrade),
            automatic_failover_enabled: cdktf.booleanToTerraform(this._automaticFailoverEnabled),
            availability_zones: cdktf.listMapper(cdktf.stringToTerraform)(this._availabilityZones),
            data_tiering_enabled: cdktf.booleanToTerraform(this._dataTieringEnabled),
            description: cdktf.stringToTerraform(this._description),
            engine: cdktf.stringToTerraform(this._engine),
            engine_version: cdktf.stringToTerraform(this._engineVersion),
            final_snapshot_identifier: cdktf.stringToTerraform(this._finalSnapshotIdentifier),
            global_replication_group_id: cdktf.stringToTerraform(this._globalReplicationGroupId),
            kms_key_id: cdktf.stringToTerraform(this._kmsKeyId),
            maintenance_window: cdktf.stringToTerraform(this._maintenanceWindow),
            multi_az_enabled: cdktf.booleanToTerraform(this._multiAzEnabled),
            node_type: cdktf.stringToTerraform(this._nodeType),
            notification_topic_arn: cdktf.stringToTerraform(this._notificationTopicArn),
            num_cache_clusters: cdktf.numberToTerraform(this._numCacheClusters),
            num_node_groups: cdktf.numberToTerraform(this._numNodeGroups),
            number_cache_clusters: cdktf.numberToTerraform(this._numberCacheClusters),
            parameter_group_name: cdktf.stringToTerraform(this._parameterGroupName),
            port: cdktf.numberToTerraform(this._port),
            preferred_cache_cluster_azs: cdktf.listMapper(cdktf.stringToTerraform)(this._preferredCacheClusterAzs),
            replicas_per_node_group: cdktf.numberToTerraform(this._replicasPerNodeGroup),
            replication_group_description: cdktf.stringToTerraform(this._replicationGroupDescription),
            replication_group_id: cdktf.stringToTerraform(this._replicationGroupId),
            security_group_ids: cdktf.listMapper(cdktf.stringToTerraform)(this._securityGroupIds),
            security_group_names: cdktf.listMapper(cdktf.stringToTerraform)(this._securityGroupNames),
            snapshot_arns: cdktf.listMapper(cdktf.stringToTerraform)(this._snapshotArns),
            snapshot_name: cdktf.stringToTerraform(this._snapshotName),
            snapshot_retention_limit: cdktf.numberToTerraform(this._snapshotRetentionLimit),
            snapshot_window: cdktf.stringToTerraform(this._snapshotWindow),
            subnet_group_name: cdktf.stringToTerraform(this._subnetGroupName),
            tags: cdktf.hashMapper(cdktf.stringToTerraform)(this._tags),
            tags_all: cdktf.hashMapper(cdktf.stringToTerraform)(this._tagsAll),
            transit_encryption_enabled: cdktf.booleanToTerraform(this._transitEncryptionEnabled),
            user_group_ids: cdktf.listMapper(cdktf.stringToTerraform)(this._userGroupIds),
            cluster_mode: elasticacheReplicationGroupClusterModeToTerraform(this._clusterMode.internalValue),
            timeouts: elasticacheReplicationGroupTimeoutsToTerraform(this._timeouts.internalValue),
        };
    }
}
//# sourceMappingURL=elasticache-replication-group.js.map