Tous les produits
Search
Centre de documentation

:SimpleQuery

Dernière mise à jour :Oct 09, 2026

Consulte et agrège les fichiers d'un jeu de données, et prend en charge les expressions logiques.

Description de l'opération

  • Avant d'appeler cette opération, assurez-vous de bien comprendre les méthodes de facturation et la tarification d'Intelligent Media Management.

  • Avant d'appeler cette opération, assurez-vous d'avoir indexé des fichiers dans un jeu de données en utilisant des liaisons (CreateBinding) ou une indexation active (IndexFileMeta ou BatchIndexFileMeta).

  • Les résultats renvoyés ne sont que des exemples. Selon la configuration du modèle de workflow, les catégories et le contenu des métadonnées de fichier obtenues peuvent différer des exemples. Si vous avez des questions, rejoignez le groupe DingTalk pour donner votre avis. Pour l'identifiant du groupe DingTalk, reportez-vous à Contactez-nous.

Limites

  • Chaque requête renvoie un maximum de 100 fichiers.

  • Chaque requête renvoie un maximum de 2 000 informations de statistiques d'agrégation.

  • Jusqu'à 100 conditions de sous-requête sont prises en charge.

  • Une profondeur d'imbrication maximale de 5 niveaux est prise en charge pour les sous-requêtes.

Exemples de conditions de requête

  • Pour rechercher des images JPEG d'une taille supérieure à 1 000 pixels, spécifiez le paramètre Query comme suit :

{
  "SubQueries":[
    {
      "Field":"ContentType",
      "Value": "image/jpeg",
      "Operation":"eq"
    },         
    {
      "Field":"ImageWidth",
      "Value":"1000",
      "Operation":"gt"
    }
  ],
  "Operation":"and"
}
  • Pour rechercher tous les fichiers dans oss://examplebucket/path/ qui contiennent la balise TV ou Speaker et dont la taille est supérieure à 10 Mo, spécifiez le paramètre Query comme suit :

Remarque

Ici, TV et Speaker sont des balises différentes du même fichier et existent sous forme de deux objets indépendants dans le champ Labels. Notez la différence entre cet exemple et le suivant.

{
  "SubQueries": [
    {
      "Field": "URI",
      "Value": "oss://examplebucket/path/",
      "Operation": "prefix"
    },
    {
      "Field": "Size",
      "Value": "1048576",
      "Operation": "gt"
    },
    {
      "SubQueries": [
        {
          "Field": "Labels.LabelName",
          "Value": "TV",
          "Operation": "eq"
        },
        {
          "Field": "Labels.LabelName",
          "Value": "Speaker",
          "Operation": "eq"
        }
      ],
      "Operation": "or"
    }
  ],
  "Operation": "and"
}
        
  • Pour exclure les fichiers qui contiennent des informations sur le visage d'un homme de plus de 36 ans, spécifiez le paramètre Query comme suit :

Remarque

Contrairement à l'exemple précédent, cela nécessite qu'un seul visage remplisse les deux conditions : avoir plus de 36 ans et être de sexe masculin. Cela diffère d'une exigence où une image contient plusieurs visages, dont l'un est masculin et l'autre a plus de 36 ans. Dans cette requête, vous devez utiliser une requête nested pour vous assurer que les conditions sont remplies au sein du même élément.

{
	"Operation": "not",
	"SubQueries": [{
		"Operation": "nested",
		"SubQueries": [{
			"Operation": "and",
			"SubQueries": [{
				"Field": "Figures.Age",
				"Operation": "gt",
				"Value": "36"
			}, {
				"Field": "Figures.Gender",
				"Operation": "eq",
				"Value": "male"
			}]
		}]
	}]
}
  • Pour rechercher des images JPEG qui possèdent à la fois des balises personnalisées et des balises système, spécifiez le paramètre Query comme suit :

{
  "SubQueries":[
    {
      "Field":"ContentType",
      "Value": "image/jpeg",
      "Operation":"eq"
    },         
    {
      "Field":"CustomLabels.test",
      "Operation":"exist"
    },         
    {
      "Field":"Labels.LabelName",
      "Operation":"exist"
    }
  ],
  "Operation":"and"
}

