// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
// Code generated by Microsoft (R) AutoRest Code Generator.

package com.azure.resourcemanager.networkcloud.models;

import com.azure.core.management.Region;
import com.azure.core.management.SystemData;
import com.azure.core.util.Context;
import com.azure.resourcemanager.networkcloud.fluent.models.VirtualMachineInner;
import java.util.List;
import java.util.Map;

/** An immutable client-side representation of VirtualMachine. */
public interface VirtualMachine {
    /**
     * Gets the id property: Fully qualified resource Id for the resource.
     *
     * @return the id value.
     */
    String id();

    /**
     * Gets the name property: The name of the resource.
     *
     * @return the name value.
     */
    String name();

    /**
     * Gets the type property: The type of the resource.
     *
     * @return the type value.
     */
    String type();

    /**
     * Gets the location property: The geo-location where the resource lives.
     *
     * @return the location value.
     */
    String location();

    /**
     * Gets the tags property: Resource tags.
     *
     * @return the tags value.
     */
    Map<String, String> tags();

    /**
     * Gets the extendedLocation property: ExtendedLocation represents the Azure custom location where the resource will
     * be created.
     *
     * <p>The extended location of the cluster associated with the resource.
     *
     * @return the extendedLocation value.
     */
    ExtendedLocation extendedLocation();

    /**
     * Gets the systemData property: Azure Resource Manager metadata containing createdBy and modifiedBy information.
     *
     * @return the systemData value.
     */
    SystemData systemData();

    /**
     * Gets the adminUsername property: The name of the administrator to which the ssh public keys will be added into
     * the authorized keys.
     *
     * @return the adminUsername value.
     */
    String adminUsername();

    /**
     * Gets the availabilityZone property: The cluster availability zone containing this virtual machine.
     *
     * @return the availabilityZone value.
     */
    String availabilityZone();

    /**
     * Gets the bareMetalMachineId property: The resource ID of the bare metal machine the virtual machine has landed
     * to.
     *
     * @return the bareMetalMachineId value.
     */
    String bareMetalMachineId();

    /**
     * Gets the bootMethod property: Selects the boot method for the virtual machine.
     *
     * @return the bootMethod value.
     */
    VirtualMachineBootMethod bootMethod();

    /**
     * Gets the cloudServicesNetworkAttachment property: NetworkAttachment represents the single network attachment.
     *
     * <p>The cloud service network that provides platform-level services for the virtual machine.
     *
     * @return the cloudServicesNetworkAttachment value.
     */
    NetworkAttachment cloudServicesNetworkAttachment();

    /**
     * Gets the clusterId property: The resource ID of the cluster the virtual machine is created for.
     *
     * @return the clusterId value.
     */
    String clusterId();

    /**
     * Gets the cpuCores property: The number of CPU cores in the virtual machine.
     *
     * @return the cpuCores value.
     */
    long cpuCores();

    /**
     * Gets the detailedStatus property: The more detailed status of the virtual machine.
     *
     * @return the detailedStatus value.
     */
    VirtualMachineDetailedStatus detailedStatus();

    /**
     * Gets the detailedStatusMessage property: The descriptive message about the current detailed status.
     *
     * @return the detailedStatusMessage value.
     */
    String detailedStatusMessage();

    /**
     * Gets the isolateEmulatorThread property: Field Deprecated, the value will be ignored if provided. The indicator
     * of whether one of the specified CPU cores is isolated to run the emulator thread for this virtual machine.
     *
     * @return the isolateEmulatorThread value.
     */
    VirtualMachineIsolateEmulatorThread isolateEmulatorThread();

    /**
     * Gets the memorySizeGB property: The memory size of the virtual machine in GB.
     *
     * @return the memorySizeGB value.
     */
    long memorySizeGB();

    /**
     * Gets the networkAttachments property: The list of network attachments to the virtual machine.
     *
     * @return the networkAttachments value.
     */
    List<NetworkAttachment> networkAttachments();

    /**
     * Gets the networkData property: The Base64 encoded cloud-init network data.
     *
     * @return the networkData value.
     */
    String networkData();

