worldline Direct
S'inscrire

Ce produit est en mode pilote. Contactez-nous pour devenir un pilote.

Introduction

La solution Batch est idéale pour traiter de grandes quantités de transactions ou des opérations de maintenance en une seule fois. Vous collectez les données de carte de vos clients ou utilisez des jetons existants pour soumettre des transactions à votre rythme.

  • Évolutivité optimisée pour soumettre de grandes quantités de transactions/opérations de maintenance
  • Sécurité accrue en incluant les données directement dans le corps de la requête
  • Validation de données robuste grâce à des vérifications anticipées

Directives d'optimisation du traitement

Comme ce produit est en mode pilote, des limitations s'appliquent.

La capacité de soumission de Batch doit respecter les limites de taille de l'API. Ces limites varient en fonction des propriétés incluses dans votre requête et du moyen de paiement utilisé :

  • Pour les paiements par carte/PayPal utilisant les propriétés minimales requises, vous pouvez soumettre plus de 10 000 transactions.
  • Pour les transactions Apple Pay/Google, cette capacité peut diminuer à environ 2 000 à 2 500 transactions en raison de la taille de la requête JSON en raison des contraintes des propriétés optionnelles supplémentaires, qui varient généralement de 5 à 15 Mo.

Pour optimiser votre implémentation de Batch, nous recommandons

  • Tester votre structure de charge utile pour déterminer les tailles de lot optimales.
  • Équilibrer la quantité de transactions avec les variations de propriétés pour plus d'efficacité.

Contactez-nous pour obtenir de l'aide sur cette tâche.

En cas de soumission de lot échouée, reportez-vous à notre réponse de plateforme lorsque vous envoyez des requêtes à notre endpoint SubmitBatch.

Commencer

Pour traiter des transactions sur notre plateforme avec cette solution, assurez-vous que

  • Vous avez un compte sur notre plateforme.
  • Au moins une de nos méthodes de paiement par carte est activée dans le Merchant Portal via Entreprise > Moyens de paiement.
    Utilisez-vous le Back Office ?
    Vous pouvez vérifier l'état d'activation de la méthode de paiement via Configuration > Activation PM.
  • Vous avez configuré votre clé API et secret API dans votre compte.
  • Votre serveur peut traiter les requêtes serveur à serveur via notre API RESTful.

Tout est prêt ? Apprenez ensuite à utiliser notre solution Batch dans le chapitre suivant !

Comment ça marche

Avant de traiter des transactions en direct, utilisez notre environnement de test. Familiarisez-vous avec notre solution sans frais ni engagement ! Une fois que vous êtes prêt à passer en direct, découvrez ici comment obtenir un compte de production ou contactez-nous !

Les connexions de Server-to-server nécessitent que vos systèmes traitent les données de carte à un moment donné. Cette méthode entraîne un très grand nombre d'exigences PCI.

Cependant, vous pouvez réduire considérablement la portée de votre évaluation et le nombre d'exigences PCI : Remplacez le numéro de carte par un token via notre Hosted Tokenization Page. Cela vous permet de externaliser complètement la gestion des données de carte à notre plateforme. Aucun de vos systèmes utilisant des tokens ne nécessitera d'évaluation.

Moyens d'intégration

Étant donné que ce produit est en mode pilote, nos SDK de serveur ne prennent pas encore en charge cette méthode d'intégration. Au lieu de cela, vous devez envoyer toutes les requêtes comme décrit dans le chapitre "Étapes d'intégration" directement aux points de terminaison API respectifs. Pour ce faire, vous devez suivre un processus d'authentification spécifique décrit dans le guide Authentification.

Formatage JSON

L'utilisation de Batch nécessite l'envoi d'un JSON contenant toutes les données nécessaires pour les opérations de transaction/maintenance. Le contenu du JSON diffère selon les cas d'utilisation individuels. Retrouvez la collection de tous les cas d'utilisation pris en charge dans le chapitre dédié.