Sur la base des conditions de recherche précédentes, vous pouvez également utiliser des opérations d'agrégation pour collecter des statistiques et analyser différentes données. Par exemple, vous pouvez calculer la taille totale, le nombre, la moyenne ou les valeurs extrêmes de tous les fichiers qui répondent aux conditions de recherche, ou collecter des statistiques sur la distribution de la taille de toutes les images qui répondent aux conditions de recherche.

Testez maintenant

Testez cette API dans OpenAPI Explorer, sans signature manuelle. Les appels réussis génèrent automatiquement du code SDK correspondant à vos paramètres. Téléchargez-le avec une sécurité intégrée des identifiants pour une utilisation locale. Testez cette API dans OpenAPI Explorer, sans signature manuelle. Les appels réussis génèrent automatiquement du code SDK correspondant à vos paramètres. Téléchargez-le avec une sécurité intégrée des identifiants pour une utilisation locale.

Test

Autorisation RAM

Le tableau ci-dessous décrit les autorisations nécessaires pour appeler cette API. Vous pouvez les définir dans une politique Resource Access Management (RAM). Les colonnes du tableau sont détaillées ci-dessous :

  • Action : les actions peuvent être utilisées dans l'élément Action des instructions de politique de permissions RAM pour accorder les autorisations nécessaires à l'exécution de l'opération.

  • API : l'API que vous pouvez appeler pour exécuter l'action.

  • Niveau d'accès : le niveau d'accès prédéfini accordé pour chaque API. Valeurs valides : create, list, get, update et delete.

  • Type de ressource : le type de ressource qui prend en charge l'autorisation pour exécuter l'action. Il indique si l'action prend en charge les permissions au niveau de la ressource. La ressource spécifiée doit être compatible avec l'action. Sinon, la politique sera inefficace.

    • Pour les API avec permissions au niveau de la ressource, les types de ressource requis sont marqués d'un astérisque (*). Spécifiez l'Alibaba Cloud Resource Name (ARN) correspondant dans l'élément Resource de la politique.

    • Pour les API sans permissions au niveau de la ressource, la valeur All Resources est affichée. Utilisez un astérisque (*) dans l'élément Resource de la politique.

  • Clé de condition : les clés de condition définies par le service. La clé permet un contrôle granulaire, applicable aux actions seules ou aux actions associées à des ressources spécifiques. En plus des clés de condition propres au service, Alibaba Cloud fournit un ensemble de clés de condition communes applicables à tous les services pris en charge par RAM.

  • Action dépendante : les actions dépendantes requises pour exécuter l'action. Pour mener à bien l'opération, l'utilisateur RAM ou le rôle RAM doit disposer des permissions pour toutes les actions dépendantes.

imm:SimpleQuery

list

*Jeu de données.

