Rechercher des ressources

L'API Cloud Asset vous permet d'utiliser un langage de requête personnalisé pour interroger les métadonnées de ressource d'un projet, d'un dossier ou d'une organisation.

Avant de commencer

Rechercher des ressources

Console

Pour rechercher toutes les ressources, procédez comme suit :

  1. Accédez à la page Inventaire des éléments dans Cloud Console.
    Accéder à la page Inventaire des éléments

  2. Pour définir le champ d'application de votre recherche, ouvrez la liste des projets dans la barre de menu, puis sélectionnez l'organisation, le dossier ou le projet à interroger.

  3. Sélectionnez l'onglet Ressource.

  4. Pour rechercher des ressources, saisissez le texte de la requête dans la barre Filtre. Sélectionnez la zone de texte. Une liste de champs de recherche s'affiche. La recherche de ressources accepte plusieurs champs. En savoir plus sur la syntaxe des requêtes.

  5. Les résultats de recherche peuvent également être filtrés en fonction des filtres Type d'élément, Projet et Emplacement prédéfinis dans le volet Filtrer les résultats.

Les ressources correspondant à la requête sont répertoriées dans la table Résultats.

Pour afficher la requête en tant que commande de l'outil de ligne de commande gcloud, sélectionnez Afficher la requête.

Pour exporter les résultats, sélectionnez Télécharger au format CSV.

gcloud

Vous pouvez appeler SearchAllResources à l'aide de la commande gcloud asset search-all-resources. Vous devez exécuter le SDK Cloud version 302.0.0 ou ultérieure. Vous pouvez vérifier votre version à l'aide de la commande gcloud version.

gcloud asset search-all-resources \
  --scope=SCOPE \
  --query=QUERY \
  --asset-types=ASSET_TYPES,… \
  --order-by=ORDER_BY \
  --page-size=PAGE_SIZE \
  --read-mask=READ_MASK