Cependant, pour tout cas d'utilisation, la requête elle-même doit répondre aux exigences suivantes :

  • Notre point de terminaison SubmitBatch ne prend en charge que les données JSON dans le corps de la requête. Le corps de la requête contient un objet JSON avec le modèle correct comme valeur :
    
    {
    	"header": {
    		"operationType": "CreatePayment",
    		"merchantBatchReference": "unique-batch-reference",
    		"itemCount": 1
    	},
        "createPayment": [
            {
              "cardPaymentMethodSpecificInput": {
                "card": {
                  "cardNumber": "4150551403657424",
                  "cvv": "031",
                  "expiryDate": "1231",
                  "cardholderName": "Jacqueline"
                },
                "paymentProductId": 130,
                "transactionChannel": "ECOMMERCE",
                "authorizationMode": "FINAL_AUTHORIZATION"
              },
              "order": {
                "amountOfMoney": {
                  "amount": 5600,
                  "currencyCode": "EUR"
                },
                "references": {
                  "merchantReference": "merchant-reference"
                }
              }
            }
          ]
    }
    
  • Chaque opération de transaction/maintenance est un enregistrement formaté comme un objet JSON. Selon le operationType, tous les enregistrements/objets JSON sont placés dans un tableau de
    createPayment
    capturePayment
    cancelPayment
    refundPayment
  • La limite de taille (2000 enregistrements).

Lors de la soumission d'un lot, notre plateforme parsèmera – validera – toujours le JSON. La validation couvre les vérifications pour :

  • Propriétés obligatoires manquantes.
  • Inadéquation des types de données pour toute propriété.
  • Erreurs de syntaxe et de formatage.
  • Conversion des objets JSON contenus dans un tableau de
    createPayment
    capturePayment
    cancelPayment
    refundPayment

    en éléments de lot individuels pour un traitement ultérieur.
  • La limite de taille (2000 enregistrements).

Étapes d'intégration

Notre solution Batch vous permet de traiter de grandes quantités de transactions en une seule fois. Vos clients fournissent leurs données de carte que vous stockez dans votre système. Au lieu de les soumettre en temps réel, vous pouvez choisir le moment du processus de transaction à votre guise.

En conséquence, votre entreprise n'a pas besoin d'une boutique en ligne : Vous envoyez vos demandes de transaction collectivement à tout moment à notre plateforme. Ainsi, vous pouvez soit :

  • Stocker les informations d'identification des cartes de vos clients.
  • Utiliser des jetons existants pour MITs.

Pour une soumission ultérieure dans des JSON de lots spécifiques.

Traiter les transactions de cette manière signifie que vous :

  • Traitez les transactions/opérations de maintenance de manière asynchrone : Vous définissez le moment réel de la soumission des données de transaction à notre plateforme.
  • Recevez un délai pour obtenir les résultats des transactions/opérations de maintenance. Cela dépend du so-called "daily cut-off time" de votre acquéreur : Nous recevons les résultats réels des transactions par intervalles pour toutes les transactions soumises dans un cadre temporel précis.

Les chapitres suivants couvrent une vue d'ensemble à haut niveau d'un flux typique. Il décrit toutes les étapes que vous devez suivre pour le traitement des transactions Batch. Retrouvez une vue d'ensemble détaillée dans ce chapitre.

Contrairement à d'autres méthodes d'intégration, Batch utilise des points de terminaison API individuels pour les différentes étapes du flux de traitement par lots.

  1. Envoyer une requête SubmitBatch
  2. Traiter la réponse SubmitBatch
  3. Envoyer une requête Process
  4. Obtenir le statut de traitement du lot

Envoyer une requête SubmitBatch

Vous envoyez une requête SubmitBatch à notre plateforme, contenant les données pertinentes dans le corps de la requête. Batch prend en charge deux catégories de cas d'utilisation : 

  1. Traitement de nouvelles transactions (en utilisant des données de carte ou des jetons).
  2. Réalisation d'opérations de maintenance sur des transactions existantes. 

En fonction du cas d'utilisation, la requête doit contenir des propriétés spécifiques. Trouvez différents exemples pour chacun dans notre chapitre dédié.

URLs de points de terminaison en test / direct

  • URL de point de terminaison TEST : https://payment.preprod.direct.worldline-solutions.com/v2/{merchantId}/merchant-batches
  • URL de point de terminaison PRODUCTION : https://payment.direct.worldline-solutions.com/v2/{merchantId}/merchant-batches

