Betfred · Software Engineer
Updated · 2026-10-02

Betfred Software Engineer
Interview Guide

THE 60-SECOND BRIEF

Betfred is a gaming and betting brand. The Software Engineer role, as candidates describe it, centres on backend services built mainly on .NET, messaging systems that move real-time data between services, and workloads that must cope with heavy traffic. Engineers are described as owning features through their whole life cycle: writing code, reviewing colleagues' code, joining stand-ups and sprint planning, and working with product managers and other engineers to turn business requirements into services. The requirements listed are .NET proficiency, API design and database interaction, with RabbitMQ-style messaging, cloud-native development and experience in a high-volume transactional industry as extras.

This guide is for candidates preparing for a Software Engineer interview at Betfred. It covers the three reported rounds (Recruiter Screen, Technical Discussions, Executive Discussions), answer plans for the behavioral prompts candidates report, including the RabbitMQ experience question, and a seven-day plan that links the reported technical questions to PracHub practice drills on idempotency, circuit decisions and SQL concurrency. No take-home or coding platform is named in the reports.

Candidates report three rounds over roughly 3-5 weeks: a Recruiter Screen, Technical Discussions, then Executive Discussions. Timing and emphasis are said to vary with the team and the seniority of the role.

Backend development.NETAPI design

33 min read

Browse Software Engineer questions

See the practice prompts

18Practice promptsAcross five skill areas

The role description candidates quote is a backend one. Day-to-day work is described as .NET services, messaging that carries real-time data, scalable and secure system design, code review and agile team rituals, with mentoring of junior engineers on top. That shapes preparation: you need working fluency in .NET async code, API design, and database access, plus enough message-broker knowledge to talk about RabbitMQ from experience rather than from a feature list.

The reported question set falls into three groups. The technical group covers API design for high throughput, test-driven development, asynchronous programming in .NET, database performance and RabbitMQ. The design and problem-solving group covers optimising a system for large data volumes, debugging production issues, scalable backend design, balancing features against stability, and long-term code structure. The behavioral group covers a tight deadline, technical disagreement, explaining a problem to a non-technical stakeholder, and motivation for the gaming and betting industry.

Candidates are advised to ground every answer in work they have actually done and to structure project stories with Situation, Task, Action, Result. Build a bank of four or five real projects first, then decide which one carries each question: one for a data-volume optimisation, one for a production incident, one for a disagreement, one for a deadline. Reuse the same project for a technical answer and a behavioral answer where it fits, so your detail stays consistent.

The domain matters at the later stages. Candidates describe real-time data processing and high availability as the challenges of betting and gaming platforms, and suggest following industry trends before the executive stage. Prepare a view on why those two constraints change engineering choices, such as how you would keep a service correct when messages repeat or a dependency is slow.

01

Recruiter Screen

reported

The Recruiter Screen is described as an initial assessment of whether you fit the role. No technical depth is reported for it, so treat it as the stage where your background is matched against the listed requirements: .NET development, API design and database work, with messaging experience as a plus. Be ready to explain concisely what you built, with which technologies, and why this role.

What to demonstrate

  • Fit between your background and the role's listed requirements
  • How clearly you summarise your own experience
  • Practical details such as availability and what you want from the role

How to prepare

  • Write a short career narrative that names your .NET, API and database work and the scale of the systems involved
  • Mark each listed requirement (.NET, API design, database interaction, RabbitMQ, cloud-native) with one project of yours that proves it, and note gaps honestly
  • Prepare an answer on why you want to work in gaming and betting, since it is a reported question
  • Ask the recruiter for the remaining rounds, their format and who you will meet
Betfred Software Engineer candidate reports ↗
02

Technical Discussions

reported

Technical Discussions are described as in-depth evaluations of technical skills. Candidates report a mix of conceptual discussion and practical problem-solving rather than syntax recall. The technical questions reported for the loop cover API design for high throughput, TDD, async programming in .NET, database performance, RabbitMQ, production debugging, scalable backend design and maintainable code structure. Prepare each as an explanation with trade-offs and a concrete example from your own work.

What to demonstrate

  • Depth in .NET and backend development
  • API design and database interaction choices, with the reasoning behind them
  • Ability to explain trade-offs and why you picked one solution
  • Practical approach to production problems and testing

