Version: Next

Reading

Toggle Example Tables

We will be fictional "world" database in all of our examples.

Countries
idnameiso2population_range_millionsmain_exports
76BrazilBR( 205, 215 )[ beans, minerals ]
156ChinaCN( 1380, 1390 )[ computers, phones ]
250FranceFR( 60, 70 )[ cars, machines ]
554New ZealandNZ( 4, 6 )[ food, machines ]
556NigeriaNG( 185, 195 )[ oil, beans ]
840United StatesUS( 320, 330 )[ oil, cars, food ]
Cities
namecountry_id
Rio de Janeiro76
Beijing156
Paris250
Auckland554
Lagos556
Los Angeles840
San Francisco840

Getting your data

Shows how to get all cities from our public 'world' database
import { createClient } from '@supabase/supabase-js'
const supabase = createClient('https://world.supabase.co', 'public-key-bOYapLADERfE')
const getCities = async () => {
try {
let cities = await supabase
.from('cities')
.select('name, country_id')
return cities
} catch (error) {
console.log('Error: ', error)
}
}

Getting specific columns

Shows how to get all cities but only return the name
import { createClient } from '@supabase/supabase-js'
const supabase = createClient('https://world.supabase.co', 'public-key-bOYapLADERfE')
const getCities = async () => {
try {
let cities = await supabase
.from('cities')
.select('name')
return cities
} catch (error) {
console.log('Error: ', error)
}
}

Query foreign tables

Shows how to get all countries and the name of each of their cities
import { createClient } from '@supabase/supabase-js'
const supabase = createClient('https://world.supabase.co', 'public-key-bOYapLADERfE')
const getCountries = async () => {
try {
let countries = await supabase
.from('countries')
.select(`
name,
cities (
name
)
`)
return countries
} catch (error) {
console.log('Error: ', error)
}
}

Query the same foreign table multiple times

Sometimes you will need to query the same foreign table twice. In this case, you can use the name of the joined column to identify which join you intend to use. For convenience, you can also give an alias for each column. For example, if we had a shop of products, and we wanted to get the supplier and the purchaser at the same time (both in the users) table:

Shows how to reference a foreign table when it is referenced twice
import { createClient } from '@supabase/supabase-js'
const supabase = createClient('https://world.supabase.co', 'public-key-bOYapLADERfE')
const getProducts = async () => {
try {
let products = await supabase
.from('products')
.select(`
id,
supplier:supplier_id ( name ),
purchaser:purchaser_id ( name )
`)
return products
} catch (error) {
console.log('Error: ', error)
}
}

Quering JSON data

If you have data inside of a JSONB column, you can apply select and query filters to the data values. Postgres offers a number of operators for querying JSON data. Also see PostgREST docs for more details.

Shows how to reference a foreign table when it is referenced twice
import { createClient } from '@supabase/supabase-js'
const supabase = createClient('https://world.supabase.co', 'public-key-bOYapLADERfE')
const getCountries = async () => {
try {
let countries = await supabase
.from('countries')
.select(`
json_column_name->>population,
json_column_name->weather->>temperature
`)
return countries
} catch (error) {
console.log('Error: ', error)
}
}

Reference

from()

supabase
.from(tableName)

tableName: string

Name of the database table to be listened to. Using the wildcard "*" will lead to all tables to be listened to.

tableName: string

Name of the database table that will be read from.

tableName: string

Name of the database table where data will be saved.

tableName: string

Name of the database table where data will be updated.

tableName: string

Name of the database table where data will be deleted.


select()

General Form

supabase.from(tableName).select(columnQuery)

If '*' is passd in for columnQuery(i.e. .select('*')) then all columns in the table will be returned.

columnQuery: string

A comma separated list of columns. For example select('id, name')

If a foreign key constraint exists between this table and another, you can also query the columns of the related table. For example select('name, cities {name}')

Show detailed example
supabase
.from('countries')
.select(`
name,
cities {
name,
population
}
`)

order()

Shows how to use order( ) with select( )
import { createClient } from '@supabase/supabase-js'
const supabase = createClient('https://world.supabase.co', 'public-key-bOYapLADERfE')
const getCities = async () => {
try {
let cities = await supabase
.from('cities')
.select('name', 'country_id')
.order('id')
return cities
} catch (error) {
console.log('Error: ', error)
}
}