Remplacez "{merchantId}" par votre compte test/en direct sur notre plateforme. En savoir plus sur le "merchantId" dans notre glossaire.

  • Cette première étape ne représente que le début du processus de transaction. Vous devez suivre toutes les étapes suivantes pour réellement traiter les transactions/realiser des opérations de maintenance.
  • Ne mélangez pas les cas d'utilisation dans une charge utile de requête. Soumettez toujours une requête distincte par cas d'utilisation.
  • Sachez que certaines erreurs ou informations manquantes/incorrectes pourraient ne pas être remarquées lorsque vous soumettez une requête. Après avoir traité la requête, notre plateforme la vérifiera à nouveau, et tout problème détecté alors pourrait entraîner l'échec de la transaction.


Traiter la réponse SubmitBatch

Notre plateforme envoie une réponse contenant des informations sur la requête :


{
    "merchantBatchReference": "unique-batch-reference",
    "totalCount": 0
}
Propriétés Description
merchantBatchReference La référence unique du marchand pour le lot. Assurez-vous d'envoyer une valeur pour chaque requête afin de la rendre identifiable parmi d'autres requêtes. Vous utiliserez cette référence dans les requêtes ultérieures pour les actions de suivi.
totalCount Nombre total d'enregistrements que vous avez soumis dans la requête Batch.


Envoyer une requête Process

Pour traiter réellement les transactions/opérations de maintenance à partir des données soumises précédemment dans un délai de 12 heures, vous devez en donner l'instruction à notre plateforme.

Sachez que vous devez traiter un lot précédemment soumis dans les 12 heures. Après cette période, notre plateforme supprimera le lot.

Envoyez une requête avec un corps vide à notre point de terminaison Process, en remplaçant {merchantBatchReference} par la valeur que vous avez définie dans la requête SubmitBatch précédente.

URLs des points de terminaison en test / production (Méthode : POST)

  • Test : https://payment.preprod.direct.worldline-solutions.com/v2/{merchantId}/merchant-batches/{merchantBatchReference}/process
  • Production : https://payment.direct.worldline-solutions.com/v2/{merchantId}/merchant-batches/{merchantBatchReference}/process

Si notre plateforme ne peut pas traiter la requête du lot pour une raison quelconque, la réponse de notre plateforme fournit des informations via ces propriétés :

Propriétés Description

errorId

L'identifiant unique de votre requête sur notre plateforme.

Si vous avez besoin de notre aide pour résoudre l'erreur liée à cette requête, veillez à l'ajouter dans votre message lors de votre contact avec nous.

errors
    errorCode
    category
    httpStatusCode
    id
    message

errorCode : Code d'erreur à 8 chiffres.

category : Description lisible de la catégorie d'erreur globale.

httpStatusCode : Code d'erreur à 3 chiffres lié aux codes de statut HTTP standards.

id : Description lisible de la catégorie spécifique dans laquelle l'erreur se trouve.

message : Description lisible de la catégorie spécifique dans laquelle l'erreur se trouve, fournissant des informations détaillées si disponibles.


Obtenir le statut de traitement du lot

Obtenez le statut du fichier de lot en envoyant une requête à notre point de terminaison Batches, en remplaçant {merchantBatchReference} par la valeur que vous avez envoyée lors de la soumission de la demande originale :

URLs des points de terminaison en test / live (Méthode : GET)

  • Test : https://payment.preprod.direct.worldline-solutions.com/v2/{merchantId}/merchant-batches/{merchantBatchReference}
  • Prod : https://payment.direct.worldline-solutions.com/v2/{merchantId}/merchant-batches/{merchantBatchReference}

La réponse de notre plateforme contient diverses propriétés, fournissant des informations sur le lot :

{
	"operationType": "CreatePayment",
	"merchantBatchReference": "unique-batch-reference",
	"itemCount": 1,
	"status":"Processed”
}
Propriétés Description

operationType

Le type d'opération pour le lot. Valeurs possibles :

  • CreatePayment : Pour les nouvelles transactions.
  • CancelPayment : Pour annuler les transactions autorisées. 
  • CapturePayment : Pour capturer les transactions autorisées.
  • RefundPayment : Pour rembourser les transactions capturées.

merchantBatchReference

L'identifiant unique du lot pour lequel vous avez envoyé la requête.

itemCount

Nombre total de transactions/opérations de maintenance pour ce lot.

status