How to prepare

  • Rehearse an async answer: what await does at runtime, why blocking on a task can deadlock, how you pass cancellation tokens and cap parallel calls
  • Take one API you built and describe pagination, idempotency, rate limiting and versioning choices for a high-throughput version of it
  • Pull an execution plan for a slow query and explain the index or query change you made, and what you measured afterwards
  • Practise the RabbitMQ answer around acknowledgements, retries, dead-lettering and idempotent consumers, and the PracHub idempotency-fingerprint drill
Betfred Software Engineer candidate reports ↗
03

Executive Discussions

reported

Executive Discussions are described as high-level conversations about strategic thinking and team culture fit. Candidates also report that awareness of the betting and gaming industry helps here, particularly for senior roles. Expect questions on how you work with colleagues, handle feedback and think about trade-offs at product level, so keep technical detail in service of a decision.

What to demonstrate

  • Strategic thinking about trade-offs between features, stability and technical debt
  • Team fit: communication, collaboration and handling of feedback
  • Awareness of the betting and gaming industry and its real-time, high-volume demands

How to prepare

  • Prepare a two-sided story about balancing a feature deadline against stability, naming what you protected and what you postponed
  • Read current betting-industry news and write down two technical challenges you can link to real-time data and high availability
  • Rehearse explaining a complex technical problem to a non-technical listener using impact, options and a recommendation
  • Write questions about the team's current technical challenges and roadmap, which candidates are advised to ask
Betfred Software Engineer candidate reports ↗

PracHub editorial advice for the preparation topics above.

01

Describing async and await as syntax, with no account of what happens at runtime

Explain that await frees the thread while I/O is pending, why blocking on a task with .Result or .Wait() can deadlock or starve the thread pool, and how cancellation tokens and capped parallel calls (for example a semaphore) keep a service stable.

02

Listing RabbitMQ features without any failure story

Tell one concrete case about acknowledgements, retries, dead-letter queues and idempotent consumers. Say plainly what you did not use, and state the equivalent concepts from any other broker you know.

03

Claiming a performance win with no baseline or measurement

Give the before and after number, the query plan or trace that located the bottleneck, and the load under which you measured. If you have no exact figure, say what you observed and how you checked.

04

Telling team stories in which your own decision is invisible

Use first person for the choices you made, name what you rejected and why, and credit teammates separately. Each Situation, Task, Action, Result story should have one decision the listener can point to.

05

Treating the industry question as small talk and skipping the domain

Be able to explain why real-time data and high availability change design choices on a betting platform, and have a thought-out answer to the motivation question that does not rely on slogans.

Choose a category, try a prompt, then open its approach, worked solution or follow-up when you need it.

12 technical prompts0 include a worked solution

Can you explain how you handle asynchronous programming in a.NET environment?

medium
Technical & Domain Expertise

Can you explain how you handle asynchronous programming in a.NET environment?

Approach
  1. Explain what await does: for I/O-bound work the thread goes back to the pool while the operation is pending, and the compiler-generated state machine resumes the method when the task completes. If a SynchronizationContext exists (UI apps, classic ASP.NET) the continuation runs on it. ASP.NET Core has none, and library code uses ConfigureAwait(false).
  2. Separate I/O-bound from CPU-bound work: await the async I/O APIs directly, and use Task.Run only to move CPU work off a UI thread. In ASP.NET Core, wrapping I/O in Task.Run just occupies a second pool thread.
  3. Name the anti-patterns and why they hurt: .Result or .Wait() blocks a thread, can deadlock under a single-threaded SynchronizationContext, and causes thread-pool starvation under load. async void is for event handlers only, because the caller cannot observe its exceptions.
  4. Control concurrency: Task.WhenAll for independent calls, SemaphoreSlim.WaitAsync or Parallel.ForEachAsync with MaxDegreeOfParallelism to bound fan-out, and Channel with bounded capacity for producer-consumer backpressure. Pass a CancellationToken through every layer.
  5. Handle shared state correctly: you cannot await inside a lock statement (compiler error CS1996), so use SemaphoreSlim(1, 1) for an async critical section. ValueTask suits hot paths that often complete synchronously, but must not be awaited twice.