Toutes les options suivantes sont facultatives :

  • (Facultatif) SCOPE : un champ d'application peut être un projet, un dossier ou une organisation. La recherche est limitée aux ressources Google Cloud comprises dans ce champ d'application. L'appelant doit disposer de l'autorisation cloudasset.assets.searchAllResources sur le champ d'application souhaité. Si elle n'est pas spécifiée, la propriété de projet configurée est utilisée. Pour trouver le projet configuré, exécutez la commande suivante : gcloud config get-value project. Pour modifier le paramètre, exécutez la commande suivante : gcloud config set project PROJECT_ID.

    Les valeurs autorisées sont les suivantes :

    • projects/PROJECT_ID (par exemple, "projects/foo-bar")
    • projects/PROJECT_NUMBER (par exemple, "projects/12345678")
    • folders/FOLDER_NUMBER (par exemple, "folders/1234567")
    • organizations/ORGANIZATION_NUMBER (par exemple, "organizations/123456")
  • (Facultatif) QUERY : l'instruction de requête. Pour en savoir plus, consultez la section Comment construire une requête. Si elle n'est pas spécifiée ou vide, elle recherche toutes les ressources dans l'élément scope spécifié.

    Par exemple :

    • name:Important pour trouver les ressources Google Cloud dont le nom contient le mot "Important".
    • name=Important pour trouver la ressource Google Cloud dont le nom est exactement "Important".
    • displayName:Impor* pour trouver les ressources Google Cloud dont le nom à afficher contient "Impor" en tant que préfixe d'un mot.
    • location:us-west* pour trouver les ressources Google Cloud dont l'emplacement comporte deux mots avec "us" et "west" comme préfixes.
    • labels:prod pour trouver des ressources Google Cloud qui possèdent une étiquette dont la clé ou la valeur contient le mot "prod".
    • labels.env:prod pour trouver les ressources Google Cloud qui possèdent une étiquette dont la clé est "env" et la valeur contient le mot "prod".
    • labels.env:* pour trouver les ressources Google Cloud qui possèdent une étiquette dont la clé est "env".
    • kmsKey:key pour trouver les ressources Google Cloud chiffrées avec une clé de chiffrement gérée par le client dont le nom contient "key" en tant que mot.
    • state:ACTIVE pour trouver les ressources Google Cloud dont l'état contient "ACTIVE" en tant que mot.
    • NOT state:ACTIVE pour trouver les ressources Google  Cloud dont l'état ne contient pas "ACTIVE" en tant que mot.
    • createTime<1609459200, createTime<2021-01-01 ou createTime<"2021-01-01T00:00:00" pour trouver les ressources Google  Cloud créées avant le "2021-01-01 00:00:00 UTC". 1609459200 est l'horodatage de l'époque en secondes de "2021-01-01 00:00:00 UTC".
    • updateTime>1609459200, updateTime>2021-01-01 ou updateTime>"2021-01-01T00:00:00" pour trouver les ressources Google  Cloud mises à jour après le "2021-01-01 00:00:00 UTC". 1609459200 est l'horodatage de l'époque en secondes de "2021-01-01 00:00:00 UTC".
    • project:12345 pour trouver les ressources Google Cloud appartenant à un projet Google Cloud portant le numéro 12345.
    • folders:(123 or 456) pour trouver les ressources Google Cloud appartenant à un dossier Google Cloud portant le numéro 123 ou 456.
    • organization:123 pour trouver les ressources Google  Cloud appartenant à une organisation Google Cloud portant le numéro 123.
    • parentFullResourceName:ImportantName pour trouver les ressources Google Cloud dont le nom parent contient ImportantName.
    • parentAssetType:Project pour trouver les ressources Google Cloud dont le type d'élément parent contient Project.
    • Important pour trouver les ressources Google Cloud contenant le mot "Important" dans n'importe quel champ inclus dans l'index de recherche.
    • Impor* pour trouver les ressources Google Cloud qui contiennent "Impor" en tant que préfixe de mot dans l'un des champs pouvant faire l'objet d'une recherche.
    • Important location:(us-west1 OR global) pour trouver les ressources Google Cloud contenant le mot "Important" dans tous les champs pouvant faire l'objet d'une recherche et qui sont également situées dans la région "us-west1" ou dans l'emplacement "global".
  • (Facultatif) ASSET_TYPES : liste des types d'éléments recherchés par cette requête. Si elle est vide, la recherche porte sur tous les types d'éléments pouvant faire l'objet d'une recherche. Les expressions régulières sont également acceptées. Exemple :

    • "compute.googleapis.com.*" crée un instantané des ressources dont le type d'élément commence par "compute.googleapis.com".
    • ".*Instance" crée un instantané des ressources dont le type d'élément se termine par "Instance".
    • ".*Instance.*" crée un instantané des ressources dont le type d'élément contient "Instance".

    Consultez la section RE2 pour connaître la syntaxe d'expression régulière acceptée. Si l'expression régulière ne correspond à aucun type d'élément compatible, une erreur INVALID_ARGUMENT est renvoyée.

  • (Facultatif) ORDER_BY : une liste de champs séparés par une virgule indiquant l'ordre de tri des résultats. L'ordre par défaut est croissant. Ajoutez " DESC" après le nom du champ pour indiquer l'ordre décroissant. Les espaces vides sont ignorés. Exemple : "location DESC, name". Seuls les champs primitifs singuliers de la réponse peuvent être triés :

    • name
    • assetType
    • project
    • displayName
    • description
    • location
    • kmsKey
    • createTime
    • updateTime
    • state
    • parentFullResourceName
    • parentAssetType

    Tous les autres champs, tels que les champs répétés (par exemple, networkTags), les champs de mappage (par exemple, labels) et les champs de structure (par exemple, additionalAttributes) ne sont pas acceptés.

  • (Facultatif) PAGE_SIZE : taille de la page pour la pagination des résultats de recherche. Le maximum est de 500. Si la valeur est définie sur 0, une valeur par défaut appropriée sera sélectionnée.

  • (Facultatif) READ_MASK : liste de champs séparés par une virgule indiquant les champs à renvoyer dans les résultats. Si ce paramètre n'est pas spécifié, tous les champs, à l'exception de versionedResources, sont renvoyés. Si seul "*" est spécifié, tous les champs sont renvoyés. Exemples : "name,location", "name,versionedResources", "*".

Voici des exemples de commandes gcloud :

  • Trouve toutes les ressources dans "organizations/123456", dont name contient le mot mycompany :

    gcloud asset search-all-resources \
      --scope='organizations/123456' \
      --query='name:mycompany'
    
  • Trouve toutes les ressources dans "organizations/123456", dont name contient le mot mycompany, avec les métadonnées complètes incluses :

    gcloud asset search-all-resources \
      --scope='organizations/123456' \
      --query='name:mycompany' \
      --read-mask='*'
    