Statut du lot soumis. Valeurs possibles : 

  • Submitted : Le lot a été soumis.
  • InProgress : Le lot est actuellement en cours de traitement par notre plateforme.
  • Processed : Tous les éléments contenus dans le lot ont été traités. Notez que ce statut concerne le lot et non les statuts des enregistrements individuels (transactions/opérations de maintenance). 


Flux

Découvrez un flux de transaction complet impliquant chaque partie et les étapes (facultatives) dans cet aperçu :

  1. Votre client se rend sur votre page de paiement et saisit ses données de carte de crédit pour finaliser l'achat.
  2. Vous stockez les données de carte de crédit de vos clients dans votre système ou vous tokenisez les données de carte.
  3. Vous envoyez une requête SubmitBatch à notre plateforme.
    3'(facultatif). Nous effectuons un contrôle de prévention de la fraude.
  4. Notre plateforme effectue un contrôle de validation et envoie la réponse contenant une merchantBatchReference unique.
  5. Vous envoyez une requête ProcessBatch à notre plateforme pour traiter les transactions/opérations de maintenance du lot.
  6. Nous traitons les transactions et recevons le résultat de l'acquéreur.
  7. Vous envoyez une requête statut de traitement du lot à notre plateforme.
  8. Si la transaction a été réussie, vous pouvez livrer les marchandises / services.

Cas d'utilisation

Batch est une solution polyvalente pour divers cas d'utilisation. Chaque cas d'utilisation vous oblige à ajouter un ensemble spécifique de propriétés obligatoires/facultatives à chaque enregistrement/objet JSON dans la requête.

Nous distinguons entre le traitement de :

Apprenez dans les chapitres suivants comment composer votre requête par lot pour ces différents cas d'utilisation. Assurez-vous de respecter les règles de formatage JSON.

Les données spécifiques à Batch seront supprimées après 540 jours; cependant, nous n'avons pas de contrôle sur les données transactionnelles.

Transactions

Batch vous permet de traiter de nouvelles transactions en tant que :

Transactions ponctuelles autonomes avec données de carte

Votre JSON doit contenir un tableau de createPayment alors que chaque élément dans le tableau représente une transaction :

{
    "header": {
        "operationType": "CreatePayment",
        "merchantBatchReference": "unique-batch-reference",
        "itemCount": 1
    },
    "createPayment": [
        {
            "cardPaymentMethodSpecificInput": {
                "card": {
                    "cardNumber": "4330264936344675",
                    "cvv": "031",
                    "expiryDate": "1231",
                    "cardholderName": "Jacqueline"
                },
                "paymentProductId": 1,
                "transactionChannel": "ECOMMERCE",
                "authorizationMode": "FINAL_AUTHORIZATION"
            },
            "order": {
                "amountOfMoney": {
                    "amount": 5600,
                    "currencyCode": "EUR"
                },
                "references": {
                    "merchantReference": "merchant-reference"
                }
            }
        }
    ]
}

Transactions ponctuelles autonomes avec Apple Pay / Google Pay / PayPal

Votre JSON doit contenir un tableau de createPayment alors que chaque élément dans le tableau représente une transaction :

Apple Pay
{ 
	"header": { 
		"operationType": "CreatePayment", 
		"merchantBatchReference": "unique-batch-reference", 
		"itemCount": 1 }, 
	"CreatePayment": [ 
		{ 
			"mobilePaymentMethodSpecificInput": { 
				"decryptedPaymentData": { 
					"dpan": "4818528900107388", 
					"cryptogram": "AswbnTMABpY6sli9HcJ4MAABAAA=", 
					"expiryDate": "1225" 
					}, 
				"paymentProductId": 302 
				}, 
				"order": { 
					"amountOfMoney": { 
						"amount": 4000, 
						"currencyCode": "EUR" 
						} 
					} 
				} 
			] 
}