    /**
     * Gets the placementHints property: The scheduling hints for the virtual machine.
     *
     * @return the placementHints value.
     */
    List<VirtualMachinePlacementHint> placementHints();

    /**
     * Gets the powerState property: The power state of the virtual machine.
     *
     * @return the powerState value.
     */
    VirtualMachinePowerState powerState();

    /**
     * Gets the provisioningState property: The provisioning state of the virtual machine.
     *
     * @return the provisioningState value.
     */
    VirtualMachineProvisioningState provisioningState();

    /**
     * Gets the sshPublicKeys property: The list of ssh public keys. Each key will be added to the virtual machine using
     * the cloud-init ssh_authorized_keys mechanism for the adminUsername.
     *
     * @return the sshPublicKeys value.
     */
    List<SshPublicKey> sshPublicKeys();

    /**
     * Gets the storageProfile property: StorageProfile represents information about a disk.
     *
     * <p>The storage profile that specifies size and other parameters about the disks related to the virtual machine.
     *
     * @return the storageProfile value.
     */
    StorageProfile storageProfile();

    /**
     * Gets the userData property: The Base64 encoded cloud-init user data.
     *
     * @return the userData value.
     */
    String userData();

    /**
     * Gets the virtioInterface property: Field Deprecated, use virtualizationModel instead. The type of the virtio
     * interface.
     *
     * @return the virtioInterface value.
     */
    VirtualMachineVirtioInterfaceType virtioInterface();

    /**
     * Gets the vmDeviceModel property: The type of the device model to use.
     *
     * @return the vmDeviceModel value.
     */
    VirtualMachineDeviceModelType vmDeviceModel();

    /**
     * Gets the vmImage property: The virtual machine image that is currently provisioned to the OS disk, using the full
     * url and tag notation used to pull the image.
     *
     * @return the vmImage value.
     */
    String vmImage();

    /**
     * Gets the vmImageRepositoryCredentials property: ImageRepositoryCredentials represents the credentials used to
     * login to the image repository.
     *
     * <p>The credentials used to login to the image repository that has access to the specified image.
     *
     * @return the vmImageRepositoryCredentials value.
     */
    ImageRepositoryCredentials vmImageRepositoryCredentials();

    /**
     * Gets the volumes property: The resource IDs of volumes that are attached to the virtual machine.
     *
     * @return the volumes value.
     */
    List<String> volumes();

    /**
     * Gets the region of the resource.
     *
     * @return the region of the resource.
     */
    Region region();

    /**
     * Gets the name of the resource region.
     *
     * @return the name of the resource region.
     */
    String regionName();

    /**
     * Gets the name of the resource group.
     *
     * @return the name of the resource group.
     */
    String resourceGroupName();

    /**
     * Gets the inner com.azure.resourcemanager.networkcloud.fluent.models.VirtualMachineInner object.
     *
     * @return the inner object.
     */
    VirtualMachineInner innerModel();

    /** The entirety of the VirtualMachine definition. */
    interface Definition
        extends DefinitionStages.Blank,
            DefinitionStages.WithLocation,
            DefinitionStages.WithResourceGroup,
            DefinitionStages.WithExtendedLocation,
            DefinitionStages.WithAdminUsername,
            DefinitionStages.WithCloudServicesNetworkAttachment,
            DefinitionStages.WithCpuCores,
            DefinitionStages.WithMemorySizeGB,
            DefinitionStages.WithStorageProfile,
            DefinitionStages.WithVmImage,
            DefinitionStages.WithCreate {
    }
    /** The VirtualMachine definition stages. */
    interface DefinitionStages {
        /** The first stage of the VirtualMachine definition. */
        interface Blank extends WithLocation {
        }
        /** The stage of the VirtualMachine definition allowing to specify location. */
        interface WithLocation {
            /**
             * Specifies the region for the resource.
             *
             * @param location The geo-location where the resource lives.
             * @return the next definition stage.
             */
            WithResourceGroup withRegion(Region location);