api

Vous pouvez appeler SearchAllResources à l'aide d'un jeton OAuth valide pour un projet. Pour appeler la méthode SearchAllResources à partir de Cloud Shell ou de toute console où la commande gcloud est disponible, procédez comme suit :

  1. Si vous n'avez pas configuré l'écran d'autorisation OAuth de votre projet, cette étape est obligatoire. Vous devez fournir une adresse e-mail et un nom de produit pour l'écran d'autorisation OAuth.

    1. Accédez à l'écran d'autorisation OAuth de votre projet.
      Configurer l'écran d'autorisation
    2. Saisissez le nom de l'application que vous souhaitez afficher.
    3. Sous Adresse e-mail d'assistance, sélectionnez l'adresse e-mail que vous souhaitez afficher en tant que contact public. Elle doit correspondre à votre adresse e-mail ou à un groupe Google dont vous êtes le propriétaire.
    4. Ajoutez des détails, si nécessaire.
    5. Cliquez sur Enregistrer.
  2. Créez un jeton OAuth pour votre projet. Pour en savoir plus, consultez la page Configurer OAuth 2.0.

    1. Accédez à la page "Créer un ID client OAuth".
      Créer le client OAuth
    2. Sélectionnez le Type d'application en choisissant Application de bureau.
    3. Cliquez sur Créer.
  3. Téléchargez le fichier client_secret.json.

    1. Accédez à la page Identifiants.
    2. À droite de votre nouvel ID client, cliquez sur Télécharger au format JSON.
    3. Stockez le fichier de manière sécurisée dans un emplacement auquel seule votre application peut accéder.
  4. Connectez-vous à l'aide du fichier JSON avec la commande suivante.

    gcloud auth application-default login --client-id-file=YOUR_JSON_FILE
    

    Notez que cette commande vous invite à ouvrir un lien. Assurez-vous que la page affiche le Nom de l'application que vous avez défini dans l'écran d'autorisation OAuth.

  5. Générez un jeton d'authentification pour votre compte à l'aide de la commande suivante :

    TOKEN=$(gcloud auth application-default print-access-token)
    
  6. Vous pouvez maintenant interroger des ressources à l'aide des commandes curl.

    PAGE_SIZE=PAGE_SIZE
    PAGE_TOKEN="PAGE_TOKEN"
    SCOPE="SCOPE"
    QUERY="QUERY"
    ASSET_TYPES="ASSET_TYPES,…"
    ORDER_BY="ORDER_BY"
    READ_MASK="READ_MASK"
    curl -s -G \
       -H "Authorization: Bearer $TOKEN" \
       -d "page_size=$PAGE_SIZE" \
       -d "page_token=$PAGE_TOKEN" \
       -d "scope=$SCOPE" \
       -d "asset_types=$ASSET_TYPES" \
       -d "order_by=$ORDER_BY" \
       -d "read_mask=$READ_MASK" \
       --data-urlencode "query=$QUERY" \
       "https://cloudasset.googleapis.com/v1/$SCOPE:searchAllResources"
    