Shows how to use order( ) with select( ) and foreign tables present
import { createClient } from '@supabase/supabase-js'
const supabase = createClient('https://world.supabase.co', 'public-key-bOYapLADERfE')
const getCountries = async () => {
try {
let countries = await supabase
.from('countries')
.select('name, cities(name)')
.eq('name', 'United States')
.order('cities.name')
return countries
} catch (error) {
console.log('Error: ', error)
}
}

General Form

supabase.from(tableName).order(columnName, sortAscending, nullsFirst)

Orders your data before fetching.

columnName: string

Name of chosen column to base the order on.

sortAscending: boolean? | Default is false

Specifies whether the order will be ascending or descending.

nullsFirst: boolean? | Default is false

Specifies whether null values will be displayed first.


limit()

Shows how to use limit( ) with select( )
import { createClient } from '@supabase/supabase-js'
const supabase = createClient('https://world.supabase.co', 'public-key-bOYapLADERfE')
const getCities = async () => {
try {
let cities = await supabase
.from('cities')
.select('name, country_id')
.limit(1)
return cities
} catch (error) {
console.log('Error: ', error)
}
}

Shows how to use limit( ) and foreign tables present
import { createClient } from '@supabase/supabase-js'
const supabase = createClient('https://world.supabase.co', 'public-key-bOYapLADERfE')
const getCountries = async () => {
try {
let countries = await supabase
.from('cities')
.select('name, cities(name)')
.eq('name', 'United States')
.limit(1, 'cities')
return countries
} catch (error) {
console.log('Error: ', error)
}
}

General Form

supabase.from(tableName).limit(criteria, foreignTableName)

Orders your data before fetching.

criteria: number

Specifies number of items to be returned at most.

foreignTableName: string ? | Default is null

Name of chosen foreignTable to apply the limit on. Used if foreign tables are present.


offset()

Shows how to use offset( ) with select( )
import { createClient } from '@supabase/supabase-js'
const supabase = createClient('https://world.supabase.co', 'public-key-bOYapLADERfE')
const getCities = async () => {
try {
let cities = await supabase
.from('cities')
.select('name, country_id')
.offset(1)
return cities
} catch (error) {
console.log('Error: ', error)
}
}

Shows how to use offset( ) with select( ) and foreign tables present
import { createClient } from '@supabase/supabase-js'
const supabase = createClient('https://world.supabase.co', 'public-key-bOYapLADERfE')
const getCountries = async () => {
try {
let countries = await supabase
.from('cities')
.select('name, cities(name)')
.eq('name', 'United States')
.offset(1, 'cities')
return countries
} catch (error) {
console.log('Error: ', error)
}
}

General Form

supabase.from(tableName).offset(criteria, foreignTableName)

Orders your data before fetching.

criteria: number

Specifies number of items to be returned at most.

foreignTableName: string ? | Default is null

Name of chosen foreignTable to apply the limit on. Used if foreign tables are present.


range()

Shows how to use range( ) with select( )
import { createClient } from '@supabase/supabase-js'
const supabase = createClient('https://world.supabase.co', 'public-key-bOYapLADERfE')
const getCities = async () => {
try {
let cities = await supabase
.from('cities')
.select('name, country_id')
.range(0,3)
return cities
} catch (error) {
console.log('Error: ', error)
}
}

General Form

supabase.from(tableName).range(fromIndex, toIndex)

Paginates your request.

fromIndex: integer

Index or position of the start of the specified range.

toIndex: integer?

Index or position of the end of the specified range. If not stated, all remaining rows after the starting index will be returned.


single()

Shows how to use single( ) with select( )
import { createClient } from '@supabase/supabase-js'
const supabase = createClient('https://world.supabase.co', 'public-key-bOYapLADERfE')
const getCities = async () => {
try {
let cities = await supabase
.from('cities')
.select('name, country_id')
.single()
return cities
} catch (error) {
console.log('Error: ', error)
}
}

General Form

supabase.from(tableName).single()

Sets the header which signifies to PostgREST that the response must either be a single object with 200 OK. Otherwise, it will return an error with 406 Not Acceptable.


Filtering

filter()