            /**
             * Specifies the region for the resource.
             *
             * @param location The geo-location where the resource lives.
             * @return the next definition stage.
             */
            WithResourceGroup withRegion(String location);
        }
        /** The stage of the VirtualMachine definition allowing to specify parent resource. */
        interface WithResourceGroup {
            /**
             * Specifies resourceGroupName.
             *
             * @param resourceGroupName The name of the resource group. The name is case insensitive.
             * @return the next definition stage.
             */
            WithExtendedLocation withExistingResourceGroup(String resourceGroupName);
        }
        /** The stage of the VirtualMachine definition allowing to specify extendedLocation. */
        interface WithExtendedLocation {
            /**
             * Specifies the extendedLocation property: ExtendedLocation represents the Azure custom location where the
             * resource will be created.
             *
             * <p>The extended location of the cluster associated with the resource..
             *
             * @param extendedLocation ExtendedLocation represents the Azure custom location where the resource will be
             *     created.
             *     <p>The extended location of the cluster associated with the resource.
             * @return the next definition stage.
             */
            WithAdminUsername withExtendedLocation(ExtendedLocation extendedLocation);
        }
        /** The stage of the VirtualMachine definition allowing to specify adminUsername. */
        interface WithAdminUsername {
            /**
             * Specifies the adminUsername property: The name of the administrator to which the ssh public keys will be
             * added into the authorized keys..
             *
             * @param adminUsername The name of the administrator to which the ssh public keys will be added into the
             *     authorized keys.
             * @return the next definition stage.
             */
            WithCloudServicesNetworkAttachment withAdminUsername(String adminUsername);
        }
        /** The stage of the VirtualMachine definition allowing to specify cloudServicesNetworkAttachment. */
        interface WithCloudServicesNetworkAttachment {
            /**
             * Specifies the cloudServicesNetworkAttachment property: NetworkAttachment represents the single network
             * attachment.
             *
             * <p>The cloud service network that provides platform-level services for the virtual machine..
             *
             * @param cloudServicesNetworkAttachment NetworkAttachment represents the single network attachment.
             *     <p>The cloud service network that provides platform-level services for the virtual machine.
             * @return the next definition stage.
             */
            WithCpuCores withCloudServicesNetworkAttachment(NetworkAttachment cloudServicesNetworkAttachment);
        }
        /** The stage of the VirtualMachine definition allowing to specify cpuCores. */
        interface WithCpuCores {
            /**
             * Specifies the cpuCores property: The number of CPU cores in the virtual machine..
             *
             * @param cpuCores The number of CPU cores in the virtual machine.
             * @return the next definition stage.
             */
            WithMemorySizeGB withCpuCores(long cpuCores);
        }
        /** The stage of the VirtualMachine definition allowing to specify memorySizeGB. */
        interface WithMemorySizeGB {
            /**
             * Specifies the memorySizeGB property: The memory size of the virtual machine in GB..
             *
             * @param memorySizeGB The memory size of the virtual machine in GB.
             * @return the next definition stage.
             */
            WithStorageProfile withMemorySizeGB(long memorySizeGB);
        }
        /** The stage of the VirtualMachine definition allowing to specify storageProfile. */
        interface WithStorageProfile {
            /**
             * Specifies the storageProfile property: StorageProfile represents information about a disk.
             *
             * <p>The storage profile that specifies size and other parameters about the disks related to the virtual
             * machine..
             *
             * @param storageProfile StorageProfile represents information about a disk.
             *     <p>The storage profile that specifies size and other parameters about the disks related to the
             *     virtual machine.
             * @return the next definition stage.
             */
            WithVmImage withStorageProfile(StorageProfile storageProfile);
        }
        /** The stage of the VirtualMachine definition allowing to specify vmImage. */
        interface WithVmImage {
            /**
             * Specifies the vmImage property: The virtual machine image that is currently provisioned to the OS disk,
             * using the full url and tag notation used to pull the image..
             *
             * @param vmImage The virtual machine image that is currently provisioned to the OS disk, using the full url
             *     and tag notation used to pull the image.
             * @return the next definition stage.
             */
            WithCreate withVmImage(String vmImage);
        }
        /**
         * The stage of the VirtualMachine definition which contains all the minimum required properties for the
         * resource to be created, but also allows for any other optional properties to be specified.
         */
        interface WithCreate
            extends DefinitionStages.WithTags,
                DefinitionStages.WithBootMethod,
                DefinitionStages.WithIsolateEmulatorThread,
                DefinitionStages.WithNetworkAttachments,
                DefinitionStages.WithNetworkData,
                DefinitionStages.WithPlacementHints,
                DefinitionStages.WithSshPublicKeys,
                DefinitionStages.WithUserData,
                DefinitionStages.WithVirtioInterface,
                DefinitionStages.WithVmDeviceModel,
                DefinitionStages.WithVmImageRepositoryCredentials {
            /**
             * Executes the create request.
             *
             * @return the created resource.
             */
            VirtualMachine create();

            /**
             * Executes the create request.
             *
             * @param context The context to associate with this operation.
             * @return the created resource.
             */
            VirtualMachine create(Context context);
        }
        /** The stage of the VirtualMachine definition allowing to specify tags. */
        interface WithTags {
            /**
             * Specifies the tags property: Resource tags..
             *
             * @param tags Resource tags.
             * @return the next definition stage.
             */
            WithCreate withTags(Map<String, String> tags);
        }
        /** The stage of the VirtualMachine definition allowing to specify bootMethod. */
        interface WithBootMethod {
            /**
             * Specifies the bootMethod property: Selects the boot method for the virtual machine..
             *
             * @param bootMethod Selects the boot method for the virtual machine.
             * @return the next definition stage.
             */
            WithCreate withBootMethod(VirtualMachineBootMethod bootMethod);
        }
        /** The stage of the VirtualMachine definition allowing to specify isolateEmulatorThread. */
        interface WithIsolateEmulatorThread {
            /**
             * Specifies the isolateEmulatorThread property: Field Deprecated, the value will be ignored if provided.
             * The indicator of whether one of the specified CPU cores is isolated to run the emulator thread for this
             * virtual machine..
             *
             * @param isolateEmulatorThread Field Deprecated, the value will be ignored if provided. The indicator of
             *     whether one of the specified CPU cores is isolated to run the emulator thread for this virtual
             *     machine.
             * @return the next definition stage.
             */
            WithCreate withIsolateEmulatorThread(VirtualMachineIsolateEmulatorThread isolateEmulatorThread);
        }
        /** The stage of the VirtualMachine definition allowing to specify networkAttachments. */
        interface WithNetworkAttachments {
            /**
             * Specifies the networkAttachments property: The list of network attachments to the virtual machine..
             *
             * @param networkAttachments The list of network attachments to the virtual machine.
             * @return the next definition stage.
             */
            WithCreate withNetworkAttachments(List<NetworkAttachment> networkAttachments);
        }
        /** The stage of the VirtualMachine definition allowing to specify networkData. */
        interface WithNetworkData {
            /**
             * Specifies the networkData property: The Base64 encoded cloud-init network data..
             *
             * @param networkData The Base64 encoded cloud-init network data.
             * @return the next definition stage.
             */
            WithCreate withNetworkData(String networkData);
        }
        /** The stage of the VirtualMachine definition allowing to specify placementHints. */
        interface WithPlacementHints {
            /**
             * Specifies the placementHints property: The scheduling hints for the virtual machine..
             *
             * @param placementHints The scheduling hints for the virtual machine.
             * @return the next definition stage.
             */
            WithCreate withPlacementHints(List<VirtualMachinePlacementHint> placementHints);
        }
        /** The stage of the VirtualMachine definition allowing to specify sshPublicKeys. */
        interface WithSshPublicKeys {
            /**
             * Specifies the sshPublicKeys property: The list of ssh public keys. Each key will be added to the virtual
             * machine using the cloud-init ssh_authorized_keys mechanism for the adminUsername..
             *
             * @param sshPublicKeys The list of ssh public keys. Each key will be added to the virtual machine using the
             *     cloud-init ssh_authorized_keys mechanism for the adminUsername.
             * @return the next definition stage.
             */
            WithCreate withSshPublicKeys(List<SshPublicKey> sshPublicKeys);
        }
        /** The stage of the VirtualMachine definition allowing to specify userData. */
        interface WithUserData {
            /**
             * Specifies the userData property: The Base64 encoded cloud-init user data..
             *
             * @param userData The Base64 encoded cloud-init user data.
             * @return the next definition stage.
             */
            WithCreate withUserData(String userData);
        }
        /** The stage of the VirtualMachine definition allowing to specify virtioInterface. */
        interface WithVirtioInterface {
            /**
             * Specifies the virtioInterface property: Field Deprecated, use virtualizationModel instead. The type of
             * the virtio interface..
             *
             * @param virtioInterface Field Deprecated, use virtualizationModel instead. The type of the virtio
             *     interface.
             * @return the next definition stage.
             */
            WithCreate withVirtioInterface(VirtualMachineVirtioInterfaceType virtioInterface);
        }
        /** The stage of the VirtualMachine definition allowing to specify vmDeviceModel. */
        interface WithVmDeviceModel {
            /**
             * Specifies the vmDeviceModel property: The type of the device model to use..
             *
             * @param vmDeviceModel The type of the device model to use.
             * @return the next definition stage.
             */
            WithCreate withVmDeviceModel(VirtualMachineDeviceModelType vmDeviceModel);
        }
        /** The stage of the VirtualMachine definition allowing to specify vmImageRepositoryCredentials. */
        interface WithVmImageRepositoryCredentials {
            /**
             * Specifies the vmImageRepositoryCredentials property: ImageRepositoryCredentials represents the
             * credentials used to login to the image repository.
             *
             * <p>The credentials used to login to the image repository that has access to the specified image..
             *
             * @param vmImageRepositoryCredentials ImageRepositoryCredentials represents the credentials used to login
             *     to the image repository.
             *     <p>The credentials used to login to the image repository that has access to the specified image.
             * @return the next definition stage.
             */
            WithCreate withVmImageRepositoryCredentials(ImageRepositoryCredentials vmImageRepositoryCredentials);
        }
    }
    /**
     * Begins update for the VirtualMachine resource.
     *
     * @return the stage of resource update.
     */
    VirtualMachine.Update update();