Toutes les options suivantes sont facultatives :

  • SCOPE : est requis. Un champ d'application peut correspondre à un projet, un dossier ou une organisation. La recherche est limitée aux ressources Google Cloud comprises dans ce champ d'application. L'appelant doit disposer de l'autorisation cloudasset.assets.searchAllResources sur le champ d'application souhaité.

    Les valeurs autorisées sont les suivantes :

    • projects/PROJECT_ID (par exemple, "projects/foo-bar")
    • projects/PROJECT_NUMBER (par exemple, "projects/12345678")
    • folders/FOLDER_NUMBER (par exemple, "folders/1234567")
    • organizations/ORGANIZATION_NUMBER (par exemple, "organizations/123456")
  • (Facultatif) QUERY : l'instruction de requête. Pour en savoir plus, consultez la section Comment construire une requête. Si elle n'est pas spécifiée ou vide, elle recherche toutes les ressources dans l'élément scope spécifié.

    Par exemple :

    • name:Important pour trouver les ressources Google Cloud dont le nom contient le mot "Important".
    • name=Important pour trouver la ressource Google Cloud dont le nom est exactement "Important".
    • displayName:Impor* pour trouver les ressources Google Cloud dont le nom à afficher contient "Impor" en tant que préfixe d'un mot.
    • location:us-west* pour trouver les ressources Google Cloud dont l'emplacement contient les préfixes "us" et "west".
    • labels:prod pour trouver des ressources Google Cloud qui possèdent une étiquette dont la clé ou la valeur contient le mot "prod".
    • labels.env:prod pour trouver les ressources Google Cloud qui possèdent une étiquette dont la clé est "env" et la valeur contient le mot "prod".
    • labels.env:* pour trouver les ressources Google Cloud qui possèdent une étiquette dont la clé est "env".
    • kmsKey:key pour trouver les ressources Google Cloud chiffrées avec une clé de chiffrement gérée par le client dont le nom contient "key" en tant que mot.
    • state:ACTIVE pour trouver les ressources Google Cloud dont l'état contient "ACTIVE" en tant que mot.
    • NOT state:ACTIVE pour trouver les ressources Google  Cloud dont l'état ne contient pas "ACTIVE" en tant que mot.
    • createTime<1609459200, createTime<2021-01-01 ou createTime<"2021-01-01T00:00:00" pour trouver les ressources Google  Cloud créées avant le "2021-01-01 00:00:00 UTC". 1609459200 est l'horodatage de l'époque en secondes de "2021-01-01 00:00:00 UTC".
    • updateTime>1609459200, updateTime>2021-01-01 ou updateTime>"2021-01-01T00:00:00" pour trouver les ressources Google  Cloud mises à jour après le "2021-01-01 00:00:00 UTC". 1609459200 est l'horodatage de l'époque en secondes de "2021-01-01 00:00:00 UTC".
    • project:12345 pour trouver les ressources Google Cloud appartenant à un projet Google Cloud portant le numéro 12345.
    • folders:(123 or 456) pour trouver les ressources Google Cloud appartenant à un dossier Google Cloud portant le numéro 123 ou 456.
    • organization:123 pour trouver les ressources Google  Cloud appartenant à une organisation Google Cloud portant le numéro 123.
    • parentFullResourceName:ImportantName pour trouver les ressources Google Cloud dont le nom de parent contient ImportantName.
    • parentAssetType:Project pour trouver les ressources Google Cloud dont le type d'élément parent contient Project.
    • Important pour trouver les ressources Google Cloud contenant le mot "Important" dans n'importe quel champ inclus dans l'index de recherche.
    • Impor* pour trouver les ressources Google Cloud qui contiennent "Impor" en tant que préfixe de mot dans l'un des champs pouvant faire l'objet d'une recherche.
    • Important location:(us-west1 OR global) pour trouver les ressources Google Cloud contenant le mot "Important" dans tous les champs pouvant faire l'objet d'une recherche et qui sont également situées dans la région "us-west1" ou dans l'emplacement "global".
  • (Facultatif) ASSET_TYPES : liste des types d'éléments recherchés par cette requête. Si elle est vide, la recherche porte sur tous les types d'éléments pouvant faire l'objet d'une recherche. Les expressions régulières sont également acceptées. Exemple :

    • "compute.googleapis.com.*" crée un instantané des ressources dont le type d'élément commence par "compute.googleapis.com".
    • ".*Instance" crée un instantané des ressources dont le type d'élément se termine par "Instance".
    • ".*Instance.*" crée un instantané des ressources dont le type d'élément contient "Instance".

    Consultez la section RE2 pour connaître la syntaxe d'expression régulière acceptée. Si l'expression régulière ne correspond à aucun type d'élément compatible, une erreur INVALID_ARGUMENT est renvoyée.

  • (Facultatif) ORDER_BY : une liste de champs séparés par une virgule indiquant l'ordre de tri des résultats. L'ordre par défaut est croissant. Ajoutez " DESC" après le nom du champ pour indiquer l'ordre décroissant. Les espaces vides sont ignorés. Exemple : "location DESC, name". Seuls les champs primitifs singuliers de la réponse peuvent être triés :

    • name
    • assetType
    • project
    • displayName
    • description
    • location
    • kmsKey
    • createTime
    • updateTime
    • state
    • parentFullResourceName
    • parentAssetType

    Tous les autres champs, tels que les champs répétés (par exemple, networkTags), les champs de mappage (par exemple, labels) et les champs de structure (par exemple, additionalAttributes) ne sont pas acceptés.

  • (Facultatif) PAGE_SIZE : taille de la page pour la pagination des résultats de recherche. Le maximum est de 500. Si la valeur est définie sur 0, une valeur par défaut appropriée sera sélectionnée.

  • (Facultatif) PAGE_TOKEN : jeton représentant le prochain lot de résultats de l'appel précédent à cette méthode. page_token doit être identique à la valeur de next_page_token de la réponse de l'appel précédent.

  • (Facultatif) READ_MASK : liste de champs séparés par une virgule indiquant les champs à renvoyer dans les résultats. Si ce paramètre n'est pas spécifié, tous les champs, à l'exception de versionedResources, sont renvoyés. Si seul "*" est spécifié, tous les champs sont renvoyés. Exemples : "name,location", "name,versionedResources", "*".