Shows how to use filter( ) with select( )
import { createClient } from '@supabase/supabase-js'
const supabase = createClient('https://world.supabase.co', 'public-key-bOYapLADERfE')
const getCities = async () => {
try {
let cities = await supabase
.from('cities')
.select('name, country_id')
.filter('name', 'eq', 'Paris')
return cities
} catch (error) {
console.log('Error: ', error)
}
}

Shows how to use filter embedded tables
import { createClient } from '@supabase/supabase-js'
const supabase = createClient('https://world.supabase.co', 'public-key-bOYapLADERfE')
const getCities = async () => {
try {
let cities = await supabase
.from('cities')
.select('name, countries ( name )')
.filter('countries.name', 'eq', 'France')
return cities
} catch (error) {
console.log('Error: ', error)
}
}

General form

supabase
.from(tableName)
.filter(columnName, operator, criteria)

This allows you to apply various filters on your query. Filters can also be chained together.

columnName: string

Name of the database column.

operator: string

Name of filter operator to be utilised.

criteria: { object | array | string | integer | boolean | null }

Value to compare to. Exact data type of criteria would depend on the operator used.


not()

Shows how to use not( ) with select( )
import { createClient } from '@supabase/supabase-js'
const supabase = createClient('https://world.supabase.co', 'public-key-bOYapLADERfE')
const getCities = async () => {
try {
let cities = await supabase
.from('cities')
.select('name, country_id')
.not('name', 'eq', 'Paris')
return cities
} catch (error) {
console.log('Error: ', error)
}
}

General form

supabase
.from(tableName)
.not(columnName, operator, criteria)

Reverse of .filter(). Returns rows that do not meet the criteria specified using the columnName and operator provided.

columnName: string

Name of the database column.

operator: string

Name of filter operator to be utilised.

criteria: { object | array | string | integer | boolean | null }

Value to compare to. Exact data type of criteria would depend on the operator used.


or()

Shows how to use or( ) with select( )
import { createClient } from '@supabase/supabase-js'
const supabase = createClient('https://world.supabase.co', 'public-key-bOYapLADERfE')
const getCities = async () => {
try {
let cities = await supabase
.from('cities')
.select('name, country_id')
.or('id.gt.20,and(name.eq.New Zealand,name.eq.France)')
return cities
} catch (error) {
console.log('Error: ', error)
}
}

General form

supabase
.from(tableName)
.or(criteria)

To write append an OR filter, which should be made up of several other filters.

criteria: { string }

Filters to apply.


match()

Shows how to use match( ) with select( )
import { createClient } from '@supabase/supabase-js'
const supabase = createClient('https://world.supabase.co', 'public-key-bOYapLADERfE')
const getCities = async () => {
try {
let cities = await supabase
.from('cities')
.select('name, country_id')
.match({name: 'Beijing', country_id: 156})
return cities
} catch (error) {
console.log('Error: ', error)
}
}

General form

supabase
.from(tableName)
.match(filterObject)

Finds rows that exactly match the specified filterObject. Equivalent of multiple filter('columnName', 'eq', criteria).

filterObject: object

An object of { 'columnName': 'criteria' }


eq()

Shows how to use eq( ) with select( )
import { createClient } from '@supabase/supabase-js'
const supabase = createClient('https://world.supabase.co', 'public-key-bOYapLADERfE')
const getCities = async () => {
try {
let cities = await supabase
.from('cities')
.select('name, country_id')
.eq('name', 'San Francisco')
return cities
} catch (error) {
console.log('Error: ', error)
}
}

General form

supabase
.from(tableName)
.eq(columnName, filterValue)

Finds all rows whose value on the stated columnName exactly matches the specified filterValue. Equivalent of filter(columnName, 'eq', criteria).

columnName: string

Name of the database column.

filterValue: { string | integer | boolean }

Value to match.


neq()

Shows how to use neq( ) with select( )
import { createClient } from '@supabase/supabase-js'
const supabase = createClient('https://world.supabase.co', 'public-key-bOYapLADERfE')
const getCities = async () => {
try {
let cities = await supabase
.from('cities')
.select('name, country_id')
.neq('name', 'Lagos')
return cities
} catch (error) {
console.log('Error: ', error)
}
}

General form

supabase
.from(tableName)
.neq(columnName, filterValue)

Finds all rows whose value on the stated columnName does not match the specified filterValue. Equivalent of filter(columnName, 'neq', criteria).

columnName: string

Name of database column.