Google Pay
{ 
	"header": { 
		"operationType": "CreatePayment",
		"merchantBatchReference": "unique-batch-reference", 
		"itemCount": 1 
		}, 
	"CreatePayment": [ { 
		"mobilePaymentMethodSpecificInput": { 
			"authorizationMode": "FINAL_AUTHORIZATION", 	"encryptedPaymentData":"{\"signature\":\"MEQCIDIao18aBBvuNN9VsSr3wyPXNObNnepYZemTXPXeKcssAiAsFzc1Yisg2eNKDRKJ3yNXTFQdGnpyl6f5NoZubnMpnQ\\u003d\\u003d\",\"intermediateSigningKey\":{\"signedKey\":\"{\\\"keyValue\\\":\\\"MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEh2zEJsD/Wih76B54p32bVC7usW0FaaTjFteg4wHFUd9fnwFu/009ZfUQJ1ZSLc7QMrwYm+M95IjOtYXFQOODIA\\\\u003d\\\\u003d\\\",\\\"keyExpiration\\\":\\\"1747347367330\\\"}\",\"signatures\":[\"MEQCIBD8dSW5JBd7AcDY3bUFhTrGSR+UjOSzqExbYBu+PnZGAiBM7XEEuw3s1+fxqLIgS81+kkJ2/b2y58VBuuRU/TDiVg\\u003d\\u003d\"]},\"protocolVersion\":\"ECv2\",\"signedMessage\":\"{\\\"encryptedMessage\\\":\\\"QCPEJcoxB3NJ29wIn4oTfVrkbGY6ru8b6Ts0dxB/WRgGDSN9N5udggmqcmECi+2VH7XJUJQhxqh+Y5VZTIQTdkM9kjUpUa2lgF5bdYvqAiTTMdhOu45s6YAdivvxsDZ9yNDaxS2XLmOJ1FsCjQWu4HEwJnuOuTzAnX86lhjt2RFx7RNgh4CUAcobpjV5qGwIeul1qjK5Z+fe/GRt4b5uN12rToiIOD06r5moxOruJPiMKX4EDTAzcTYZb1t97b7GKuptOvTeQGESgeeegW68WWeKlmFQTgBB4L0DlO8C4pS5rjNqLc5Mwf8NVh/EpXToPgRh2HlzQjGbqYUn3jCbamsLkRZhYC/VR1RJzk6jfYIjAA+lK593ObaJhpZodnH+BDtckR01rnWBxLxc6tW2GIwB58MTikcOQOY6hMTL4nBDQyRalH/v3wv0wNWZIQ6j0yePkJ8Ru/sKHrU6Du1TRqrKCC60Yxh/4v1r9/weQlGxarDkTdzuMFDodR+XqcY7aHEnw1XiP3M0apiCmo8/bVoVOPc/8GKwaIL+iWZs6ZtJn6tBOR09n6SVEYU\\\\u003d\\\",\\\"ephemeralPublicKey\\\":\\\"BJP8phYq1EG8JxMs9B+u/3cHPcb9ErRhHuqsGocOcPQY5FCXB40NywL+4yfTzOvzmkp4vshBHOimd/5P1uFyJNo\\\\u003d\\\",\\\"tag\\\":\\\"gWSqgM+uLZfFYlWzDwqnvVBD6v6cjaexXFkWzq1gEqk\\\\u003d\\\"}\"}",
			"paymentProductId": 320 
			}, 
			"order": { 
				"amountOfMoney": { 
					"currencyCode": "EUR", 
					"amount": 3000 
					}, 
				"references": { 
					"merchantReference": "merchant-reference" 
					} 
				} 
			} 
		] 
}
PayPal
{
   "header": {
       "operationType": "CreatePayment",
       "merchantBatchReference": "unique-batch-reference",
       "itemCount": 1
   },
   "CreatePayment": [
       {
           "order": {
               "amountOfMoney": {
                   "currencyCode": "EUR",
                   "amount": 2980
               },
               "references": {
                   "merchantReference": "merchant-reference"
               }
           },
           "redirectPaymentMethodSpecificInput": {
               "requiresApproval": true,
               "token": "586a14a88b0044a4becb6918f1a27fca"
           }
       }
   ]
}    

Les connexions de serveur à serveur exigent que vos systèmes traitent les données de carte à un moment donné. Cette méthode implique un très grand nombre d'exigences PCI.

Cependant, vous pouvez considérablement réduire l'étendue de votre évaluation et le nombre d'exigences PCI : Remplacez le numéro de carte par un token. Cela vous permet de déléguer entièrement la gestion des données de carte à notre plateforme.

Transactions initiées par le marchand (MIT) avec un token

Assurez-vous de suivre les directives Card On File pour ce cas d'utilisation.