Documentation de référence sur la bibliothèque cliente et l'API

Comment construire une requête

Pour en savoir plus sur le langage de requête, consultez la section Syntaxe des requêtes.

Consultez la section Rechercher des exemples de ressources pour en savoir plus sur les exemples de requêtes pour divers cas d'utilisation réels.

Interroger les ressources Google Cloud par champs de métadonnées de ressource

Pour rechercher des métadonnées de ressource, une expression de requête est au format suivant :

  • Correspondance exacte de texte : FIELD=QUERY
  • Correspondance partielle de texte : FIELD:QUERY
  • Correspondance numérique : opérateurs de comparaison (=, >, >=, <, <=) FIELDcomparison operatorQUERY

Une métadonnée de ressource pouvant faire l'objet d'une recherche FIELD peut être :

  • name : le nom de ressource complet de la ressource. Remarque : tous les types d'éléments ne peuvent pas faire l'objet d'une recherche. Consultez la liste des types pouvant faire l'objet d'une recherche.
  • displayName : le nom à afficher dans l'interface utilisateur
  • description : la description textuelle de la ressource dans un ou plusieurs paragraphes
  • location : l'emplacement de la ressource. L'emplacement peut être "global", régional (par exemple, "us-east1") ou zonal (par exemple, "us-west1-b").
  • labels : libellés associés à cette ressource. Les libellés peuvent correspondre aux clés de libellé, aux valeurs de libellé ou aux deux. Consultez la section Ajouter des libellés et regrouper des ressources GCP.

  • labels.[key] : valeur de libellé identifiée par la clé de libellé associée à cette ressource. Par exemple : "labels.env:prod". Seuls les traits d'union (-), les traits de soulignement (_), les minuscules et les chiffres sont autorisés dans les clés des libellés. Les clés doivent commencer par une lettre minuscule. Les caractères internationaux sont acceptés. Consultez la section Exigences concernant les libellés.

  • networkTags : tags réseau associés à cette ressource. Consultez la section Ajouter des libellés et regrouper des ressources GCP.

  • kmsKey : clé de chiffrement gérée par le client, utilisée pour chiffrer cette ressource. Consultez CryptoKey et CryptoKeyVersion.

  • state : valeur textuelle de l'état de la ressource concernée. Les différents types de ressources ont des définitions d'état mappées à partir de différents champs de types de ressources différents. Exemple : Si la ressource est une instance fournie par Compute Engine, son état inclut PROVISIONING, STAGING, RUNNING, STOPPING, SUSPENDING, SUSPENDED, REPAIRING et TERMINATED. Consultez la définition de status dans la documentation de référence de l'API. Si la ressource est un projet fourni par Cloud Resource Manager, son état inclut LIFECYCLE_STATE_UNSPECIFIED, ACTIVE, DELETE_REQUESTED et DELETE_IN_PROGRESS. Consultez la définition de lifecycleState dans la documentation de référence de l'API.

  • createTime : horodatage de création de cette ressource, à laquelle la ressource a été créée. La précision est exprimée en secondes.

  • updateTime: dernier horodatage de mise à jour de cette ressource, date de la dernière modification ou suppression de la ressource. La précision est exprimée en secondes.

  • project : numéro du projet auquel appartient cette ressource.

  • folders : numéros des dossiers auxquels cette ressource appartient.

  • organization : numéro de l'organisation à laquelle appartient cette ressource.

  • parentFullResourceName : nom du parent de cette ressource.

  • parentAssetType : type du parent de cette ressource.