filterValue: { string | integer | boolean }

Value to not match.


gt()

Shows how to use gt( ) with select( )
import { createClient } from '@supabase/supabase-js'
const supabase = createClient('https://world.supabase.co', 'public-key-bOYapLADERfE')
const getCities = async () => {
try {
let cities = await supabase
.from('cities')
.select('name, country_id')
.gt('country_id', 250)
return cities
} catch (error) {
console.log('Error: ', error)
}
}

General form

supabase
.from(tableName)
.gt(columnName, filterValue)

Finds all rows whose value on the stated columnName is greater than the specified filterValue. Eqiuvalent of filter(columnName, 'gt', criteria).

columnName: string

Name of database column.

filterValue: { string | integer | boolean }

Value to compare to.


lt()

Shows how to use lt( ) with select( )
import { createClient } from '@supabase/supabase-js'
const supabase = createClient('https://world.supabase.co', 'public-key-bOYapLADERfE')
const getCities = async () => {
try {
let cities = await supabase
.from('cities')
.select('name, country_id')
.lt('country_id', 250)
return cities
} catch (error) {
console.log('Error: ', error)
}
}

General form

supabase
.from(tableName)
.lt(columnName, filterValue)

Finds all rows whose value on the stated columnName is less than the specified filterValue. Eqiuvalent of filter(columnName, 'lt', criteria).

columnName: string

Name of database column.

filterValue: { string | integer | boolean }

Value to compare to.


gte()

Shows how to use gte( ) with select( )
import { createClient } from '@supabase/supabase-js'
const supabase = createClient('https://world.supabase.co', 'public-key-bOYapLADERfE')
const getCities = async () => {
try {
let cities = await supabase
.from('cities')
.select('name, country_id')
.gte('country_id', 250)
return cities
} catch (error) {
console.log('Error: ', error)
}
}

General form

supabase
.from(tableName)
.gte(columnName, filterValue)

Finds all rows whose value on the stated columnName is greater than or equal to the specified filterValue. Eqiuvalent of filter(columnName, 'gte', criteria).

columnName: string

Name of database column.

filterValue: { string | integer | boolean }

Value to compare to.


lte()

Shows how to use lte( ) with select( )
import { createClient } from '@supabase/supabase-js'
const supabase = createClient('https://world.supabase.co', 'public-key-bOYapLADERfE')
const getCities = async () => {
try {
let cities = await supabase
.from('cities')
.select('name, country_id')
.lte('country_id', 250)
return cities
} catch (error) {
console.log('Error: ', error)
}
}

General form

supabase
.from(tableName)
.lte(columnName, filterValue)

Finds all rows whose value on the stated columnName is less than or equal to the specified filterValue. Eqiuvalent of filter(columnName, 'lte', criteria).

columnName: string

Name of database column.

filterValue: { string | integer | boolean }

Value to compare to.


like()

Shows how to use like( ) with select( )
import { createClient } from '@supabase/supabase-js'
const supabase = createClient('https://world.supabase.co', 'public-key-bOYapLADERfE')
const getCities = async () => {
try {
let cities = await supabase
.from('cities')
.select('name, country_id')
.like('name', '%la%')
return cities
} catch (error) {
console.log('Error: ', error)
}
}

General form

supabase
.from(tableName)
.like(columnName, stringPattern)

Finds all rows whose value in the stated columnName matches the supplied pattern. Equivalent of filter(columnName, 'like', stringPattern).

columnName: string

Name of database column.

stringPattern: string

String pattern to compare to. A comprehensive guide on how to form proper patterns can be found here.


ilike()

Shows how to use ilike( ) with select( )
import { createClient } from '@supabase/supabase-js'
const supabase = createClient('https://world.supabase.co', 'public-key-bOYapLADERfE')
const getCities = async () => {
try {
let cities = await supabase
.from('cities')
.select('name, country_id')
.ilike('name', '%la%')
return cities
} catch (error) {
console.log('Error: ', error)
}
}

General form

supabase
.from(tableName)
.ilike(columnName, stringPattern)

A case-sensitive version of like(). Equivalent of filter(columnName, 'ilike', stringPattern).

columnName: string

Name of database column.

stringPattern: string

String pattern to compare to. A comprehensive guide on how to form proper patterns can be found here.


is()