Follow-up
  • Why can .Result deadlock in WinForms or classic ASP.NET but usually not in ASP.NET Core?
  • Two of five tasks passed to Task.WhenAll throw. What does await surface, and how do you get every exception?
  • Latency climbs under load while CPU stays low. How would you confirm thread-pool starvation? (For example, dotnet-counters thread-pool queue length and thread count.)

Track a rolling failure rate per destination for circuit decisions

easy
sliding windowring buffercircuit breaker

The egress service delivers about 1,500 webhooks per second across roughly 40,000 destinations, each call bounded by a 10 second timeout. Maintain, per destination, the failure rate over the trailing 60 seconds so a caller can ask before dispatch whether the circuit should open. Attempts arrive as (destination_id, finished_at_ms, outcome). Requirement: amortised O(1) per attempt, with total memory bounded by the destination count rather than by traffic. Give the structure, its exact memory, and the rule that stops a destination with three attempts from opening a circuit.

Approach
  1. Name the exact-deque version and then reject it as the default. Holding timestamps and advancing a tail pointer past anything older than now minus 60 seconds is a correct two-pointer window at amortised O(1) per attempt, but its memory tracks in-window traffic, so one destination in a retry storm holds hundreds of thousands of entries while thousands of quiet destinations hold none.
  2. Use a ring of 60 one-second buckets per destination, each bucket a pair of counters for attempts and failures. On an attempt, advance the ring by the elapsed whole seconds, zeroing at most min(elapsed, 60) buckets, then increment the head. That is amortised O(1) with a fixed footprint per destination.
  3. State the footprint: 60 buckets times two 4-byte counters is 480 bytes of payload per destination, so 40,000 destinations is roughly 20 to 25 MB with per-entry overhead, bounded by the catalogue rather than by the rate. The cost is granularity, since the oldest bucket ages out in whole seconds, which is far tighter than the decision needs.
  4. Require a minimum sample before the circuit may open. A destination with three attempts and three failures reads as 100 percent and is not evidence; a floor of roughly 20 attempts in the window makes the ratio meaningful, and below that floor use a run of consecutive failures as the trigger instead.
Follow-up
  • The fleet is 30 instances and each sees roughly a thirtieth of a destination's traffic. Where does the rate actually live, and what does a per-instance answer get wrong?
  • A destination answers in 9.5 seconds and succeeds. It is not failing but it is consuming your per-destination concurrency. What signal should open the circuit here?

Canonicalise a request body into a stable idempotency fingerprint

medium
parsingcanonicalisationhashing

idempotency_key.request_fingerprint is a SHA-256 over the method, path and canonicalised body, and a retry whose fingerprint differs must be rejected with 422 rather than served the stored response. Write the canonicaliser. Bodies are JSON up to 256 KB nested at most 32 levels; clients vary key order, whitespace and unicode escaping, and some send 64-bit ids as JSON numbers. Produce a deterministic byte string such that semantically identical bodies match and any semantic difference does not. State your complexity and name two normalisations you refuse to perform.

Approach
  1. Parse once into a tree, then re-serialise under fixed rules: object keys sorted, array order preserved, one escaping convention, no insignificant whitespace. Parsing is O(n) and sorting keys is O(k log k) per object, so O(n log n) overall with O(depth) stack, and the 32-level cap is enforced during parsing because hostile nesting is how a canonicaliser becomes a stack overflow.
  2. Sort keys by their UTF-8 bytes and say why the obvious implementation is wrong in some runtimes: a default string comparison that orders by UTF-16 code units places surrogate pairs, meaning code points from U+10000 up, below U+E000 to U+FFFF, which is not UTF-8 byte order, so two services written in different languages disagree on the same document.
  3. Do not re-encode numbers through a double. IEEE-754 binary64 represents integers exactly only up to 2^53, so normalising a 19-digit id through a float changes it, and 1 against 1.0 cannot be reconciled without deciding whether they are the same value. Preserve the literal token, and require ids as strings at the API boundary if you want them comparable.
  4. Reject duplicate keys rather than picking one. JSON permits them and parsers disagree, most keeping the last, so any choice you make ties the fingerprint to a parser detail that the code handling the request does not necessarily share.
Follow-up
  • A client sends the same logical request with an extra field your API ignores. Same key, different fingerprint, so you return 422. Is that the right answer?
  • Where does the fingerprint get computed relative to request decompression and the body-size limit?