Votre JSON doit contenir un tableau de createPayment alors que chaque élément dans le tableau représente une transaction. Remplacez les données sensibles de la carte par un token :

{
   "header": {
    "operationType": "CreatePayment",
    "merchantBatchReference": "unique-batch-reference",
    "itemCount": 1
   },
   "createPayment": [
		{
			"cardPaymentMethodSpecificInput": {
				"token": "52f6764169fb419785643a9a9751a33c",
				"authorizationMode": "FINAL_AUTHORIZATION",
				"transactionChannel": "ECOMMERCE",
				"paymentProductId": 3,
				"unscheduledCardOnFileRequestor": "merchantInitiated",
				"unscheduledCardOnFileSequenceIndicator": "subsequent"
			},
			"order": {
				"amountOfMoney": {
					"amount": 5600,
					"currencyCode": "EUR"
				}
			}
		}
	]
}

Bien que les directives Card On File ne permettent normalement pas de traiter des MITs avec un token, Batch prend en charge ce cas d'utilisation.

Cependant, cela nécessite d'assurer que le principe de liaison dynamique est appliqué dans votre requête. Selon l'origine du token, des différences s'appliquent :

  • Si vous avez créé le token via un CIT sur notre plateforme, nous prendrons en charge la liaison dynamique. Vous n'aurez pas besoin de modifier le JSON mentionné ci-dessus.
  • Si vous avez créé le token sur une plateforme différente, vous devez inclure la propriété schemeReferenceData dans le JSON.

Indépendamment de l'origine du token, Batch ne prend pas encore en charge les cas d'utilisation de pratiques industrielles.

Transactions initiées par le marchand (MIT) avec un payment.id

Assurez-vous de suivre les directives Card On File pour ce cas d'utilisation. Votre JSON doit contenir un tableau de subsequentPayment où chaque élément du tableau représente une transaction : 

{
	"header": {
		"operationType": "SubsequentPayment",
		"merchantBatchReference": "unique-batch-reference",
		"itemCount": 1
	},
	"subsequentPayment": [
		{
			"paymentId": "48901070_0",
			"subsequent": {
				"subsequentCardPaymentMethodSpecificInput": {
					"subsequentType": "Recurring"
				},
				"order": {
					"amountOfMoney": {
						"amount": 1000,
						"currencyCode": "EUR"
					},
					"references": {
						"merchantReference": "merchant-reference"
					}
				}
			}
		}
	]
}

Opérations de maintenance

Batch vous permet de :

Annulations

Créez un JSON avec un tableau de cancelPayment où chaque élément du tableau représente une annulation. Référez-vous à chaque transaction via la propriété paymentId.

{
    "header": {
      "operationType": "CancelPayment",
      "merchantBatchReference": "unique-batch-reference",
      "itemCount": 1,
    },
    "cancelPayment": [
    {
       "paymentId": "30660197300_0",
       "cancel": {
          "amountOfMoney": {
              "amount": 1000,
              "currencyCode": "EUR"
          },
         "isFinal": true
       }
    }
]
}

Captures

Créez un JSON avec un tableau de capturePayment où chaque élément du tableau représente une capture. Référez-vous à chaque transaction via la propriété paymentId.

{
    "header": {
      "operationType": "CapturePayment",
      "merchantBatchReference": "unique-batch-reference",
      "itemCount": 1
    },
    "capturePayment": [
		{
			"paymentId": "30660197300_0",
			"capture": {
				"amount": 0,
				"isFinal": true,
				"operationReferences": {
					"merchantReference": "merchant-reference"
				}
			}
		}
	]
}

Remboursements

Créez un JSON avec un tableau de refundPayment où chaque élément du tableau représente un remboursement. Référez-vous à chaque transaction via la propriété paymentId.

{
    "header": {
      "operationType": "RefundPayment",
      "merchantBatchReference": "unique-batch-reference",
      "itemCount": 1
    },
    "refundPayment": [
		{
			"paymentId": "30660197300_0",
			"refund": {
				"amountOfMoney": {
					"amount": 1000,
					"currencyCode": "EUR"
				},
				"operationReferences": {
					"merchantReference": "merchant-reference"
				}
			}
		}
	]
}

Cette page vous a-t-elle été utile ?

Avez-vous des commentaires ?

Merci pour votre réponse.
New Feature

Try out our new chatbot and find answers to all your questions.