Shows how to use is( ) with select( )
import { createClient } from '@supabase/supabase-js'
const supabase = createClient('https://world.supabase.co', 'public-key-bOYapLADERfE')
const getCities = async () => {
try {
let cities = await supabase
.from('cities')
.select('name, country_id')
.is('name', null)
return cities
} catch (error) {
console.log('Error: ', error)
}
}

General form

supabase
.from(tableName)
.is(columnName, filterValue)

A check for exact equality (null, true, false), finds all rows whose value on the state columnName exactly match the specified filterValue. Equivalent of filter(columnName, 'is', filterValue).

columnName: string

Name of database column.

filterValue: { null | boolean }

Value to match.


in()

Shows how to use in( ) with select( )
import { createClient } from '@supabase/supabase-js'
const supabase = createClient('https://world.supabase.co', 'public-key-bOYapLADERfE')
const getCities = async () => {
try {
let cities = await supabase
.from('cities')
.select('name, country_id')
.in('name', ['Rio de Janeiro', 'San Francisco'])
return cities
} catch (error) {
console.log('Error: ', error)
}
}

General form

supabase
.from(tableName)
.in(columnName, filterArray)

Finds all rows whose value on the stated columnName is found on the specified filterArray. Equivalent of filter(columnName, 'in', criteria).

columnName: string

Name of database column.

filterArray: array

Array of values to find a match. Data type of values is dependent on the columnName specified.


cs()

Shows how to use cs( ) with select( )
import { createClient } from '@supabase/supabase-js'
const supabase = createClient('https://world.supabase.co', 'public-key-bOYapLADERfE')
const getCountries = async () => {
try {
let countries = await supabase
.from('countries')
.select('name, id, main_exports')
.cs('main_exports', ['oil'])
return countries
} catch (error) {
console.log('Error: ', error)
}
}

General form

supabase
.from(tableName)
.cs(columnName, filterObject)

Finds all rows whose json, array, or range value on the stated columnName contains the items specified in the filterObject. Equivalent of filter(columName, 'cs', criteria).

columnName: string

Name of the database column.

filterObject: { array | object }

Value to compare to.


cd()

Shows how to use cd( ) with select( )
import { createClient } from '@supabase/supabase-js'
const supabase = createClient('https://world.supabase.co', 'public-key-bOYapLADERfE')
const getCountries = async () => {
try {
let countries = await supabase
.from('countries')
.select('name, id, main_exports')
.cd('main_exports', ['cars', 'food', 'machine'])
return countries
} catch (error) {
console.log('Error: ', error)
}
}

General form

supabase
.from(tableName)
.cd(columnName, filterObject)

Finds all rows whose json, array, or range value on the stated columnName is contained by the specific filterObject. Equivalent of filter(columName, 'cd', criteria).

columnName: string

Name of the database column.

filterObject: { array | object }

Value to compare to.


ova()

Shows how to use ova( ) with select( )
import { createClient } from '@supabase/supabase-js'
const supabase = createClient('https://world.supabase.co', 'public-key-bOYapLADERfE')
const getCountries = async () => {
try {
let countries = await supabase
.from('countries')
.select('name, id, main_exports')
.ova('main_exports', ['computers', 'minerals'])
return countries
} catch (error) {
console.log('Error: ', error)
}
}

General form

supabase
.from(tableName)
.ova(columnName, filterArray)

Finds all rows whose array value on the stated columnName overlaps with the specified filterArray. Equivalent of filter(columnName, 'ova', criteria).

columnName: string

Name of the database column.

filterArray: array

Value to compare to.


ovr()

Shows how to use ovr( ) with select( )
import { createClient } from '@supabase/supabase-js'
const supabase = createClient('https://world.supabase.co', 'public-key-bOYapLADERfE')
const getCountries = async () => {
try {
let countries = await supabase
.from('countries')
.select('name, id, population_range_millions')
.ovr('population_range_millions', [150, 250])
return countries
} catch (error) {
console.log('Error: ', error)
}
}

General form

supabase
.from(tableName)
.ovr(columnName, filterRange)

Finds all rows whose range value on the stated columnName overlaps with the specified filterRange. Equivalent of filter(columnName, 'ovr', criteria).

columnName: string

Name of the database column.

filterRange: array

Array to compare to. Returns an error if length of array provided is not equal to 2.