    /** The template for VirtualMachine update. */
    interface Update extends UpdateStages.WithTags, UpdateStages.WithVmImageRepositoryCredentials {
        /**
         * Executes the update request.
         *
         * @return the updated resource.
         */
        VirtualMachine apply();

        /**
         * Executes the update request.
         *
         * @param context The context to associate with this operation.
         * @return the updated resource.
         */
        VirtualMachine apply(Context context);
    }
    /** The VirtualMachine update stages. */
    interface UpdateStages {
        /** The stage of the VirtualMachine update allowing to specify tags. */
        interface WithTags {
            /**
             * Specifies the tags property: The Azure resource tags that will replace the existing ones..
             *
             * @param tags The Azure resource tags that will replace the existing ones.
             * @return the next definition stage.
             */
            Update withTags(Map<String, String> tags);
        }
        /** The stage of the VirtualMachine update allowing to specify vmImageRepositoryCredentials. */
        interface WithVmImageRepositoryCredentials {
            /**
             * Specifies the vmImageRepositoryCredentials property: ImageRepositoryCredentials represents the
             * credentials used to login to the image repository.
             *
             * <p>The credentials used to login to the image repository that has access to the specified image..
             *
             * @param vmImageRepositoryCredentials ImageRepositoryCredentials represents the credentials used to login
             *     to the image repository.
             *     <p>The credentials used to login to the image repository that has access to the specified image.
             * @return the next definition stage.
             */
            Update withVmImageRepositoryCredentials(ImageRepositoryCredentials vmImageRepositoryCredentials);
        }
    }
    /**
     * Refreshes the resource to sync with Azure.
     *
     * @return the refreshed resource.
     */
    VirtualMachine refresh();