acs:imm:{#regionId}:{#accountId}:project/{#ProjectName}/dataset/{#DatasetName}

Aucune Aucune

Paramètres de requête

Paramètre

Type

Requis

Description

Exemple

NextToken

string

Non

Le jeton utilisé pour la pagination lorsque le nombre total de fichiers dépasse la valeur de MaxResults.

La liste des fichiers est renvoyée par ordre lexicographique à partir de NextToken.

Définissez ce paramètre sur vide lors du premier appel de cette opération.

MTIzNDU2Nzg6aW1tdGVzdDpleGFtcGxlYnVja2V0OmRhdGFzZXQwMDE6b3NzOi8vZXhhbXBsZWJ1Y2tldC9zYW1wbGVvYmplY3QxLmpwZw==

MaxResults

integer

Non

  • Lorsque vous effectuez une requête de fichiers sans spécifier le paramètre Aggregations, ce paramètre indique le nombre maximal de fichiers à renvoyer. Valeurs valides : 0 à 100.

  • Lorsque vous spécifiez le paramètre Aggregations pour les statistiques d'agrégation, ce paramètre indique le nombre maximal de groupes à renvoyer. Valeurs valides : 0 à 2000.

  • Si vous ne spécifiez pas ce paramètre ou si vous le définissez sur 0, la valeur par défaut est 100.

10

ProjectName

string

Oui

Le nom du projet. Pour plus d'informations sur la façon d'obtenir le nom du projet, consultez Créer un projet.

test-project

DatasetName

string

Oui

Le nom du jeu de données. Pour plus d'informations sur la façon d'obtenir le nom du jeu de données, consultez Créer un jeu de données.

test-dataset

Query SimpleQuery

Non

Les conditions de requête simple. Cliquez sur le lien à gauche pour afficher les détails.

Sort

string

Non

La liste des champs de tri. Pour plus d'informations, consultez Champs et opérateurs pris en charge.

Remarque
  • Vous pouvez séparer plusieurs champs de tri par des virgules (,), par exemple Size,Filename.

  • Vous pouvez spécifier un maximum de 5 champs de tri.

  • L'ordre des champs de tri détermine la priorité de tri.

Size,Filename

Order

string

Non

L'ordre de tri des champs de tri. Valeurs valides :

  • asc : ordre croissant

  • desc : ordre décroissant (par défaut)

Remarque
  • Vous pouvez séparer plusieurs ordres de tri par des virgules (,), par exemple asc,desc.

  • Le nombre d'ordres de tri ne peut pas dépasser le nombre de champs de tri. Autrement dit, le nombre d'éléments dans le paramètre Order doit être inférieur ou égal au nombre d'éléments dans le paramètre Sort. Par exemple, si Sort est défini sur Size,Filename, Order peut être défini sur "asc,desc".

  • Si le nombre d'ordres de tri est inférieur au nombre de champs de tri, l'ordre de tri par défaut pour les champs non spécifiés est desc. Par exemple, si Sort est défini sur Size,Filename et Order sur asc, l'ordre de tri par défaut pour Filename est desc, ce qui signifie l'ordre décroissant.

asc,desc

Aggregations

array<object>

Non

La liste des informations de champ d'agrégation.

Important Lorsque vous utilisez une requête d'agrégation, seuls les résultats d'agrégation sont renvoyés, et la liste des métadonnées correspondantes n'est pas renvoyée.

object

Non

La structure des informations de champ d'agrégation.

Field

string

Non

Le nom du champ. Pour plus d'informations sur les champs pris en charge, consultez Champs et opérateurs pris en charge.

Size

Operation

string

Non

L'opérateur pour le champ d'agrégation.

Valeurs valides :

  • average :

    Moyenne.

  • min :

    Valeur minimale.

  • max :

    Valeur maximale.

  • count :

    Nombre.

  • distinct :

    Nombre distinct.

  • sum :

    Somme.

  • group :

    Nombre de groupes, trié par ordre décroissant des résultats de nombre de groupes.

sum

WithFields

array

Non

Indique les champs spécifiques à renvoyer au lieu de tous les champs de métadonnées existants. Cela peut être utilisé pour réduire la taille de la structure renvoyée.

Si vous ne spécifiez pas ce paramètre ou si vous le laissez vide, tous les champs sont renvoyés.

string

Non

Le nom du champ à renvoyer. Pour plus d'informations sur les noms de champs pris en charge, consultez File.

Filename

WithoutTotalHits

boolean

Non

Indique si le nombre total d'enregistrements correspondants doit être renvoyé. Valeurs valides :

  • true : le champ TotalHits n'est pas renvoyé.

  • false : le champ TotalHits est renvoyé.

Éléments de réponse

Élément

Type

Description

Exemple

object

La structure de la réponse.

Aggregations

array<object>

La liste des informations de champ d'agrégation. Ce paramètre n'est renvoyé que lorsque Aggregations dans la requête n'est pas vide.

array<object>

La structure des informations de champ d'agrégation.

Field

string

Le nom du champ d'agrégation.

Size

Groups

array<object>

La liste des résultats de regroupement et d'agrégation. Ce paramètre n'est renvoyé que lorsqu'une Operation de type group existe dans Aggregations de la requête.

object

Le résultat de regroupement et d'agrégation.

Count

integer

Le nombre total de regroupements et d'agrégations.

5

Value

string

La valeur du regroupement et de l'agrégation.

100

Operation

string

L'opération d'agrégation pour le champ d'agrégation.

sum

Value

number

Le résultat statistique de l'agrégation.

200

Files

array

La liste des informations de fichier. Ce paramètre n'est renvoyé que lorsque Aggregations dans la requête est vide.

File

La structure des informations de fichier.

NextToken

string

Le jeton utilisé pour la pagination lorsque le nombre total de fichiers dépasse la valeur de MaxResults.

Lorsque vous listez les informations de fichier la prochaine fois, définissez NextToken sur cette valeur pour renvoyer les résultats restants.

Ce paramètre n'a de valeur que lorsque tous les fichiers ne sont pas renvoyés.

MTIzNDU2Nzg6aW1tdGVzdDpleGFtcGxlYnVja2V0OmRhdGFzZXQwMDE6b3NzOi8vZXhhbXBsZWJ1Y2tldC9zYW1wbGVvYmplY3QxLmpwZw==

RequestId

string

L'identifiant de la requête.

2C5C1E0F-D8B8-4DA0-8127-EC32C771****

TotalHits

integer

Le nombre d'enregistrements correspondants.

10

Exemples

JSON format

{
  "Aggregations": [
    {
      "Field": "Size",
      "Groups": [
        {
          "Count": 5,
          "Value": "100"
        }
      ],
      "Operation": "sum",
      "Value": 200
    }
  ],
  "Files": [
    {
      "OwnerId": "102321002467****",
      "ProjectName": "test-project",
      "DatasetName": "test-dataset",
      "ObjectType": "file",
      "ObjectId": "75d5de2c50754e3dadd5c35dbca5f9949369e37eb342a73821f690c94c36c7f7",
      "UpdateTime": "2021-06-29T14:50:13.011643661+08:00",
      "CreateTime": "2021-06-29T14:50:13.011643661+08:00",
      "URI": "oss://test-bucket/test-object.jpg",
      "OSSURI": "oss://examplebucket/sampleobject.jpg",
      "Filename": "sampleobject.jpg",
      "MediaType": "image",
      "ContentType": "image/jpeg",
      "Size": 1000,
      "FileHash": "1d9c280a7c4f67f7ef873e28449dbe17",
      "FileModifiedTime": "2021-06-29T14:50:13.011643661+08:00",
      "FileCreateTime": "2021-06-29T14:50:13.011643661+08:00",
      "FileAccessTime": "2021-06-29T14:50:13.011643661+08:00",
      "ProduceTime": "2021-06-29T14:50:13.011643661+08:00",
      "LatLong": "30.134390,120.074997",
      "Timezone": "\"\"",
      "Addresses": [
        {
          "Language": "zh-Hans",
          "AddressLine": "N° 969, Wenyi West Road, district de Yuhang, Hangzhou, Zhejiang, Chine",
          "Country": "Chine",
          "Province": "Zhejiang",
          "City": "Hangzhou",
          "District": "District de Yuhang",
          "Township": "Wenyi West Road"
        }
      ],
      "TravelClusterId": "-",
      "Orientation": 0,
      "Figures": [
        {
          "FigureId": "868a9e74-cde5-4c7a-9013-28bb984****",
          "FigureConfidence": 1,
          "FigureClusterId": "Cluster-dbe72fec-b84c-4ab6-885b-3678e64****",
          "FigureClusterConfidence": 1,
          "FigureType": "face",
          "Age": 29,
          "AgeSD": 5,
          "Gender": "female",
          "GenderConfidence": 1,
          "Emotion": "happiness",
          "EmotionConfidence": 0.70784568786621,
          "FaceQuality": 0.960875928401947,
          "Boundary": {
            "Width": 200,
            "Height": 300,
            "Left": 10,
            "Top": 30,
            "Polygon": [
              {
                "X": 10,
                "Y": 10
              }
            ]
          },
          "Mouth": "close",
          "MouthConfidence": 1,
          "Beard": "none",
          "BeardConfidence": 1,
          "Hat": "none",
          "HatConfidence": 1,
          "Mask": "none",
          "MaskConfidence": 1,
          "Glasses": "none",
          "GlassesConfidence": 0.8,
          "Sharpness": 0.7,
          "Attractive": 0.96,
          "HeadPose": {
            "Pitch": 18.385589599609375,
            "Roll": 4.204030513763428,
            "Yaw": 2.4945924282073975
          }
        }
      ],
      "FigureCount": 10,
      "Labels": [
        {
          "Language": "zh-Hans",
          "LabelName": "椅子",
          "LabelLevel": 2,
          "LabelConfidence": 0.95,
          "ParentLabelName": "家具",
          "CentricScore": 0.877,
          "LabelAlias": "座椅",
          "Clips": [
            {
              "TimeRange": [
                100
              ]
            }
          ]
        }
      ],
      "Title": "test",
      "ImageWidth": 270,
      "ImageHeight": 500,
      "EXIF": "{\"Compression\":{\"value\":\"6\"},\"DateTime\":{\"value\":\"2020:08:19 17:11:11\"}}",
      "ImageScore": {
        "OverallQualityScore": 0.736
      },
      "CroppingSuggestions": [
        {
          "AspectRatio": "2:3",
          "Confidence": 0.742,
          "Boundary": {
            "Width": 200,
            "Height": 300,
            "Left": 10,
            "Top": 30,
            "Polygon": [
              {
                "X": 10,
                "Y": 10
              }
            ]
          }
        }
      ],
      "OCRContents": [
        {
          "Language": "zh-hans",
          "Contents": "Bienvenue dans Intelligent Media Management",
          "Confidence": 0.8254936695098877,
          "Boundary": {
            "Width": 200,
            "Height": 300,
            "Left": 10,
            "Top": 30,
            "Polygon": [
              {
                "X": 10,
                "Y": 10
              }
            ]
          }
        }
      ],
      "VideoWidth": 1080,
      "VideoHeight": 1920,
      "VideoStreams": [
        {
          "Index": 0,
          "Language": "en",
          "CodecName": "h264",
          "CodecLongName": "H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10",
          "Profile": "High",
          "CodecTimeBase": "1373627/83160000",
          "CodecTagString": "avc1",
          "CodecTag": "0x31637661",
          "Width": 1280,
          "Height": 720,
          "HasBFrames": 2,
          "SampleAspectRatio": "1:1",
          "DisplayAspectRatio": "16:9",
          "PixelFormat": "yuv420p",
          "Level": 40,
          "FrameRate": "25/1",
          "AverageFrameRate": "25/1",
          "TimeBase": "1/12800",
          "StartTime": 0,
          "Duration": 22.88,
          "Bitrate": 5407765,
          "FrameCount": 572,
          "Rotate": "90",
          "BitDepth": 8,
          "ColorSpace": "bt709",
          "ColorRange": "tv",
          "ColorTransfer": "bt709",
          "ColorPrimaries": "bt709"
        }
      ],
      "Subtitles": [
        {
          "Index": 2,
          "Language": "en",
          "CodecName": "mov_text",
          "CodecLongName": "MOV text",
          "CodecTagString": "tx3g",
          "CodecTag": "0x67337874",
          "StartTime": 0,
          "Duration": 71.378,
          "Bitrate": 74,
          "Content": "Bienvenue",
          "Width": 600,
          "Height": 30
        }
      ],
      "AudioStreams": [
        {
          "Index": 1,
          "Language": "en",
          "CodecName": "aac",
          "CodecLongName": "AAC (Advanced Audio Coding)",
          "CodecTimeBase": "1/44100",
          "CodecTagString": "mp4a",
          "CodecTag": "0x6134706d",
          "TimeBase": "1/48000",
          "StartTime": 0.0235,
          "Duration": 3.690667,
          "Bitrate": 320087,
          "FrameCount": 173,
          "Lyric": "test",
          "SampleFormat": "fltp",
          "SampleRate": 48000,
          "Channels": 2,
          "ChannelLayout": "stéréo"
        }
      ],
      "Artist": "Jane",
      "AlbumArtist": "Jane",
      "AudioCovers": [
        {
          "ImageWidth": 500,
          "ImageHeight": 820,
          "EXIF": "{\"FileSize\":{\"value\":\"29304\"},\"Format\":{\"value\":\"jpg\"}}",
          "ImageScore": {
            "OverallQualityScore": 0.736
          },
          "CroppingSuggestions": [
            {
              "AspectRatio": "2:3",
              "Confidence": 0.742
            }
          ],
          "OCRContents": [
            {
              "Language": "zh-hans",
              "Contents": "Bienvenue dans Intelligent Media Management",
              "Confidence": 0.8254936695098877
            }
          ]
        }
      ],
      "Composer": "Jane",
      "Performer": "Jane",
      "Language": "eng",
      "Album": "FirstAlbum",
      "PageCount": 5,
      "ETag": "\"1D9C280A7C4F67F7EF873E28449****\"",
      "CacheControl": "no-cache",
      "ContentDisposition": "attachment; filename =test.jpg",
      "ContentEncoding": "UTF-8",
      "ContentLanguage": "zh-CN",
      "AccessControlAllowOrigin": "https://aliyundoc.com",
      "AccessControlRequestMethod": "PUT",
      "ServerSideEncryptionCustomerAlgorithm": "SM4",
      "ServerSideEncryption": "AES256",
      "ServerSideDataEncryption": "SM4",
      "ServerSideEncryptionKeyId": "9468da86-3509-4f8d-a61e-6eab1eac****",
      "OSSStorageClass": "Standard",
      "OSSCRC64": "559890638950338001",
      "ObjectACL": "default",
      "ContentMd5": "HZwoCnxPZ/fvhz4oRJ2+Fw==",
      "OSSUserMeta": {
        "key": "val"
      },
      "OSSTaggingCount": 2,
      "OSSTagging": {
        "key": "val"
      },
      "OSSExpiration": "2120-01-01T12:00:00.000Z",
      "OSSVersionId": "CAEQNhiBgMDJgZCA0BYiIDc4MGZjZGI2OTBjOTRmNTE5NmU5NmFhZjhjYmY0****",
      "OSSDeleteMarker": "CAEQMhiBgIDXiaaB0BYiIGQzYmRkZGUxMTM1ZDRjOTZhNjk4YjRjMTAyZjhl****",
      "OSSObjectType": "Normal",
      "CustomId": "\t\nmember-image-id-0001",
      "CustomLabels": {
        "test": "test",
        "test2": 1
      },
      "StreamCount": 1,
      "ProgramCount": 1,
      "FormatName": "mov",
      "FormatLongName": "QuickTime / MOV",
      "StartTime": 0,
      "Bitrate": 13091201,
      "Duration": 15.263,
      "SemanticTypes": [
        "content"
      ],
      "Elements": [
        {
          "ElementContents": [
            {
              "Type": "text",
              "Content": "Fragment de texte",
              "URL": "http://aliyun.com",
              "TimeRange": [
                500
              ]
            }
          ],
          "ObjectId": "id1",
          "ElementType": "title - titre ; image - image ; table - tableau ; narrative-text - texte narratif",
          "SemanticSimilarity": 0.8,
          "ElementRelations": [
            {
              "Type": "child, parent",
              "ObjectId": "id1"
            }
          ]
        }
      ],
      "SceneElements": [
        {
          "TimeRange": [
            100
          ],
          "FrameTimes": [
            30
          ],
          "VideoStreamIndex": 0,
          "Labels": [
            {
              "Language": "zh-Hans",
              "LabelName": "椅子",
              "LabelLevel": 2,
              "LabelConfidence": 0.95,
              "ParentLabelName": "家具",
              "CentricScore": 0.877,
              "LabelAlias": "座椅",
              "Clips": [
                {
                  "TimeRange": [
                    100
                  ]
                }
              ]
            }
          ]
        }
      ],
      "OCRTexts": "阿里云IMM",
      "Reason": "[InternalError] The request has been failed due to some unknown error. status: 500, requestId: CC5ACFBD-BB7A-496D-A9D6-****",
      "ObjectStatus": "Indexed",
      "Insights": {
        "Video": {
          "Description": "None",
          "Caption": "La vidéo montre deux scènes différentes : l'une avec une assiette blanche immobile, un flacon noir et un verre transparent, et l'autre avec une main tenant un flacon de shampoing portant la mention \"YEZOLU\" se déplaçant lentement vers le haut dans une salle de bain"
        },
        "Image": {
          "Caption": "Aucun",
          "Description": "L'image représente une personne vêtue d'une veste de costume sombre et d'une chemise blanche. L'arrière-plan est un dégradé allant du bleu clair au gris"
        }
      }
    }
  ],
  "NextToken": "MTIzNDU2Nzg6aW1tdGVzdDpleGFtcGxlYnVja2V0OmRhdGFzZXQwMDE6b3NzOi8vZXhhbXBsZWJ1Y2tldC9zYW1wbGVvYmplY3QxLmpwZw==",
  "RequestId": "2C5C1E0F-D8B8-4DA0-8127-EC32C771****",
  "TotalHits": 10
}

Codes d'erreur

Consultez Codes d'erreur pour la liste complète.

Notes de version

Consultez Notes de version pour la liste complète.