Exemples : requête par champ spécifique

  • Recherchez toutes les ressources dans votre scope dont le name contient le mot Important :

    name:Important
    
  • Trouve toutes les ressources dans votre scope dont le displayName contient un mot avec le préfixe prod :

    displayName:prod*
    
  • Recherchez toutes les ressources dans votre scope dont le location contient le mot us :

    location:us
    
  • Recherchez toutes les ressources dans votre scope dont le champ location contient exactement us :

    location=us
    
  • Recherchez toutes les ressources de votre scope qui ont un label où la clé ou la valeur contient le mot prod :

    labels:prod
    
  • Recherchez toutes les ressources de votre scope qui ont un label où la clé est env et la valeur contient le mot prod :

    labels.env:prod
    
  • Recherchez toutes les ressources dans votre fichier scope ayant un label dont la clé est env et la valeur exactement égale à prod :

    labels.env=prod
    
  • Recherchez toutes les ressources dans votre scope qui ont un label où la clé est env :

    labels.env:*
    
  • Rechercher toutes les ressources dans votre scope dont l'un des networkTags contient le motinternal :

    networkTags:internal
    
  • Recherchez dans votre fichier scope toutes les ressources dont l'une des ressources networkTags correspond exactement à internal :

    networkTags=internal
    
  • Trouve toutes les ressources de votre scope chiffrées avec une clé de chiffrement gérée par le client dont le nom contient key :

    kmsKey:key
    
  • Recherchez toutes les ressources dans votre scope dont le state contient ACTIVE :

    state:ACTIVE
    
  • Recherchez toutes les ressources dans votre scope dont le state ne contient pas ACTIVE :

    NOT state:ACTIVE
    
  • Trouve toutes les ressources dans votre scope qui ont été créées avant le "2021-01-01 00:00:00 UTC" (1609459200 est l'horodatage de l'époque en secondes de "2021-01-01 00:00:00 UTC") :

    createTime<1609459200
    createTime<2021-01-01
    createTime<"2021-01-01T00:00:00"
    
  • Rechercher toutes les ressources dans votre fichier scope qui ont été mises à jour après le "2021-01-01 00:00:00 UTC" (1609459200 est l'horodatage de l'époque en secondes de "2021-01-01 00:00:00 UTC") :

    updateTime>1609459200
    updateTime>2021-01-01
    updateTime>"2021-01-01T00:00:00"
    
  • Recherchez toutes les ressources dans votre scope dont le project contient le numéro 123 :

    project:123
    
  • Recherchez toutes les ressources dans votre scope contenu dans folder avec le numéro 123 :

    folders:123
    
  • Recherchez toutes les ressources dans votre scope dont le organization contient le numéro 123 :

    organization:123
    
  • Recherchez toutes les ressources dans votre scope dont le parentFullResourceName contient ImportantName :

    parentFullResourceName:ImportantName
    
  • Recherchez toutes les ressources dans votre scope dont le parentAssetType contient Project :

    parentAssetType:Project
    
  • Recherchez toutes les ressources dans votre scope dont le name contient le mot Important et description contient un mot avec le préfixe import :

    name:Important description:import*
    
  • Recherchez toutes les ressources dans votre scope dont le name contient le mot Important ou description contient un mot avec le préfixe import :

    name:Important OR description:import*
    

Interroger les ressources Google Cloud par texte libre

Vous pouvez aussi tout simplement utiliser une requête de texte libre sans spécifier de champ. Elle renvoie ensuite des ressources, tant qu'un des champs dans les métadonnées de la ressource correspond à la requête.

Exemples : requête par texte libre

  • Trouve toutes les ressources dans votre scope dont les champs de métadonnées (par exemple, name, displayName, description) contiennent le mot Important :

    Important
    
  • Trouve toutes les ressources dans votre scope dont les champs de métadonnées (par exemple, name, displayName, description) contiennent un mot comportant le préfixe import :

    import*
    
  • Trouve toutes les ressources dans votre scope dont les champs de métadonnées (par exemple, name, displayName, description) contiennent le mot Important et contiennent également un mot avec le préfixe prod :

    Important prod*