The seven days follow the reported rounds: a story bank first, then the technical topics candidates report (async, API design, databases, messaging), then production and stability, then the executive and behavioral material, with PracHub practice drills attached where they fit.

Small steps. Visible outcomes.0 / 7 completed
ONE WEEK · YOUR PACE

Prepare, practise & reflect

One practical outcome each day. Spend longer where you need it.

0 / 7 done
01Map the loop and build a story bank
  • Write the three reported rounds (Recruiter Screen, Technical Discussions, Executive Discussions) and note what each is described as covering
  • List four or five of your projects and match each to a reported prompt: data-volume optimisation, production incident, deadline, disagreement, stakeholder explanation
  • Mark each listed requirement (.NET, API design, database interaction, RabbitMQ) with your strongest evidence and your largest gap

Deliverable: A one-page round map plus a table pairing each project with the prompts it can answer and the requirement gaps to close.

02Asynchronous programming in .NET
  • Write a small C# endpoint that calls two dependencies concurrently with Task.WhenAll, a cancellation token and a timeout
  • Reproduce the .Result deadlock and thread-pool starvation, then fix it with end-to-end async
  • Say aloud how you handle asynchronous programming in a .NET environment, covering I/O versus CPU work, ConfigureAwait and limiting parallelism

Deliverable: A working C# sample with a cancellation path, plus a spoken answer that covers runtime behaviour and the failure modes.

Practice prompt ↗
03API design and scalable backend services
  • Design the API for a high-throughput write path: idempotency keys, pagination, rate limits, versioning and error contracts
  • Sketch a scalable backend service separating read and write paths, with caching, queues and a stated consistency model
  • Do the PracHub drills on a rolling failure rate for circuit decisions and on a stable idempotency fingerprint for a request body

Deliverable: One API specification, one service diagram with named bottlenecks, and two solved practice drills.

Practice prompt ↗Practice prompt ↗Practice prompt ↗Practice prompt ↗
04Database interactions and performance
  • Take a slow query, read its execution plan, add or change an index and record before and after timings
  • List your checklist for database access from .NET: N+1 queries, batching, connection pooling, transaction scope, keyset pagination
  • Do the PracHub SQL drills on version gaps with window functions and on a per-tenant cap under concurrent creates

Deliverable: A before/after query-plan note, a database performance checklist, and two solved SQL drills.

Practice prompt ↗Practice prompt ↗Practice prompt ↗
05RabbitMQ, TDD and maintainable code
  • Build a producer and consumer with manual acks, a prefetch limit, retries and a dead-letter queue, then kill the consumer mid-message
  • Write a message handler test-first and note where TDD changed your design
  • Prepare a refactoring walkthrough for legacy code: characterisation tests, small steps, seams

Deliverable: A working messaging sample with a failure-test note, a test-first handler, and spoken answers on RabbitMQ experience, TDD and long-term code structure.

Practice prompt ↗Practice prompt ↗Practice prompt ↗
06Production debugging, data volume and stability
  • Write a production-debugging runbook: what changed, symptoms, metrics, logs and traces, bisect, mitigate, then root cause
  • Choose your best data-volume optimisation story and fill in baseline, bottleneck, change, result
  • Prepare a framework for features versus stability and technical debt, with the signals that would make you pause feature work

Deliverable: A one-page debugging sequence, a completed optimisation story with numbers, and a short decision framework for features versus stability.

Practice prompt ↗Practice prompt ↗Practice prompt ↗
07Executive and behavioral rehearsal
  • Answer aloud the tight-deadline, technical-disagreement and non-technical-stakeholder prompts using Situation, Task, Action, Result
  • Write and rehearse your answer on what motivates you about gaming and betting, including a view on customer impact
  • Read recent betting-industry news and write questions to ask about the team's technical challenges and roadmap

Deliverable: Four recorded or written behavioral answers, a motivation answer, and a list of questions for the executive stage.

Practice prompt ↗Practice prompt ↗Practice prompt ↗Practice prompt ↗

Expand any day for tasks and deliverables. Your progress is saved on this device.

Behavioral prompts reported for this loop combine team skills with engineering judgment: delivery under pressure, handling technical disagreement, explaining a hard problem to non-engineers, and motivation for the sector. Candidates are advised to use Situation, Task, Action, Result with specific actions and outcomes. Prepare each story around a decision you made and its measurable effect, rather than a team narrative.