sl()

Shows how to use sl( ) with select( )
import { createClient } from '@supabase/supabase-js'
const supabase = createClient('https://world.supabase.co', 'public-key-bOYapLADERfE')
const getCountries = async () => {
try {
let countries = await supabase
.from('countries')
.select('name, id, population_range_millions')
.sl('population_range_millions', [150, 250])
return countries
} catch (error) {
console.log('Error: ', error)
}
}

General form

supabase
.from(tableName)
.sl(columnName, filterRange)

Finds all rows whose range value on the stated columnName is strictly on the left hand side of the specified filterRange. Equivalent of filter(columnName, 'sl', criteria).

columnName: string

Name of the database column.

filterRange: array

Array to compare to. Returns an error if length of array provided is not equal to 2.


sr()

Shows how to use sr( ) with select( )
import { createClient } from '@supabase/supabase-js'
const supabase = createClient('https://world.supabase.co', 'public-key-bOYapLADERfE')
const getCountries = async () => {
try {
let countries = await supabase
.from('countries')
.select('name, id, population_range_millions')
.sr('population_range_millions', [150, 250])
return countries
} catch (error) {
console.log('Error: ', error)
}
}

General form

supabase
.from(tableName)
.sr(columnName, filterRange)

Finds all rows whose range value on the stated columnName is strictly on the right hand side of the specified filterRange. Equivalent of filter(columnName, 'sr', criteria).

columnName: string

Name of the database column.

filterRange: array

Array to compare to. Returns an error if length of array provided is not equal to 2.


nxl()

Shows how to use nxl( ) with select( )
import { createClient } from '@supabase/supabase-js'
const supabase = createClient('https://world.supabase.co', 'public-key-bOYapLADERfE')
const getCountries = async () => {
try {
let countries = await supabase
.from('countries')
.select('name, id, population_range_millions')
.nxl('population_range_millions', [150, 250])
return countries
} catch (error) {
console.log('Error: ', error)
}
}

General form

supabase
.from(tableName)
.nxl(columnName, filterRange)

Finds all rows whose range value on the stated columnName does not extend to the left of the specified filterRange. Equivalent of filter(columnName, 'nxl', criteria).

columnName: string

Name of the database column.

filterRange: array

Array to compare to. Returns an error if length of array provided is not equal to 2.


nxr()

Shows how to use nxr( ) with select( )
import { createClient } from '@supabase/supabase-js'
const supabase = createClient('https://world.supabase.co', 'public-key-bOYapLADERfE')
const getCountries = async () => {
try {
let countries = await supabase
.from('countries')
.select('name, id, population_range_millions')
.nxr('population_range_millions', [150, 250])
return countries
} catch (error) {
console.log('Error: ', error)
}
}

General form

supabase
.from(tableName)
.nxr(columnName, filterRange)

Finds all rows whose range value on the stated columnName does not extend to the right of the specified filterRange. Equivalent of filter(columnName, 'nxr', criteria).

columnName: string

Name of the database column.

filterRange: array

Array to compare to. Returns an error if length of array provided is not equal to 2.


adj()

Shows how to use adj( ) with select( )
import { createClient } from '@supabase/supabase-js'
const supabase = createClient('https://world.supabase.co', 'public-key-bOYapLADERfE')
const getCountries = async () => {
try {
let countries = await supabase
.from('countries')
.select('name, id, population_range_millions')
.adj('population_range_millions', [70, 185])
return countries
} catch (error) {
console.log('Error: ', error)
}
}

General form

supabase
.from(tableName)
.adj(columnName, filterRange)

Finds all rows whose range value on the stated columnName is adjacent to the specified filterRange. Equivalent of filter(columnName, 'adj', criteria).

columnName: string

Name of the database column.

filterRange: array

Array to compare to. Returns an error if length of array provided is not equal to 2.


Responses

200 OK

Successful request

400 Bad request

An invalid syntax or configuration was sent.

401 Unauthorized

Invalid credentials were provided.

404 Not found

Requested resource cannot be found.

406 Not acceptable

The response provided by the server does not match the list of acceptable values stated in the request's headers.

409 Violating foreign key constraint

Raised when you are trying to insert or update into a table with a foreign key which doesn't exist on the target foreign relationship.

500 Internal Server Error

The server was unable to encounter the situation it encountered.