    /**
     * Refreshes the resource to sync with Azure.
     *
     * @param context The context to associate with this operation.
     * @return the refreshed resource.
     */
    VirtualMachine refresh(Context context);

    /**
     * Attach volume to the virtual machine.
     *
     * <p>Attach volume to the provided virtual machine.
     *
     * @param virtualMachineAttachVolumeParameters The request body.
     * @throws IllegalArgumentException thrown if parameters fail the validation.
     * @throws com.azure.core.management.exception.ManagementException thrown if the request is rejected by server.
     * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent.
     */
    void attachVolume(VirtualMachineVolumeParameters virtualMachineAttachVolumeParameters);

    /**
     * Attach volume to the virtual machine.
     *
     * <p>Attach volume to the provided virtual machine.
     *
     * @param virtualMachineAttachVolumeParameters The request body.
     * @param context The context to associate with this operation.
     * @throws IllegalArgumentException thrown if parameters fail the validation.
     * @throws com.azure.core.management.exception.ManagementException thrown if the request is rejected by server.
     * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent.
     */
    void attachVolume(VirtualMachineVolumeParameters virtualMachineAttachVolumeParameters, Context context);

    /**
     * Detach volume from the virtual machine.
     *
     * <p>Detach volume from the provided virtual machine.
     *
     * @param virtualMachineDetachVolumeParameters The request body.
     * @throws IllegalArgumentException thrown if parameters fail the validation.
     * @throws com.azure.core.management.exception.ManagementException thrown if the request is rejected by server.
     * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent.
     */
    void detachVolume(VirtualMachineVolumeParameters virtualMachineDetachVolumeParameters);