What is your experience with messaging systems like RabbitMQ?

medium
Technical & Domain Expertise

What is your experience with messaging systems like RabbitMQ?

Approach
  1. Open with one system you owned: what produced messages, what consumed them, and what broke if a message was lost or repeated. If your exposure is small, say so and describe it accurately; a precise small example beats vague breadth.
  2. Cover RabbitMQ through decisions you made: exchange type (direct, topic or fanout) and the routing-key scheme, durable queues with persistent messages, and publisher confirms so a producer knows the broker has accepted a message.
  3. Describe consumer behaviour: manual acknowledgements instead of auto-ack, a prefetch limit so one slow consumer does not hoard messages, and competing consumers for throughput, with the cost that ordering is no longer guaranteed across them.
  4. Explain failure handling: delivery is at-least-once, so consumers must be idempotent (dedupe on a message id or write with an upsert), and a message that keeps failing goes to a dead-letter exchange after bounded retries instead of looping.
  5. If an event follows a database write, mention the outbox pattern so the row and the event cannot disagree, and say how you monitored queue depth, unacked counts and consumer lag.
Follow-up
  • A consumer crashes after doing the work but before acknowledging. What happens, and how does your code stay correct?
  • How do you stop a poison message from blocking a queue, and how do you replay dead-lettered messages safely?
  • When would you choose a database table or a log-based broker instead of RabbitMQ?

Describe a time you had to optimize a system to handle large volumes of data.

medium
System Design & Problem Solving

Describe a time you had to optimize a system to handle large volumes of data.

Approach
  1. Pick a case where you made the call, and begin with the baseline: data volume, request or row rates, and the metric that hurt (p95 latency, batch run time, queue backlog). Without a before number the result cannot be checked.
  2. Show how you found the bottleneck: profiling, query plans, slow-query logs or traces, and which hypothesis you discarded. Name the real cause, such as a missing index, row-by-row inserts, an unbounded query or a chatty service call.
  3. Describe the change and its alternatives: batching or bulk inserts, indexing or partitioning, keyset pagination, caching, moving work onto a queue, or archiving cold data. Say what each cost in complexity or staleness.
  4. Close with the measured result under the same load, how you guarded against regression (alert, load test, dashboard), and what you would do at the next tenfold growth.
Follow-up
  • How did you prove the bottleneck was where you thought it was before changing code?
  • What trade-off did the fix introduce, such as staleness or operational complexity?
  • What would break first if the data grew another tenfold?

Tell us about a time you had to meet a tight deadline under pressure.

medium
Behavioral & Team Dynamics

Tell us about a time you had to meet a tight deadline under pressure.

Approach
  1. Choose a deadline with real consequences and state it in one or two sentences, then spend the answer on your decisions: how you cut scope, what you sequenced first, and what you refused to cut.
  2. Show that you protected the risky path: tests on the money or data-integrity code, a rollback or feature flag, and a release that was reversible.
  3. Show communication: when you told stakeholders about the trade-off, what options you gave them, and what they agreed to drop.
  4. Say what happened afterwards: any shortcut you took, how it was recorded, and when it was repaid. The weak version is long hours and heroics with no judgment and no later cleanup.
Follow-up
  • What exactly did you cut, and who agreed to cut it?
  • Did the shortcut cause a problem later, and how did you handle it?
  • What would you change so the same crunch does not happen again?

How do you handle disagreements regarding technical direction within your team?

medium
Behavioral & Team Dynamics

How do you handle disagreements regarding technical direction within your team?

Approach
  1. Pick a disagreement between two defensible options, such as a queue versus a direct call, or a framework choice, and state the other person's strongest argument fairly before your own.
  2. Show how you moved from opinion to evidence: a small spike, a benchmark, a written design note with decision criteria, or a review with a third engineer.
  3. Describe the outcome honestly, including a time you changed your mind or lost. Disagree-and-commit works as a conclusion only if you then delivered the agreed direction properly.
  4. Avoid the story where you were simply right and the colleague was difficult; it shows no collaboration. Say what the relationship looked like afterwards.
Follow-up
  • What if the data had not settled it? How would the decision have been made?
  • Tell me about a time you were the one who was wrong.
  • How do you handle a disagreement with someone more senior than you?

Describe a situation where you had to explain a complex technical problem to a non-technical stakeholder.

