// generated from terraform resource schema
import * as cdktf from 'cdktf';
export function launchTemplateBlockDeviceMappingsEbsToTerraform(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 {
        delete_on_termination: cdktf.stringToTerraform(struct.deleteOnTermination),
        encrypted: cdktf.stringToTerraform(struct.encrypted),
        iops: cdktf.numberToTerraform(struct.iops),
        kms_key_id: cdktf.stringToTerraform(struct.kmsKeyId),
        snapshot_id: cdktf.stringToTerraform(struct.snapshotId),
        throughput: cdktf.numberToTerraform(struct.throughput),
        volume_size: cdktf.numberToTerraform(struct.volumeSize),
        volume_type: cdktf.stringToTerraform(struct.volumeType),
    };
}
export class LaunchTemplateBlockDeviceMappingsEbsOutputReference 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._deleteOnTermination !== undefined) {
            hasAnyValues = true;
            internalValueResult.deleteOnTermination = this._deleteOnTermination;
        }
        if (this._encrypted !== undefined) {
            hasAnyValues = true;
            internalValueResult.encrypted = this._encrypted;
        }
        if (this._iops !== undefined) {
            hasAnyValues = true;
            internalValueResult.iops = this._iops;
        }
        if (this._kmsKeyId !== undefined) {
            hasAnyValues = true;
            internalValueResult.kmsKeyId = this._kmsKeyId;
        }
        if (this._snapshotId !== undefined) {
            hasAnyValues = true;
            internalValueResult.snapshotId = this._snapshotId;
        }
        if (this._throughput !== undefined) {
            hasAnyValues = true;
            internalValueResult.throughput = this._throughput;
        }
        if (this._volumeSize !== undefined) {
            hasAnyValues = true;
            internalValueResult.volumeSize = this._volumeSize;
        }
        if (this._volumeType !== undefined) {
            hasAnyValues = true;
            internalValueResult.volumeType = this._volumeType;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._deleteOnTermination = undefined;
            this._encrypted = undefined;
            this._iops = undefined;
            this._kmsKeyId = undefined;
            this._snapshotId = undefined;
            this._throughput = undefined;
            this._volumeSize = undefined;
            this._volumeType = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._deleteOnTermination = value.deleteOnTermination;
            this._encrypted = value.encrypted;
            this._iops = value.iops;
            this._kmsKeyId = value.kmsKeyId;
            this._snapshotId = value.snapshotId;
            this._throughput = value.throughput;
            this._volumeSize = value.volumeSize;
            this._volumeType = value.volumeType;
        }
    }
    // delete_on_termination - computed: false, optional: true, required: false
    _deleteOnTermination;
    get deleteOnTermination() {
        return this.getStringAttribute('delete_on_termination');
    }
    set deleteOnTermination(value) {
        this._deleteOnTermination = value;
    }
    resetDeleteOnTermination() {
        this._deleteOnTermination = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get deleteOnTerminationInput() {
        return this._deleteOnTermination;
    }
    // encrypted - computed: false, optional: true, required: false
    _encrypted;
    get encrypted() {
        return this.getStringAttribute('encrypted');
    }
    set encrypted(value) {
        this._encrypted = value;
    }
    resetEncrypted() {
        this._encrypted = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get encryptedInput() {
        return this._encrypted;
    }
    // iops - computed: true, optional: true, required: false
    _iops;
    get iops() {
        return this.getNumberAttribute('iops');
    }
    set iops(value) {
        this._iops = value;
    }
    resetIops() {
        this._iops = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get iopsInput() {
        return this._iops;
    }
    // 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;
    }
    // snapshot_id - computed: false, optional: true, required: false
    _snapshotId;
    get snapshotId() {
        return this.getStringAttribute('snapshot_id');
    }
    set snapshotId(value) {
        this._snapshotId = value;
    }
    resetSnapshotId() {
        this._snapshotId = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get snapshotIdInput() {
        return this._snapshotId;
    }
    // throughput - computed: true, optional: true, required: false
    _throughput;
    get throughput() {
        return this.getNumberAttribute('throughput');
    }
    set throughput(value) {
        this._throughput = value;
    }
    resetThroughput() {
        this._throughput = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get throughputInput() {
        return this._throughput;
    }
    // volume_size - computed: true, optional: true, required: false
    _volumeSize;
    get volumeSize() {
        return this.getNumberAttribute('volume_size');
    }
    set volumeSize(value) {
        this._volumeSize = value;
    }
    resetVolumeSize() {
        this._volumeSize = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get volumeSizeInput() {
        return this._volumeSize;
    }
    // volume_type - computed: true, optional: true, required: false
    _volumeType;
    get volumeType() {
        return this.getStringAttribute('volume_type');
    }
    set volumeType(value) {
        this._volumeType = value;
    }
    resetVolumeType() {
        this._volumeType = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get volumeTypeInput() {
        return this._volumeType;
    }
}
export function launchTemplateBlockDeviceMappingsToTerraform(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 {
        device_name: cdktf.stringToTerraform(struct.deviceName),
        no_device: cdktf.stringToTerraform(struct.noDevice),
        virtual_name: cdktf.stringToTerraform(struct.virtualName),
        ebs: launchTemplateBlockDeviceMappingsEbsToTerraform(struct.ebs),
    };
}
export function launchTemplateCapacityReservationSpecificationCapacityReservationTargetToTerraform(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 {
        capacity_reservation_id: cdktf.stringToTerraform(struct.capacityReservationId),
    };
}
export class LaunchTemplateCapacityReservationSpecificationCapacityReservationTargetOutputReference 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._capacityReservationId !== undefined) {
            hasAnyValues = true;
            internalValueResult.capacityReservationId = this._capacityReservationId;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._capacityReservationId = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._capacityReservationId = value.capacityReservationId;
        }
    }
    // capacity_reservation_id - computed: false, optional: true, required: false
    _capacityReservationId;
    get capacityReservationId() {
        return this.getStringAttribute('capacity_reservation_id');
    }
    set capacityReservationId(value) {
        this._capacityReservationId = value;
    }
    resetCapacityReservationId() {
        this._capacityReservationId = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get capacityReservationIdInput() {
        return this._capacityReservationId;
    }
}
export function launchTemplateCapacityReservationSpecificationToTerraform(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 {
        capacity_reservation_preference: cdktf.stringToTerraform(struct.capacityReservationPreference),
        capacity_reservation_target: launchTemplateCapacityReservationSpecificationCapacityReservationTargetToTerraform(struct.capacityReservationTarget),
    };
}
export class LaunchTemplateCapacityReservationSpecificationOutputReference 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._capacityReservationPreference !== undefined) {
            hasAnyValues = true;
            internalValueResult.capacityReservationPreference = this._capacityReservationPreference;
        }
        if (this._capacityReservationTarget?.internalValue !== undefined) {
            hasAnyValues = true;
            internalValueResult.capacityReservationTarget = this._capacityReservationTarget?.internalValue;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._capacityReservationPreference = undefined;
            this._capacityReservationTarget.internalValue = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._capacityReservationPreference = value.capacityReservationPreference;
            this._capacityReservationTarget.internalValue = value.capacityReservationTarget;
        }
    }
    // capacity_reservation_preference - computed: false, optional: true, required: false
    _capacityReservationPreference;
    get capacityReservationPreference() {
        return this.getStringAttribute('capacity_reservation_preference');
    }
    set capacityReservationPreference(value) {
        this._capacityReservationPreference = value;
    }
    resetCapacityReservationPreference() {
        this._capacityReservationPreference = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get capacityReservationPreferenceInput() {
        return this._capacityReservationPreference;
    }
    // capacity_reservation_target - computed: false, optional: true, required: false
    _capacityReservationTarget = new LaunchTemplateCapacityReservationSpecificationCapacityReservationTargetOutputReference(this, "capacity_reservation_target", true);
    get capacityReservationTarget() {
        return this._capacityReservationTarget;
    }
    putCapacityReservationTarget(value) {
        this._capacityReservationTarget.internalValue = value;
    }
    resetCapacityReservationTarget() {
        this._capacityReservationTarget.internalValue = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get capacityReservationTargetInput() {
        return this._capacityReservationTarget.internalValue;
    }
}
export function launchTemplateCpuOptionsToTerraform(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 {
        core_count: cdktf.numberToTerraform(struct.coreCount),
        threads_per_core: cdktf.numberToTerraform(struct.threadsPerCore),
    };
}
export class LaunchTemplateCpuOptionsOutputReference 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._coreCount !== undefined) {
            hasAnyValues = true;
            internalValueResult.coreCount = this._coreCount;
        }
        if (this._threadsPerCore !== undefined) {
            hasAnyValues = true;
            internalValueResult.threadsPerCore = this._threadsPerCore;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._coreCount = undefined;
            this._threadsPerCore = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._coreCount = value.coreCount;
            this._threadsPerCore = value.threadsPerCore;
        }
    }
    // core_count - computed: false, optional: true, required: false
    _coreCount;
    get coreCount() {
        return this.getNumberAttribute('core_count');
    }
    set coreCount(value) {
        this._coreCount = value;
    }
    resetCoreCount() {
        this._coreCount = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get coreCountInput() {
        return this._coreCount;
    }
    // threads_per_core - computed: false, optional: true, required: false
    _threadsPerCore;
    get threadsPerCore() {
        return this.getNumberAttribute('threads_per_core');
    }
    set threadsPerCore(value) {
        this._threadsPerCore = value;
    }
    resetThreadsPerCore() {
        this._threadsPerCore = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get threadsPerCoreInput() {
        return this._threadsPerCore;
    }
}
export function launchTemplateCreditSpecificationToTerraform(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 {
        cpu_credits: cdktf.stringToTerraform(struct.cpuCredits),
    };
}
export class LaunchTemplateCreditSpecificationOutputReference 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._cpuCredits !== undefined) {
            hasAnyValues = true;
            internalValueResult.cpuCredits = this._cpuCredits;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._cpuCredits = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._cpuCredits = value.cpuCredits;
        }
    }
    // cpu_credits - computed: false, optional: true, required: false
    _cpuCredits;
    get cpuCredits() {
        return this.getStringAttribute('cpu_credits');
    }
    set cpuCredits(value) {
        this._cpuCredits = value;
    }
    resetCpuCredits() {
        this._cpuCredits = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get cpuCreditsInput() {
        return this._cpuCredits;
    }
}
export function launchTemplateElasticGpuSpecificationsToTerraform(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 {
        type: cdktf.stringToTerraform(struct.type),
    };
}
export function launchTemplateElasticInferenceAcceleratorToTerraform(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 {
        type: cdktf.stringToTerraform(struct.type),
    };
}
export class LaunchTemplateElasticInferenceAcceleratorOutputReference 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._type !== undefined) {
            hasAnyValues = true;
            internalValueResult.type = this._type;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._type = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._type = value.type;
        }
    }
    // type - computed: false, optional: false, required: true
    _type;
    get type() {
        return this.getStringAttribute('type');
    }
    set type(value) {
        this._type = value;
    }
    // Temporarily expose input value. Use with caution.
    get typeInput() {
        return this._type;
    }
}
export function launchTemplateEnclaveOptionsToTerraform(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 {
        enabled: cdktf.booleanToTerraform(struct.enabled),
    };
}
export class LaunchTemplateEnclaveOptionsOutputReference 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._enabled !== undefined) {
            hasAnyValues = true;
            internalValueResult.enabled = this._enabled;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._enabled = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._enabled = value.enabled;
        }
    }
    // enabled - computed: false, optional: true, required: false
    _enabled;
    get enabled() {
        return this.getBooleanAttribute('enabled');
    }
    set enabled(value) {
        this._enabled = value;
    }
    resetEnabled() {
        this._enabled = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get enabledInput() {
        return this._enabled;
    }
}
export function launchTemplateHibernationOptionsToTerraform(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 {
        configured: cdktf.booleanToTerraform(struct.configured),
    };
}
export class LaunchTemplateHibernationOptionsOutputReference 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._configured !== undefined) {
            hasAnyValues = true;
            internalValueResult.configured = this._configured;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._configured = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._configured = value.configured;
        }
    }
    // configured - computed: false, optional: false, required: true
    _configured;
    get configured() {
        return this.getBooleanAttribute('configured');
    }
    set configured(value) {
        this._configured = value;
    }
    // Temporarily expose input value. Use with caution.
    get configuredInput() {
        return this._configured;
    }
}
export function launchTemplateIamInstanceProfileToTerraform(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 {
        arn: cdktf.stringToTerraform(struct.arn),
        name: cdktf.stringToTerraform(struct.name),
    };
}
export class LaunchTemplateIamInstanceProfileOutputReference 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._arn !== undefined) {
            hasAnyValues = true;
            internalValueResult.arn = this._arn;
        }
        if (this._name !== undefined) {
            hasAnyValues = true;
            internalValueResult.name = this._name;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._arn = undefined;
            this._name = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._arn = value.arn;
            this._name = value.name;
        }
    }
    // arn - computed: false, optional: true, required: false
    _arn;
    get arn() {
        return this.getStringAttribute('arn');
    }
    set arn(value) {
        this._arn = value;
    }
    resetArn() {
        this._arn = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get arnInput() {
        return this._arn;
    }
    // name - computed: false, optional: true, required: false
    _name;
    get name() {
        return this.getStringAttribute('name');
    }
    set name(value) {
        this._name = value;
    }
    resetName() {
        this._name = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get nameInput() {
        return this._name;
    }
}
export function launchTemplateInstanceMarketOptionsSpotOptionsToTerraform(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 {
        block_duration_minutes: cdktf.numberToTerraform(struct.blockDurationMinutes),
        instance_interruption_behavior: cdktf.stringToTerraform(struct.instanceInterruptionBehavior),
        max_price: cdktf.stringToTerraform(struct.maxPrice),
        spot_instance_type: cdktf.stringToTerraform(struct.spotInstanceType),
        valid_until: cdktf.stringToTerraform(struct.validUntil),
    };
}
export class LaunchTemplateInstanceMarketOptionsSpotOptionsOutputReference 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._blockDurationMinutes !== undefined) {
            hasAnyValues = true;
            internalValueResult.blockDurationMinutes = this._blockDurationMinutes;
        }
        if (this._instanceInterruptionBehavior !== undefined) {
            hasAnyValues = true;
            internalValueResult.instanceInterruptionBehavior = this._instanceInterruptionBehavior;
        }
        if (this._maxPrice !== undefined) {
            hasAnyValues = true;
            internalValueResult.maxPrice = this._maxPrice;
        }
        if (this._spotInstanceType !== undefined) {
            hasAnyValues = true;
            internalValueResult.spotInstanceType = this._spotInstanceType;
        }
        if (this._validUntil !== undefined) {
            hasAnyValues = true;
            internalValueResult.validUntil = this._validUntil;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._blockDurationMinutes = undefined;
            this._instanceInterruptionBehavior = undefined;
            this._maxPrice = undefined;
            this._spotInstanceType = undefined;
            this._validUntil = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._blockDurationMinutes = value.blockDurationMinutes;
            this._instanceInterruptionBehavior = value.instanceInterruptionBehavior;
            this._maxPrice = value.maxPrice;
            this._spotInstanceType = value.spotInstanceType;
            this._validUntil = value.validUntil;
        }
    }
    // block_duration_minutes - computed: false, optional: true, required: false
    _blockDurationMinutes;
    get blockDurationMinutes() {
        return this.getNumberAttribute('block_duration_minutes');
    }
    set blockDurationMinutes(value) {
        this._blockDurationMinutes = value;
    }
    resetBlockDurationMinutes() {
        this._blockDurationMinutes = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get blockDurationMinutesInput() {
        return this._blockDurationMinutes;
    }
    // instance_interruption_behavior - computed: false, optional: true, required: false
    _instanceInterruptionBehavior;
    get instanceInterruptionBehavior() {
        return this.getStringAttribute('instance_interruption_behavior');
    }
    set instanceInterruptionBehavior(value) {
        this._instanceInterruptionBehavior = value;
    }
    resetInstanceInterruptionBehavior() {
        this._instanceInterruptionBehavior = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get instanceInterruptionBehaviorInput() {
        return this._instanceInterruptionBehavior;
    }
    // max_price - computed: false, optional: true, required: false
    _maxPrice;
    get maxPrice() {
        return this.getStringAttribute('max_price');
    }
    set maxPrice(value) {
        this._maxPrice = value;
    }
    resetMaxPrice() {
        this._maxPrice = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get maxPriceInput() {
        return this._maxPrice;
    }
    // spot_instance_type - computed: false, optional: true, required: false
    _spotInstanceType;
    get spotInstanceType() {
        return this.getStringAttribute('spot_instance_type');
    }
    set spotInstanceType(value) {
        this._spotInstanceType = value;
    }
    resetSpotInstanceType() {
        this._spotInstanceType = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get spotInstanceTypeInput() {
        return this._spotInstanceType;
    }
    // valid_until - computed: true, optional: true, required: false
    _validUntil;
    get validUntil() {
        return this.getStringAttribute('valid_until');
    }
    set validUntil(value) {
        this._validUntil = value;
    }
    resetValidUntil() {
        this._validUntil = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get validUntilInput() {
        return this._validUntil;
    }
}
export function launchTemplateInstanceMarketOptionsToTerraform(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 {
        market_type: cdktf.stringToTerraform(struct.marketType),
        spot_options: launchTemplateInstanceMarketOptionsSpotOptionsToTerraform(struct.spotOptions),
    };
}
export class LaunchTemplateInstanceMarketOptionsOutputReference 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._marketType !== undefined) {
            hasAnyValues = true;
            internalValueResult.marketType = this._marketType;
        }
        if (this._spotOptions?.internalValue !== undefined) {
            hasAnyValues = true;
            internalValueResult.spotOptions = this._spotOptions?.internalValue;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._marketType = undefined;
            this._spotOptions.internalValue = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._marketType = value.marketType;
            this._spotOptions.internalValue = value.spotOptions;
        }
    }
    // market_type - computed: false, optional: true, required: false
    _marketType;
    get marketType() {
        return this.getStringAttribute('market_type');
    }
    set marketType(value) {
        this._marketType = value;
    }
    resetMarketType() {
        this._marketType = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get marketTypeInput() {
        return this._marketType;
    }
    // spot_options - computed: false, optional: true, required: false
    _spotOptions = new LaunchTemplateInstanceMarketOptionsSpotOptionsOutputReference(this, "spot_options", true);
    get spotOptions() {
        return this._spotOptions;
    }
    putSpotOptions(value) {
        this._spotOptions.internalValue = value;
    }
    resetSpotOptions() {
        this._spotOptions.internalValue = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get spotOptionsInput() {
        return this._spotOptions.internalValue;
    }
}
export function launchTemplateLicenseSpecificationToTerraform(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 {
        license_configuration_arn: cdktf.stringToTerraform(struct.licenseConfigurationArn),
    };
}
export function launchTemplateMetadataOptionsToTerraform(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 {
        http_endpoint: cdktf.stringToTerraform(struct.httpEndpoint),
        http_protocol_ipv6: cdktf.stringToTerraform(struct.httpProtocolIpv6),
        http_put_response_hop_limit: cdktf.numberToTerraform(struct.httpPutResponseHopLimit),
        http_tokens: cdktf.stringToTerraform(struct.httpTokens),
        instance_metadata_tags: cdktf.stringToTerraform(struct.instanceMetadataTags),
    };
}
export class LaunchTemplateMetadataOptionsOutputReference 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._httpEndpoint !== undefined) {
            hasAnyValues = true;
            internalValueResult.httpEndpoint = this._httpEndpoint;
        }
        if (this._httpProtocolIpv6 !== undefined) {
            hasAnyValues = true;
            internalValueResult.httpProtocolIpv6 = this._httpProtocolIpv6;
        }
        if (this._httpPutResponseHopLimit !== undefined) {
            hasAnyValues = true;
            internalValueResult.httpPutResponseHopLimit = this._httpPutResponseHopLimit;
        }
        if (this._httpTokens !== undefined) {
            hasAnyValues = true;
            internalValueResult.httpTokens = this._httpTokens;
        }
        if (this._instanceMetadataTags !== undefined) {
            hasAnyValues = true;
            internalValueResult.instanceMetadataTags = this._instanceMetadataTags;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._httpEndpoint = undefined;
            this._httpProtocolIpv6 = undefined;
            this._httpPutResponseHopLimit = undefined;
            this._httpTokens = undefined;
            this._instanceMetadataTags = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._httpEndpoint = value.httpEndpoint;
            this._httpProtocolIpv6 = value.httpProtocolIpv6;
            this._httpPutResponseHopLimit = value.httpPutResponseHopLimit;
            this._httpTokens = value.httpTokens;
            this._instanceMetadataTags = value.instanceMetadataTags;
        }
    }
    // http_endpoint - computed: true, optional: true, required: false
    _httpEndpoint;
    get httpEndpoint() {
        return this.getStringAttribute('http_endpoint');
    }
    set httpEndpoint(value) {
        this._httpEndpoint = value;
    }
    resetHttpEndpoint() {
        this._httpEndpoint = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get httpEndpointInput() {
        return this._httpEndpoint;
    }
    // http_protocol_ipv6 - computed: false, optional: true, required: false
    _httpProtocolIpv6;
    get httpProtocolIpv6() {
        return this.getStringAttribute('http_protocol_ipv6');
    }
    set httpProtocolIpv6(value) {
        this._httpProtocolIpv6 = value;
    }
    resetHttpProtocolIpv6() {
        this._httpProtocolIpv6 = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get httpProtocolIpv6Input() {
        return this._httpProtocolIpv6;
    }
    // http_put_response_hop_limit - computed: true, optional: true, required: false
    _httpPutResponseHopLimit;
    get httpPutResponseHopLimit() {
        return this.getNumberAttribute('http_put_response_hop_limit');
    }
    set httpPutResponseHopLimit(value) {
        this._httpPutResponseHopLimit = value;
    }
    resetHttpPutResponseHopLimit() {
        this._httpPutResponseHopLimit = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get httpPutResponseHopLimitInput() {
        return this._httpPutResponseHopLimit;
    }
    // http_tokens - computed: true, optional: true, required: false
    _httpTokens;
    get httpTokens() {
        return this.getStringAttribute('http_tokens');
    }
    set httpTokens(value) {
        this._httpTokens = value;
    }
    resetHttpTokens() {
        this._httpTokens = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get httpTokensInput() {
        return this._httpTokens;
    }
    // instance_metadata_tags - computed: false, optional: true, required: false
    _instanceMetadataTags;
    get instanceMetadataTags() {
        return this.getStringAttribute('instance_metadata_tags');
    }
    set instanceMetadataTags(value) {
        this._instanceMetadataTags = value;
    }
    resetInstanceMetadataTags() {
        this._instanceMetadataTags = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get instanceMetadataTagsInput() {
        return this._instanceMetadataTags;
    }
}
export function launchTemplateMonitoringToTerraform(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 {
        enabled: cdktf.booleanToTerraform(struct.enabled),
    };
}
export class LaunchTemplateMonitoringOutputReference 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._enabled !== undefined) {
            hasAnyValues = true;
            internalValueResult.enabled = this._enabled;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._enabled = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._enabled = value.enabled;
        }
    }
    // enabled - computed: false, optional: true, required: false
    _enabled;
    get enabled() {
        return this.getBooleanAttribute('enabled');
    }
    set enabled(value) {
        this._enabled = value;
    }
    resetEnabled() {
        this._enabled = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get enabledInput() {
        return this._enabled;
    }
}
export function launchTemplateNetworkInterfacesToTerraform(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 {
        associate_carrier_ip_address: cdktf.stringToTerraform(struct.associateCarrierIpAddress),
        associate_public_ip_address: cdktf.stringToTerraform(struct.associatePublicIpAddress),
        delete_on_termination: cdktf.stringToTerraform(struct.deleteOnTermination),
        description: cdktf.stringToTerraform(struct.description),
        device_index: cdktf.numberToTerraform(struct.deviceIndex),
        interface_type: cdktf.stringToTerraform(struct.interfaceType),
        ipv4_address_count: cdktf.numberToTerraform(struct.ipv4AddressCount),
        ipv4_addresses: cdktf.listMapper(cdktf.stringToTerraform)(struct.ipv4Addresses),
        ipv6_address_count: cdktf.numberToTerraform(struct.ipv6AddressCount),
        ipv6_addresses: cdktf.listMapper(cdktf.stringToTerraform)(struct.ipv6Addresses),
        network_card_index: cdktf.numberToTerraform(struct.networkCardIndex),
        network_interface_id: cdktf.stringToTerraform(struct.networkInterfaceId),
        private_ip_address: cdktf.stringToTerraform(struct.privateIpAddress),
        security_groups: cdktf.listMapper(cdktf.stringToTerraform)(struct.securityGroups),
        subnet_id: cdktf.stringToTerraform(struct.subnetId),
    };
}
export function launchTemplatePlacementToTerraform(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 {
        affinity: cdktf.stringToTerraform(struct.affinity),
        availability_zone: cdktf.stringToTerraform(struct.availabilityZone),
        group_name: cdktf.stringToTerraform(struct.groupName),
        host_id: cdktf.stringToTerraform(struct.hostId),
        host_resource_group_arn: cdktf.stringToTerraform(struct.hostResourceGroupArn),
        partition_number: cdktf.numberToTerraform(struct.partitionNumber),
        spread_domain: cdktf.stringToTerraform(struct.spreadDomain),
        tenancy: cdktf.stringToTerraform(struct.tenancy),
    };
}
export class LaunchTemplatePlacementOutputReference 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._affinity !== undefined) {
            hasAnyValues = true;
            internalValueResult.affinity = this._affinity;
        }
        if (this._availabilityZone !== undefined) {
            hasAnyValues = true;
            internalValueResult.availabilityZone = this._availabilityZone;
        }
        if (this._groupName !== undefined) {
            hasAnyValues = true;
            internalValueResult.groupName = this._groupName;
        }
        if (this._hostId !== undefined) {
            hasAnyValues = true;
            internalValueResult.hostId = this._hostId;
        }
        if (this._hostResourceGroupArn !== undefined) {
            hasAnyValues = true;
            internalValueResult.hostResourceGroupArn = this._hostResourceGroupArn;
        }
        if (this._partitionNumber !== undefined) {
            hasAnyValues = true;
            internalValueResult.partitionNumber = this._partitionNumber;
        }
        if (this._spreadDomain !== undefined) {
            hasAnyValues = true;
            internalValueResult.spreadDomain = this._spreadDomain;
        }
        if (this._tenancy !== undefined) {
            hasAnyValues = true;
            internalValueResult.tenancy = this._tenancy;
        }
        return hasAnyValues ? internalValueResult : undefined;
    }
    set internalValue(value) {
        if (value === undefined) {
            this.isEmptyObject = false;
            this._affinity = undefined;
            this._availabilityZone = undefined;
            this._groupName = undefined;
            this._hostId = undefined;
            this._hostResourceGroupArn = undefined;
            this._partitionNumber = undefined;
            this._spreadDomain = undefined;
            this._tenancy = undefined;
        }
        else {
            this.isEmptyObject = Object.keys(value).length === 0;
            this._affinity = value.affinity;
            this._availabilityZone = value.availabilityZone;
            this._groupName = value.groupName;
            this._hostId = value.hostId;
            this._hostResourceGroupArn = value.hostResourceGroupArn;
            this._partitionNumber = value.partitionNumber;
            this._spreadDomain = value.spreadDomain;
            this._tenancy = value.tenancy;
        }
    }
    // affinity - computed: false, optional: true, required: false
    _affinity;
    get affinity() {
        return this.getStringAttribute('affinity');
    }
    set affinity(value) {
        this._affinity = value;
    }
    resetAffinity() {
        this._affinity = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get affinityInput() {
        return this._affinity;
    }
    // availability_zone - computed: false, optional: true, required: false
    _availabilityZone;
    get availabilityZone() {
        return this.getStringAttribute('availability_zone');
    }
    set availabilityZone(value) {
        this._availabilityZone = value;
    }
    resetAvailabilityZone() {
        this._availabilityZone = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get availabilityZoneInput() {
        return this._availabilityZone;
    }
    // group_name - computed: false, optional: true, required: false
    _groupName;
    get groupName() {
        return this.getStringAttribute('group_name');
    }
    set groupName(value) {
        this._groupName = value;
    }
    resetGroupName() {
        this._groupName = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get groupNameInput() {
        return this._groupName;
    }
    // host_id - computed: false, optional: true, required: false
    _hostId;
    get hostId() {
        return this.getStringAttribute('host_id');
    }
    set hostId(value) {
        this._hostId = value;
    }
    resetHostId() {
        this._hostId = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get hostIdInput() {
        return this._hostId;
    }
    // host_resource_group_arn - computed: false, optional: true, required: false
    _hostResourceGroupArn;
    get hostResourceGroupArn() {
        return this.getStringAttribute('host_resource_group_arn');
    }
    set hostResourceGroupArn(value) {
        this._hostResourceGroupArn = value;
    }
    resetHostResourceGroupArn() {
        this._hostResourceGroupArn = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get hostResourceGroupArnInput() {
        return this._hostResourceGroupArn;
    }
    // partition_number - computed: false, optional: true, required: false
    _partitionNumber;
    get partitionNumber() {
        return this.getNumberAttribute('partition_number');
    }
    set partitionNumber(value) {
        this._partitionNumber = value;
    }
    resetPartitionNumber() {
        this._partitionNumber = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get partitionNumberInput() {
        return this._partitionNumber;
    }
    // spread_domain - computed: false, optional: true, required: false
    _spreadDomain;
    get spreadDomain() {
        return this.getStringAttribute('spread_domain');
    }
    set spreadDomain(value) {
        this._spreadDomain = value;
    }
    resetSpreadDomain() {
        this._spreadDomain = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get spreadDomainInput() {
        return this._spreadDomain;
    }
    // tenancy - computed: false, optional: true, required: false
    _tenancy;
    get tenancy() {
        return this.getStringAttribute('tenancy');
    }
    set tenancy(value) {
        this._tenancy = value;
    }
    resetTenancy() {
        this._tenancy = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get tenancyInput() {
        return this._tenancy;
    }
}
export function launchTemplateTagSpecificationsToTerraform(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 {
        resource_type: cdktf.stringToTerraform(struct.resourceType),
        tags: cdktf.hashMapper(cdktf.stringToTerraform)(struct.tags),
    };
}
/**
* Represents a {@link https://www.terraform.io/docs/providers/aws/r/launch_template aws_launch_template}
*/
export class LaunchTemplate extends cdktf.TerraformResource {
    // =================
    // STATIC PROPERTIES
    // =================
    static tfResourceType = "aws_launch_template";
    // ===========
    // INITIALIZER
    // ===========
    /**
    * Create a new {@link https://www.terraform.io/docs/providers/aws/r/launch_template aws_launch_template} 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 LaunchTemplateConfig = {}
    */
    constructor(scope, id, config = {}) {
        super(scope, id, {
            terraformResourceType: 'aws_launch_template',
            terraformGeneratorMetadata: {
                providerName: 'aws'
            },
            provider: config.provider,
            dependsOn: config.dependsOn,
            count: config.count,
            lifecycle: config.lifecycle
        });
        this._defaultVersion = config.defaultVersion;
        this._description = config.description;
        this._disableApiTermination = config.disableApiTermination;
        this._ebsOptimized = config.ebsOptimized;
        this._imageId = config.imageId;
        this._instanceInitiatedShutdownBehavior = config.instanceInitiatedShutdownBehavior;
        this._instanceType = config.instanceType;
        this._kernelId = config.kernelId;
        this._keyName = config.keyName;
        this._name = config.name;
        this._namePrefix = config.namePrefix;
        this._ramDiskId = config.ramDiskId;
        this._securityGroupNames = config.securityGroupNames;
        this._tags = config.tags;
        this._tagsAll = config.tagsAll;
        this._updateDefaultVersion = config.updateDefaultVersion;
        this._userData = config.userData;
        this._vpcSecurityGroupIds = config.vpcSecurityGroupIds;
        this._blockDeviceMappings = config.blockDeviceMappings;
        this._capacityReservationSpecification.internalValue = config.capacityReservationSpecification;
        this._cpuOptions.internalValue = config.cpuOptions;
        this._creditSpecification.internalValue = config.creditSpecification;
        this._elasticGpuSpecifications = config.elasticGpuSpecifications;
        this._elasticInferenceAccelerator.internalValue = config.elasticInferenceAccelerator;
        this._enclaveOptions.internalValue = config.enclaveOptions;
        this._hibernationOptions.internalValue = config.hibernationOptions;
        this._iamInstanceProfile.internalValue = config.iamInstanceProfile;
        this._instanceMarketOptions.internalValue = config.instanceMarketOptions;
        this._licenseSpecification = config.licenseSpecification;
        this._metadataOptions.internalValue = config.metadataOptions;
        this._monitoring.internalValue = config.monitoring;
        this._networkInterfaces = config.networkInterfaces;
        this._placement.internalValue = config.placement;
        this._tagSpecifications = config.tagSpecifications;
    }
    // ==========
    // ATTRIBUTES
    // ==========
    // arn - computed: true, optional: false, required: false
    get arn() {
        return this.getStringAttribute('arn');
    }
    // default_version - computed: true, optional: true, required: false
    _defaultVersion;
    get defaultVersion() {
        return this.getNumberAttribute('default_version');
    }
    set defaultVersion(value) {
        this._defaultVersion = value;
    }
    resetDefaultVersion() {
        this._defaultVersion = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get defaultVersionInput() {
        return this._defaultVersion;
    }
    // description - computed: false, 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;
    }
    // disable_api_termination - computed: false, optional: true, required: false
    _disableApiTermination;
    get disableApiTermination() {
        return this.getBooleanAttribute('disable_api_termination');
    }
    set disableApiTermination(value) {
        this._disableApiTermination = value;
    }
    resetDisableApiTermination() {
        this._disableApiTermination = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get disableApiTerminationInput() {
        return this._disableApiTermination;
    }
    // ebs_optimized - computed: false, optional: true, required: false
    _ebsOptimized;
    get ebsOptimized() {
        return this.getStringAttribute('ebs_optimized');
    }
    set ebsOptimized(value) {
        this._ebsOptimized = value;
    }
    resetEbsOptimized() {
        this._ebsOptimized = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get ebsOptimizedInput() {
        return this._ebsOptimized;
    }
    // id - computed: true, optional: true, required: false
    get id() {
        return this.getStringAttribute('id');
    }
    // image_id - computed: false, optional: true, required: false
    _imageId;
    get imageId() {
        return this.getStringAttribute('image_id');
    }
    set imageId(value) {
        this._imageId = value;
    }
    resetImageId() {
        this._imageId = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get imageIdInput() {
        return this._imageId;
    }
    // instance_initiated_shutdown_behavior - computed: false, optional: true, required: false
    _instanceInitiatedShutdownBehavior;
    get instanceInitiatedShutdownBehavior() {
        return this.getStringAttribute('instance_initiated_shutdown_behavior');
    }
    set instanceInitiatedShutdownBehavior(value) {
        this._instanceInitiatedShutdownBehavior = value;
    }
    resetInstanceInitiatedShutdownBehavior() {
        this._instanceInitiatedShutdownBehavior = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get instanceInitiatedShutdownBehaviorInput() {
        return this._instanceInitiatedShutdownBehavior;
    }
    // instance_type - computed: false, optional: true, required: false
    _instanceType;
    get instanceType() {
        return this.getStringAttribute('instance_type');
    }
    set instanceType(value) {
        this._instanceType = value;
    }
    resetInstanceType() {
        this._instanceType = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get instanceTypeInput() {
        return this._instanceType;
    }
    // kernel_id - computed: false, optional: true, required: false
    _kernelId;
    get kernelId() {
        return this.getStringAttribute('kernel_id');
    }
    set kernelId(value) {
        this._kernelId = value;
    }
    resetKernelId() {
        this._kernelId = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get kernelIdInput() {
        return this._kernelId;
    }
    // key_name - computed: false, optional: true, required: false
    _keyName;
    get keyName() {
        return this.getStringAttribute('key_name');
    }
    set keyName(value) {
        this._keyName = value;
    }
    resetKeyName() {
        this._keyName = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get keyNameInput() {
        return this._keyName;
    }
    // latest_version - computed: true, optional: false, required: false
    get latestVersion() {
        return this.getNumberAttribute('latest_version');
    }
    // name - computed: true, optional: true, required: false
    _name;
    get name() {
        return this.getStringAttribute('name');
    }
    set name(value) {
        this._name = value;
    }
    resetName() {
        this._name = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get nameInput() {
        return this._name;
    }
    // name_prefix - computed: true, optional: true, required: false
    _namePrefix;
    get namePrefix() {
        return this.getStringAttribute('name_prefix');
    }
    set namePrefix(value) {
        this._namePrefix = value;
    }
    resetNamePrefix() {
        this._namePrefix = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get namePrefixInput() {
        return this._namePrefix;
    }
    // ram_disk_id - computed: false, optional: true, required: false
    _ramDiskId;
    get ramDiskId() {
        return this.getStringAttribute('ram_disk_id');
    }
    set ramDiskId(value) {
        this._ramDiskId = value;
    }
    resetRamDiskId() {
        this._ramDiskId = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get ramDiskIdInput() {
        return this._ramDiskId;
    }
    // security_group_names - computed: false, 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;
    }
    // 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;
    }
    // update_default_version - computed: false, optional: true, required: false
    _updateDefaultVersion;
    get updateDefaultVersion() {
        return this.getBooleanAttribute('update_default_version');
    }
    set updateDefaultVersion(value) {
        this._updateDefaultVersion = value;
    }
    resetUpdateDefaultVersion() {
        this._updateDefaultVersion = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get updateDefaultVersionInput() {
        return this._updateDefaultVersion;
    }
    // user_data - computed: false, optional: true, required: false
    _userData;
    get userData() {
        return this.getStringAttribute('user_data');
    }
    set userData(value) {
        this._userData = value;
    }
    resetUserData() {
        this._userData = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get userDataInput() {
        return this._userData;
    }
    // vpc_security_group_ids - computed: false, optional: true, required: false
    _vpcSecurityGroupIds;
    get vpcSecurityGroupIds() {
        return cdktf.Fn.tolist(this.getListAttribute('vpc_security_group_ids'));
    }
    set vpcSecurityGroupIds(value) {
        this._vpcSecurityGroupIds = value;
    }
    resetVpcSecurityGroupIds() {
        this._vpcSecurityGroupIds = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get vpcSecurityGroupIdsInput() {
        return this._vpcSecurityGroupIds;
    }
    // block_device_mappings - computed: false, optional: true, required: false
    _blockDeviceMappings;
    get blockDeviceMappings() {
        // Getting the computed value is not yet implemented
        return this.interpolationForAttribute('block_device_mappings');
    }
    set blockDeviceMappings(value) {
        this._blockDeviceMappings = value;
    }
    resetBlockDeviceMappings() {
        this._blockDeviceMappings = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get blockDeviceMappingsInput() {
        return this._blockDeviceMappings;
    }
    // capacity_reservation_specification - computed: false, optional: true, required: false
    _capacityReservationSpecification = new LaunchTemplateCapacityReservationSpecificationOutputReference(this, "capacity_reservation_specification", true);
    get capacityReservationSpecification() {
        return this._capacityReservationSpecification;
    }
    putCapacityReservationSpecification(value) {
        this._capacityReservationSpecification.internalValue = value;
    }
    resetCapacityReservationSpecification() {
        this._capacityReservationSpecification.internalValue = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get capacityReservationSpecificationInput() {
        return this._capacityReservationSpecification.internalValue;
    }
    // cpu_options - computed: false, optional: true, required: false
    _cpuOptions = new LaunchTemplateCpuOptionsOutputReference(this, "cpu_options", true);
    get cpuOptions() {
        return this._cpuOptions;
    }
    putCpuOptions(value) {
        this._cpuOptions.internalValue = value;
    }
    resetCpuOptions() {
        this._cpuOptions.internalValue = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get cpuOptionsInput() {
        return this._cpuOptions.internalValue;
    }
    // credit_specification - computed: false, optional: true, required: false
    _creditSpecification = new LaunchTemplateCreditSpecificationOutputReference(this, "credit_specification", true);
    get creditSpecification() {
        return this._creditSpecification;
    }
    putCreditSpecification(value) {
        this._creditSpecification.internalValue = value;
    }
    resetCreditSpecification() {
        this._creditSpecification.internalValue = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get creditSpecificationInput() {
        return this._creditSpecification.internalValue;
    }
    // elastic_gpu_specifications - computed: false, optional: true, required: false
    _elasticGpuSpecifications;
    get elasticGpuSpecifications() {
        // Getting the computed value is not yet implemented
        return this.interpolationForAttribute('elastic_gpu_specifications');
    }
    set elasticGpuSpecifications(value) {
        this._elasticGpuSpecifications = value;
    }
    resetElasticGpuSpecifications() {
        this._elasticGpuSpecifications = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get elasticGpuSpecificationsInput() {
        return this._elasticGpuSpecifications;
    }
    // elastic_inference_accelerator - computed: false, optional: true, required: false
    _elasticInferenceAccelerator = new LaunchTemplateElasticInferenceAcceleratorOutputReference(this, "elastic_inference_accelerator", true);
    get elasticInferenceAccelerator() {
        return this._elasticInferenceAccelerator;
    }
    putElasticInferenceAccelerator(value) {
        this._elasticInferenceAccelerator.internalValue = value;
    }
    resetElasticInferenceAccelerator() {
        this._elasticInferenceAccelerator.internalValue = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get elasticInferenceAcceleratorInput() {
        return this._elasticInferenceAccelerator.internalValue;
    }
    // enclave_options - computed: false, optional: true, required: false
    _enclaveOptions = new LaunchTemplateEnclaveOptionsOutputReference(this, "enclave_options", true);
    get enclaveOptions() {
        return this._enclaveOptions;
    }
    putEnclaveOptions(value) {
        this._enclaveOptions.internalValue = value;
    }
    resetEnclaveOptions() {
        this._enclaveOptions.internalValue = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get enclaveOptionsInput() {
        return this._enclaveOptions.internalValue;
    }
    // hibernation_options - computed: false, optional: true, required: false
    _hibernationOptions = new LaunchTemplateHibernationOptionsOutputReference(this, "hibernation_options", true);
    get hibernationOptions() {
        return this._hibernationOptions;
    }
    putHibernationOptions(value) {
        this._hibernationOptions.internalValue = value;
    }
    resetHibernationOptions() {
        this._hibernationOptions.internalValue = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get hibernationOptionsInput() {
        return this._hibernationOptions.internalValue;
    }
    // iam_instance_profile - computed: false, optional: true, required: false
    _iamInstanceProfile = new LaunchTemplateIamInstanceProfileOutputReference(this, "iam_instance_profile", true);
    get iamInstanceProfile() {
        return this._iamInstanceProfile;
    }
    putIamInstanceProfile(value) {
        this._iamInstanceProfile.internalValue = value;
    }
    resetIamInstanceProfile() {
        this._iamInstanceProfile.internalValue = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get iamInstanceProfileInput() {
        return this._iamInstanceProfile.internalValue;
    }
    // instance_market_options - computed: false, optional: true, required: false
    _instanceMarketOptions = new LaunchTemplateInstanceMarketOptionsOutputReference(this, "instance_market_options", true);
    get instanceMarketOptions() {
        return this._instanceMarketOptions;
    }
    putInstanceMarketOptions(value) {
        this._instanceMarketOptions.internalValue = value;
    }
    resetInstanceMarketOptions() {
        this._instanceMarketOptions.internalValue = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get instanceMarketOptionsInput() {
        return this._instanceMarketOptions.internalValue;
    }
    // license_specification - computed: false, optional: true, required: false
    _licenseSpecification;
    get licenseSpecification() {
        // Getting the computed value is not yet implemented
        return cdktf.Token.asAny(cdktf.Fn.tolist(this.interpolationForAttribute('license_specification')));
    }
    set licenseSpecification(value) {
        this._licenseSpecification = value;
    }
    resetLicenseSpecification() {
        this._licenseSpecification = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get licenseSpecificationInput() {
        return this._licenseSpecification;
    }
    // metadata_options - computed: false, optional: true, required: false
    _metadataOptions = new LaunchTemplateMetadataOptionsOutputReference(this, "metadata_options", true);
    get metadataOptions() {
        return this._metadataOptions;
    }
    putMetadataOptions(value) {
        this._metadataOptions.internalValue = value;
    }
    resetMetadataOptions() {
        this._metadataOptions.internalValue = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get metadataOptionsInput() {
        return this._metadataOptions.internalValue;
    }
    // monitoring - computed: false, optional: true, required: false
    _monitoring = new LaunchTemplateMonitoringOutputReference(this, "monitoring", true);
    get monitoring() {
        return this._monitoring;
    }
    putMonitoring(value) {
        this._monitoring.internalValue = value;
    }
    resetMonitoring() {
        this._monitoring.internalValue = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get monitoringInput() {
        return this._monitoring.internalValue;
    }
    // network_interfaces - computed: false, optional: true, required: false
    _networkInterfaces;
    get networkInterfaces() {
        // Getting the computed value is not yet implemented
        return this.interpolationForAttribute('network_interfaces');
    }
    set networkInterfaces(value) {
        this._networkInterfaces = value;
    }
    resetNetworkInterfaces() {
        this._networkInterfaces = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get networkInterfacesInput() {
        return this._networkInterfaces;
    }
    // placement - computed: false, optional: true, required: false
    _placement = new LaunchTemplatePlacementOutputReference(this, "placement", true);
    get placement() {
        return this._placement;
    }
    putPlacement(value) {
        this._placement.internalValue = value;
    }
    resetPlacement() {
        this._placement.internalValue = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get placementInput() {
        return this._placement.internalValue;
    }
    // tag_specifications - computed: false, optional: true, required: false
    _tagSpecifications;
    get tagSpecifications() {
        // Getting the computed value is not yet implemented
        return this.interpolationForAttribute('tag_specifications');
    }
    set tagSpecifications(value) {
        this._tagSpecifications = value;
    }
    resetTagSpecifications() {
        this._tagSpecifications = undefined;
    }
    // Temporarily expose input value. Use with caution.
    get tagSpecificationsInput() {
        return this._tagSpecifications;
    }
    // =========
    // SYNTHESIS
    // =========
    synthesizeAttributes() {
        return {
            default_version: cdktf.numberToTerraform(this._defaultVersion),
            description: cdktf.stringToTerraform(this._description),
            disable_api_termination: cdktf.booleanToTerraform(this._disableApiTermination),
            ebs_optimized: cdktf.stringToTerraform(this._ebsOptimized),
            image_id: cdktf.stringToTerraform(this._imageId),
            instance_initiated_shutdown_behavior: cdktf.stringToTerraform(this._instanceInitiatedShutdownBehavior),
            instance_type: cdktf.stringToTerraform(this._instanceType),
            kernel_id: cdktf.stringToTerraform(this._kernelId),
            key_name: cdktf.stringToTerraform(this._keyName),
            name: cdktf.stringToTerraform(this._name),
            name_prefix: cdktf.stringToTerraform(this._namePrefix),
            ram_disk_id: cdktf.stringToTerraform(this._ramDiskId),
            security_group_names: cdktf.listMapper(cdktf.stringToTerraform)(this._securityGroupNames),
            tags: cdktf.hashMapper(cdktf.stringToTerraform)(this._tags),
            tags_all: cdktf.hashMapper(cdktf.stringToTerraform)(this._tagsAll),
            update_default_version: cdktf.booleanToTerraform(this._updateDefaultVersion),
            user_data: cdktf.stringToTerraform(this._userData),
            vpc_security_group_ids: cdktf.listMapper(cdktf.stringToTerraform)(this._vpcSecurityGroupIds),
            block_device_mappings: cdktf.listMapper(launchTemplateBlockDeviceMappingsToTerraform)(this._blockDeviceMappings),
            capacity_reservation_specification: launchTemplateCapacityReservationSpecificationToTerraform(this._capacityReservationSpecification.internalValue),
            cpu_options: launchTemplateCpuOptionsToTerraform(this._cpuOptions.internalValue),
            credit_specification: launchTemplateCreditSpecificationToTerraform(this._creditSpecification.internalValue),
            elastic_gpu_specifications: cdktf.listMapper(launchTemplateElasticGpuSpecificationsToTerraform)(this._elasticGpuSpecifications),
            elastic_inference_accelerator: launchTemplateElasticInferenceAcceleratorToTerraform(this._elasticInferenceAccelerator.internalValue),
            enclave_options: launchTemplateEnclaveOptionsToTerraform(this._enclaveOptions.internalValue),
            hibernation_options: launchTemplateHibernationOptionsToTerraform(this._hibernationOptions.internalValue),
            iam_instance_profile: launchTemplateIamInstanceProfileToTerraform(this._iamInstanceProfile.internalValue),
            instance_market_options: launchTemplateInstanceMarketOptionsToTerraform(this._instanceMarketOptions.internalValue),
            license_specification: cdktf.listMapper(launchTemplateLicenseSpecificationToTerraform)(this._licenseSpecification),
            metadata_options: launchTemplateMetadataOptionsToTerraform(this._metadataOptions.internalValue),
            monitoring: launchTemplateMonitoringToTerraform(this._monitoring.internalValue),
            network_interfaces: cdktf.listMapper(launchTemplateNetworkInterfacesToTerraform)(this._networkInterfaces),
            placement: launchTemplatePlacementToTerraform(this._placement.internalValue),
            tag_specifications: cdktf.listMapper(launchTemplateTagSpecificationsToTerraform)(this._tagSpecifications),
        };
    }
}
//# sourceMappingURL=launch-template.js.map