    /**
     * Detach volume from the virtual machine.
     *
     * <p>Detach volume from the provided virtual machine.
     *
     * @param virtualMachineDetachVolumeParameters The request body.
     * @param context The context to associate with this operation.
     * @throws IllegalArgumentException thrown if parameters fail the validation.
     * @throws com.azure.core.management.exception.ManagementException thrown if the request is rejected by server.
     * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent.
     */
    void detachVolume(VirtualMachineVolumeParameters virtualMachineDetachVolumeParameters, Context context);

    /**
     * Power off the virtual machine.
     *
     * <p>Power off the provided virtual machine.
     *
     * @throws com.azure.core.management.exception.ManagementException thrown if the request is rejected by server.
     * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent.
     */
    void powerOff();

    /**
     * Power off the virtual machine.
     *
     * <p>Power off the provided virtual machine.
     *
     * @param virtualMachinePowerOffParameters The request body.
     * @param context The context to associate with this operation.
     * @throws IllegalArgumentException thrown if parameters fail the validation.
     * @throws com.azure.core.management.exception.ManagementException thrown if the request is rejected by server.
     * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent.
     */
    void powerOff(VirtualMachinePowerOffParameters virtualMachinePowerOffParameters, Context context);

    /**
     * Reimage the virtual machine.
     *
     * <p>Reimage the provided virtual machine.
     *
     * @throws com.azure.core.management.exception.ManagementException thrown if the request is rejected by server.
     * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent.
     */
    void reimage();

    /**
     * Reimage the virtual machine.
     *
     * <p>Reimage the provided virtual machine.
     *
     * @param context The context to associate with this operation.
     * @throws IllegalArgumentException thrown if parameters fail the validation.
     * @throws com.azure.core.management.exception.ManagementException thrown if the request is rejected by server.
     * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent.
     */
    void reimage(Context context);

    /**
     * Restart the virtual machine.
     *
     * <p>Restart the provided virtual machine.
     *
     * @throws com.azure.core.management.exception.ManagementException thrown if the request is rejected by server.
     * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent.
     */
    void restart();

    /**
     * Restart the virtual machine.
     *
     * <p>Restart the provided virtual machine.
     *
     * @param context The context to associate with this operation.
     * @throws IllegalArgumentException thrown if parameters fail the validation.
     * @throws com.azure.core.management.exception.ManagementException thrown if the request is rejected by server.
     * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent.
     */
    void restart(Context context);

    /**
     * Start the virtual machine.
     *
     * <p>Start the provided virtual machine.
     *
     * @throws com.azure.core.management.exception.ManagementException thrown if the request is rejected by server.
     * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent.
     */
    void start();

    /**
     * Start the virtual machine.
     *
     * <p>Start the provided virtual machine.
     *
     * @param context The context to associate with this operation.
     * @throws IllegalArgumentException thrown if parameters fail the validation.
     * @throws com.azure.core.management.exception.ManagementException thrown if the request is rejected by server.
     * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent.
     */
    void start(Context context);
}