medium
Behavioral & Team Dynamics

Describe a situation where you had to explain a complex technical problem to a non-technical stakeholder.

Approach
  1. Choose a real problem, such as an outage cause, a performance limit or a technical-debt trade-off, and name the person and the decision they had to make. The story is about that decision, not about the technology.
  2. Translate to their terms: customers affected, money or risk, time to fix. Use one accurate analogy and drop internal names, protocols and acronyms.
  3. Offer two or three options with cost and risk each, give your recommendation and say what you need from them.
  4. Check understanding by asking them to restate the decision, and follow up in writing. The weak version is simplifying so far that nothing was decided, or burying them in detail.
Follow-up
  • How did you know they understood the risk and not just the words?
  • What did you do when they pushed for a date you thought was unrealistic?
  • Which numbers or visuals did you show, and which did you leave out?

What motivates you to work in the gaming and betting industry?

medium
Behavioral & Team Dynamics

What motivates you to work in the gaming and betting industry?

Approach
  1. Give an honest, specific reason that connects to engineering: for example real-time data, bursty traffic around events, high availability, or correctness when money is involved. These are the challenges candidates are advised to read up on for betting and gaming platforms.
  2. Support it with your own evidence: a project where you handled spikes, idempotent payments or low-latency messaging, or the reading you did on the sector's technical problems.
  3. Show a considered view of the product's impact on customers rather than ignoring the ethics of betting. A short, calm, honest position is better than avoidance.
  4. Avoid money as the main motive, generic phrases about a fast pace, and invented fandom or specifics about the company that you cannot back up.
Follow-up
  • How do you think about the responsibility that comes with building betting products?
  • Which technical challenge in real-time betting platforms interests you most, and why?
  • What would you want to learn in the first months in this domain?
  • 01

    Tell us about a time you had to meet a tight deadline under pressure.

  • 02

    How do you handle disagreements regarding technical direction within your team?

  • 03

    Describe a situation where you had to explain a complex technical problem to a non-technical stakeholder.

  • 04

    What motivates you to work in the gaming and betting industry?

  • 05

    Describe a time a production system failed; what was your role in the resolution?

  • 06

    Describe a time you had to optimize a system to handle large volumes of data.

PracHub preparation framework ↗
How many rounds are there and how long does the process take?

Candidates report three rounds: a Recruiter Screen, Technical Discussions and Executive Discussions, over roughly 3-5 weeks. The process is said to vary with the team and the seniority of the role, so confirm the stages and format with your recruiter.

Betfred Software Engineer candidate reports ↗
What technical topics should I prioritise?

Start with the listed requirements: .NET and backend development, API design and database interaction. Then cover the reported topics: asynchronous programming, high-throughput design, TDD, production debugging, scalability and RabbitMQ messaging. For each, prepare a short explanation and an example from your own work.

PracHub Software Engineer practice ↗
Will I be coding or only discussing?

Candidates describe a mix of conceptual discussion and practical problem-solving, with reasoning valued over exact syntax. No take-home or coding platform is named, so ask the recruiter. Practise both explaining designs aloud and writing short C# snippets, such as an async method with cancellation or a message handler.

Betfred Software Engineer candidate reports ↗
Do I need RabbitMQ experience?

Messaging architectures such as RabbitMQ are listed as a nice-to-have, while .NET, API design and database knowledge are listed as must-haves. If you have not used it, learn the core concepts (exchanges, queues, acknowledgements, dead-lettering, idempotent consumers) and describe a comparable broker you know.

PracHub Software Engineer practice ↗
How should I prepare for the Executive Discussions?

They are described as high-level conversations on strategic thinking and team culture fit. Prepare trade-off stories (features versus stability, technical debt), a clear explanation of a technical problem for non-engineers, some current betting-industry awareness, and questions about the team's challenges and roadmap.

PracHub Software Engineer practice ↗
Which domain knowledge helps?

Candidates are told to understand the challenges of betting and gaming platforms, notably real-time data processing and high availability. Be ready to say how those constraints change choices such as idempotent message handling, caching and graceful degradation when a dependency is slow.

PracHub Software Engineer practice ↗
Sources & methodology 3 sources ↗

No official company page is cited. Rounds and questions come from candidate reports and PracHub editorial material; each source shows the date it was read.