# Chart.js - v4.0.1

# Enumerations

# Classes

# Interfaces

# Type Aliases

# Align

Ƭ Align: "start" | "center" | "end"

# Defined in

types/index.d.ts:1652 (opens new window)


# AnimationOptions

Ƭ AnimationOptions<TType>: Object

# Type parameters

Name Type
TType extends ChartType

# Type declaration

Name Type
animation false | AnimationSpec<TType> & { onComplete?: (this: Chart, event: AnimationEvent) => void ; onProgress?: (this: Chart, event: AnimationEvent) => void }
animations AnimationsSpec<TType>
transitions TransitionsSpec<TType>

# Defined in

types/index.d.ts:1609 (opens new window)


# AnimationSpec

Ƭ AnimationSpec<TType>: Object

# Type parameters

Name Type
TType extends ChartType

# Type declaration

Name Type Description
delay? Scriptable<number, ScriptableContext<TType>> Delay before starting the animations. Default 0
duration? Scriptable<number, ScriptableContext<TType>> The number of milliseconds an animation takes. Default 1000
easing? Scriptable<EasingFunction, ScriptableContext<TType>> Easing function to use Default 'easeOutQuart'
loop? Scriptable<boolean, ScriptableContext<TType>> If set to true, the animations loop endlessly. Default false

# Defined in

types/index.d.ts:1553 (opens new window)


# AnimationsSpec

Ƭ AnimationsSpec<TType>: Object

# Type parameters

Name Type
TType extends ChartType

# Index signature

▪ [name: string]: false | AnimationSpec<TType> & { fn: <T>(from: T, to: T, factor: number) => T ; from: Scriptable<Color | number | boolean, ScriptableContext<TType>> ; properties: string[] ; to: Scriptable<Color | number | boolean, ScriptableContext<TType>> ; type: "color" | "number" | "boolean" }

# Defined in

types/index.d.ts:1578 (opens new window)


# BarController

Ƭ BarController: DatasetController

# Defined in

types/index.d.ts:155 (opens new window)

types/index.d.ts:156 (opens new window)


# BubbleController

Ƭ BubbleController: DatasetController

# Defined in

types/index.d.ts:182 (opens new window)

types/index.d.ts:183 (opens new window)


# CartesianTickOptions

Ƭ CartesianTickOptions: TickOptions & { align: Align | "inner" ; autoSkip: boolean ; autoSkipPadding: number ; crossAlign: "near" | "center" | "far" ; includeBounds: boolean ; labelOffset: number ; maxRotation: number ; maxTicksLimit: number ; minRotation: number ; mirror: boolean ; padding: number ; sampleSize: number }

# Defined in

types/index.d.ts:2931 (opens new window)


# CategoryScale

Ƭ CategoryScale<O>: Scale<O>

# Type parameters

Name Type
O extends CategoryScaleOptions = CategoryScaleOptions

# Defined in

types/index.d.ts:3098 (opens new window)

types/index.d.ts:3099 (opens new window)


# CategoryScaleOptions

Ƭ CategoryScaleOptions: Omit<CartesianScaleOptions, "min" | "max"> & { labels: string[] | string[][] ; max: string | number ; min: string | number }

# Defined in

types/index.d.ts:3092 (opens new window)


# ChartComponentLike

Ƭ ChartComponentLike: ChartComponent | ChartComponent[] | { [key: string]: ChartComponent; } | Plugin | Plugin[]

# Defined in

types/index.d.ts:1116 (opens new window)


# ChartDataset

Ƭ ChartDataset<TType, TData>: DeepPartial<{ [key in ChartType]: Object & ChartTypeRegistry[key]["datasetOptions"] }[TType]> & ChartDatasetProperties<TType, TData>

# Type parameters

Name Type
TType extends ChartType = ChartType
TData DefaultDataPoint<TType>

# Defined in

types/index.d.ts:3601 (opens new window)


# ChartDatasetCustomTypesPerDataset

Ƭ ChartDatasetCustomTypesPerDataset<TType, TData>: DeepPartial<{ [key in ChartType]: Object & ChartTypeRegistry[key]["datasetOptions"] }[TType]> & ChartDatasetPropertiesCustomTypesPerDataset<TType, TData>

# Type parameters

Name Type
TType extends ChartType = ChartType
TData DefaultDataPoint<TType>

# Defined in

types/index.d.ts:3608 (opens new window)


# ChartItem

Ƭ ChartItem: string | CanvasRenderingContext2D | HTMLCanvasElement | { canvas: HTMLCanvasElement } | ArrayLike<CanvasRenderingContext2D | HTMLCanvasElement>

# Defined in

types/index.d.ts:560 (opens new window)


# ChartMeta

Ƭ ChartMeta<TType, TElement, TDatasetElement>: DeepPartial<{ [key in ChartType]: ChartTypeRegistry[key]["metaExtensions"] }[TType]> & ChartMetaCommon<TElement, TDatasetElement>

# Type parameters

Name Type
TType extends ChartType = ChartType
TElement extends Element = Element
TDatasetElement extends Element = Element

# Defined in

types/index.d.ts:466 (opens new window)


# ChartOptions

Ƭ ChartOptions<TType>: DeepPartial<CoreChartOptions<TType> & ElementChartOptions<TType> & PluginChartOptions<TType> & DatasetChartOptions<TType> & ScaleChartOptions<TType> & ChartTypeRegistry[TType]["chartOptions"]>

# Type parameters

Name Type
TType extends ChartType = ChartType

# Defined in

types/index.d.ts:3578 (opens new window)


# ChartType

Ƭ ChartType: keyof ChartTypeRegistry

# Defined in

types/index.d.ts:3557 (opens new window)


# Color

Ƭ Color: string | CanvasGradient | CanvasPattern

# Defined in

types/color.d.ts:1 (opens new window)


# DatasetChartOptions

Ƭ DatasetChartOptions<TType>: { [key in TType]: Object }

# Type parameters

Name Type
TType extends ChartType = ChartType

# Defined in

types/index.d.ts:3566 (opens new window)


# DecimationOptions

Ƭ DecimationOptions: LttbDecimationOptions | MinMaxDecimationOptions

# Defined in

types/index.d.ts:2067 (opens new window)


# DefaultDataPoint

Ƭ DefaultDataPoint<TType>: DistributiveArray<ChartTypeRegistry[TType]["defaultDataPoint"]>

# Type parameters

Name Type
TType extends ChartType

# Defined in

types/index.d.ts:3587 (opens new window)


# DoughnutDataPoint

Ƭ DoughnutDataPoint: number

# Defined in

types/index.d.ts:337 (opens new window)


# EasingFunction

Ƭ EasingFunction: keyof typeof effects

# Defined in

src/helpers/helpers.easing.ts:122 (opens new window)


# ElementChartOptions

Ƭ ElementChartOptions<TType>: Object

# Type parameters

Name Type
TType extends ChartType = ChartType

# Type declaration

Name Type
elements ElementOptionsByType<TType>

# Defined in

types/index.d.ts:1983 (opens new window)


# FillTarget

Ƭ FillTarget: number | string | { value: number } | "start" | "end" | "origin" | "stack" | "shape" | boolean

# Defined in

types/index.d.ts:2075 (opens new window)


# InteractionAxis

Ƭ InteractionAxis: "x" | "y" | "xy" | "r"

# Defined in

types/index.d.ts:1425 (opens new window)


# InteractionMode

Ƭ InteractionMode: keyof InteractionModeMap

# Defined in

types/index.d.ts:758 (opens new window)


# InteractionModeFunction

Ƭ InteractionModeFunction: (chart: Chart, e: ChartEvent, options: InteractionOptions, useFinalPosition?: boolean) => InteractionItem[]

# Type declaration

▸ (chart, e, options, useFinalPosition?): InteractionItem[]

# Parameters
Name Type
chart Chart
e ChartEvent
options InteractionOptions
useFinalPosition? boolean
# Returns

InteractionItem[]

# Defined in

types/index.d.ts:720 (opens new window)


# LayoutPosition

Ƭ LayoutPosition: "left" | "top" | "right" | "bottom" | "center" | "chartArea" | { [scaleId: string]: number; }

# Defined in

types/layout.d.ts:3 (opens new window)


# LineController

Ƭ LineController: DatasetController

# Defined in

types/index.d.ts:228 (opens new window)

types/index.d.ts:229 (opens new window)


# LinearScale

Ƭ LinearScale<O>: Scale<O>

# Type parameters

Name Type
O extends LinearScaleOptions = LinearScaleOptions

# Defined in

types/index.d.ts:3147 (opens new window)

types/index.d.ts:3148 (opens new window)


# LinearScaleOptions

Ƭ LinearScaleOptions: CartesianScaleOptions & { beginAtZero: boolean ; grace?: string | number ; suggestedMax?: number ; suggestedMin?: number ; ticks: { count: number ; format: Intl.NumberFormatOptions ; precision: number ; stepSize: number } }

# Defined in

types/index.d.ts:3104 (opens new window)


# LogarithmicScale

Ƭ LogarithmicScale<O>: Scale<O>

# Type parameters

Name Type
O extends LogarithmicScaleOptions = LogarithmicScaleOptions

# Defined in

types/index.d.ts:3171 (opens new window)

types/index.d.ts:3172 (opens new window)


# LogarithmicScaleOptions

Ƭ LogarithmicScaleOptions: CartesianScaleOptions & { suggestedMax?: number ; suggestedMin?: number ; ticks: { format: Intl.NumberFormatOptions } }

# Defined in

types/index.d.ts:3153 (opens new window)


# Overrides

Ƭ Overrides: { [key in ChartType]: CoreChartOptions<key> & ElementChartOptions<key> & PluginChartOptions<key> & DatasetChartOptions<ChartType> & ScaleChartOptions<key> & ChartTypeRegistry[key]["chartOptions"] }

# Defined in

types/index.d.ts:697 (opens new window)


# ParsedDataType

Ƭ ParsedDataType<TType>: ChartTypeRegistry[TType]["parsedDataType"]

# Type parameters

Name Type
TType extends ChartType = ChartType

# Defined in

types/index.d.ts:3589 (opens new window)


# PieAnimationOptions

Ƭ PieAnimationOptions: DoughnutAnimationOptions

# Defined in

types/index.d.ts:360 (opens new window)


# PieController

Ƭ PieController: DoughnutController

# Defined in

types/index.d.ts:365 (opens new window)

types/index.d.ts:366 (opens new window)


# PieControllerChartOptions

Ƭ PieControllerChartOptions: DoughnutControllerChartOptions

# Defined in

types/index.d.ts:359 (opens new window)


# PieControllerDatasetOptions

Ƭ PieControllerDatasetOptions: DoughnutControllerDatasetOptions

# Defined in

types/index.d.ts:358 (opens new window)


# PieDataPoint

Ƭ PieDataPoint: DoughnutDataPoint

# Defined in

types/index.d.ts:362 (opens new window)


# PieMetaExtensions

Ƭ PieMetaExtensions: DoughnutMetaExtensions

# Defined in

types/index.d.ts:363 (opens new window)


# PointProps

Ƭ PointProps: Point

# Defined in

src/elements/element.point.ts:18 (opens new window)


# PointStyle

Ƭ PointStyle: "circle" | "cross" | "crossRot" | "dash" | "line" | "rect" | "rectRounded" | "rectRot" | "star" | "triangle" | HTMLImageElement | HTMLCanvasElement

# Defined in

types/index.d.ts:1816 (opens new window)


# PolarAreaAnimationOptions

Ƭ PolarAreaAnimationOptions: DoughnutAnimationOptions

# Defined in

types/index.d.ts:379 (opens new window)


# RadarController

Ƭ RadarController: DatasetController

# Defined in

types/index.d.ts:426 (opens new window)

types/index.d.ts:427 (opens new window)


# RadarControllerChartOptions

Ƭ RadarControllerChartOptions: LineControllerChartOptions

# Defined in

types/index.d.ts:424 (opens new window)


# RadialLinearScaleOptions

Ƭ RadialLinearScaleOptions: CoreScaleOptions & { angleLines: { borderDash: Scriptable<number[], ScriptableScaleContext> ; borderDashOffset: Scriptable<number, ScriptableScaleContext> ; color: Scriptable<Color, ScriptableScaleContext> ; display: boolean ; lineWidth: Scriptable<number, ScriptableScaleContext> } ; animate: boolean ; beginAtZero: boolean ; grid: Partial<GridLineOptions> ; max: number ; min: number ; pointLabels: { backdropColor: Scriptable<Color, ScriptableScalePointLabelContext> ; backdropPadding: Scriptable<number | ChartArea, ScriptableScalePointLabelContext> ; borderRadius: Scriptable<number | BorderRadius, ScriptableScalePointLabelContext> ; callback: (label: string, index: number) => string | string[] | number | number[] ; centerPointLabels: boolean ; color: Scriptable<Color, ScriptableScalePointLabelContext> ; display: boolean ; font: ScriptableAndScriptableOptions<Partial<FontSpec>, ScriptableScalePointLabelContext> ; padding: Scriptable<number, ScriptableScalePointLabelContext> } ; startAngle: number ; suggestedMax: number ; suggestedMin: number ; ticks: RadialTickOptions }

# Defined in

types/index.d.ts:3301 (opens new window)


# RadialTickOptions

Ƭ RadialTickOptions: TickOptions & { count: number ; format: Intl.NumberFormatOptions ; maxTicksLimit: number ; precision: number ; stepSize: number }

# Defined in

types/index.d.ts:3273 (opens new window)


# ScaleChartOptions

Ƭ ScaleChartOptions<TType>: Object

# Type parameters

Name Type
TType extends ChartType = ChartType

# Type declaration

Name Type
scales { [key: string]: ScaleOptionsByType<ChartTypeRegistry[TType]["scales"]>; }

# Defined in

types/index.d.ts:3572 (opens new window)


# ScaleOptions

Ƭ ScaleOptions<TScale>: DeepPartial<ScaleOptionsByType<TScale>>

# Type parameters

Name Type
TScale extends ScaleType = ScaleType

# Defined in

types/index.d.ts:3564 (opens new window)


# ScaleOptionsByType

Ƭ ScaleOptionsByType<TScale>: { [key in ScaleType]: Object & ScaleTypeRegistry[key]["options"] }[TScale]

# Type parameters

Name Type
TScale extends ScaleType = ScaleType

# Defined in

types/index.d.ts:3559 (opens new window)


# ScaleType

Ƭ ScaleType: keyof ScaleTypeRegistry

# Defined in

types/index.d.ts:3456 (opens new window)


# ScatterController

Ƭ ScatterController: LineController

# Defined in

types/index.d.ts:240 (opens new window)

types/index.d.ts:241 (opens new window)


# ScatterControllerChartOptions

Ƭ ScatterControllerChartOptions: LineControllerChartOptions

# Defined in

types/index.d.ts:238 (opens new window)


# ScatterControllerDatasetOptions

Ƭ ScatterControllerDatasetOptions: LineControllerDatasetOptions

# Defined in

types/index.d.ts:234 (opens new window)


# Scriptable

Ƭ Scriptable<T, TContext>: T | (ctx: TContext, options: AnyObject) => T | undefined

# Type parameters

Name
T
TContext

# Defined in

types/index.d.ts:43 (opens new window)


# ScriptableAndArray

Ƭ ScriptableAndArray<T, TContext>: readonly T[] | Scriptable<T, TContext>

# Type parameters

Name
T
TContext

# Defined in

types/index.d.ts:46 (opens new window)


# ScriptableAndArrayOptions

Ƭ ScriptableAndArrayOptions<T, TContext>: { [P in keyof T]: ScriptableAndArray<T[P], TContext> }

# Type parameters

Name
T
TContext

# Defined in

types/index.d.ts:47 (opens new window)


# ScriptableAndScriptableOptions

Ƭ ScriptableAndScriptableOptions<T, TContext>: Scriptable<T, TContext> | ScriptableOptions<T, TContext>

# Type parameters

Name
T
TContext

# Defined in

types/index.d.ts:45 (opens new window)


# ScriptableOptions

Ƭ ScriptableOptions<T, TContext>: { [P in keyof T]: Scriptable<T[P], TContext> }

# Type parameters

Name
T
TContext

# Defined in

types/index.d.ts:44 (opens new window)


# TextAlign

Ƭ TextAlign: "left" | "center" | "right"

# Defined in

types/index.d.ts:1651 (opens new window)


# TimeScaleOptions

Ƭ TimeScaleOptions: Omit<CartesianScaleOptions, "min" | "max"> & { adapters: { date: unknown } ; bounds: "ticks" | "data" ; max: string | number ; min: string | number ; offsetAfterAutoskip: boolean ; suggestedMax: string | number ; suggestedMin: string | number ; ticks: { source: "labels" | "auto" | "data" } ; time: { displayFormats: { [key: string]: string; } ; isoWeekday: boolean | number ; minUnit: TimeUnit ; parser: string | (v: unknown) => number ; round: false | TimeUnit ; tooltipFormat: string ; unit: false | TimeUnit } }

# Defined in

types/index.d.ts:3177 (opens new window)


# TimeSeriesScale

Ƭ TimeSeriesScale<O>: TimeScale<O>

# Type parameters

Name Type
O extends TimeScaleOptions = TimeScaleOptions

# Defined in

types/index.d.ts:3267 (opens new window)

types/index.d.ts:3268 (opens new window)


# TooltipPositioner

Ƭ TooltipPositioner: keyof TooltipPositionerMap

# Defined in

types/index.d.ts:2493 (opens new window)


# TooltipPositionerFunction

Ƭ TooltipPositionerFunction<TType>: (this: TooltipModel<TType>, items: readonly ActiveElement[], eventPosition: Point) => TooltipPosition | false

# Type parameters

Name Type
TType extends ChartType

# Type declaration

▸ (this, items, eventPosition): TooltipPosition | false

# Parameters
Name Type
this TooltipModel<TType>
items readonly ActiveElement[]
eventPosition Point
# Returns

TooltipPosition | false

# Defined in

types/index.d.ts:2482 (opens new window)


# TooltipXAlignment

Ƭ TooltipXAlignment: "left" | "center" | "right"

# Defined in

types/index.d.ts:2393 (opens new window)


# TooltipYAlignment

Ƭ TooltipYAlignment: "top" | "center" | "bottom"

# Defined in

types/index.d.ts:2394 (opens new window)


# TransitionSpec

Ƭ TransitionSpec<TType>: Object

# Type parameters

Name Type
TType extends ChartType

# Type declaration

Name Type
animation AnimationSpec<TType>
animations AnimationsSpec<TType>

# Defined in

types/index.d.ts:1600 (opens new window)


# TransitionsSpec

Ƭ TransitionsSpec<TType>: Object

# Type parameters

Name Type
TType extends ChartType

# Index signature

▪ [mode: string]: TransitionSpec<TType>

# Defined in

types/index.d.ts:1605 (opens new window)


# UpdateMode

Ƭ UpdateMode: keyof typeof UpdateModeEnum

# Defined in

types/index.d.ts:577 (opens new window)

# Variables

# BarController

BarController: ChartComponent & { prototype: BarController }

# Defined in

types/index.d.ts:155 (opens new window)

types/index.d.ts:156 (opens new window)


# BarElement

BarElement: ChartComponent & { prototype: BarElement<BarProps, BarOptions> }

# Defined in

types/index.d.ts:1966 (opens new window)

types/index.d.ts:1971 (opens new window)


# BubbleController

BubbleController: ChartComponent & { prototype: BubbleController }

# Defined in

types/index.d.ts:182 (opens new window)

types/index.d.ts:183 (opens new window)


# CategoryScale

CategoryScale: ChartComponent & { prototype: CategoryScale<CategoryScaleOptions> }

# Defined in

types/index.d.ts:3098 (opens new window)

types/index.d.ts:3099 (opens new window)


# Decimation

Const Decimation: Plugin

# Defined in

types/index.d.ts:2047 (opens new window)


# DoughnutController

DoughnutController: ChartComponent & { prototype: DoughnutController }

# Defined in

types/index.d.ts:339 (opens new window)

types/index.d.ts:349 (opens new window)


# Filler

Const Filler: Plugin

# Defined in

types/index.d.ts:2069 (opens new window)


# Interaction

Const Interaction: Object

# Type declaration

Name Type
modes InteractionModeMap
evaluateInteractionItems (chart: Chart<keyof ChartTypeRegistry, (number | [number, number] | ScatterDataPoint | BubbleDataPoint)[], unknown>, axis: InteractionAxis, position: Point, handler: (element: default<AnyObject, AnyObject> & VisualElement, datasetIndex: number, index: number) => void, intersect?: boolean) => InteractionItem[]

# Defined in

types/index.d.ts:760 (opens new window)


# Legend

Const Legend: Plugin

# Defined in

types/index.d.ts:2099 (opens new window)


# LineController

LineController: ChartComponent & { prototype: LineController }

# Defined in

types/index.d.ts:228 (opens new window)

types/index.d.ts:229 (opens new window)


# LineElement

LineElement: ChartComponent & { prototype: LineElement<LineProps, LineOptions> }

# Defined in

types/index.d.ts:1798 (opens new window)

types/index.d.ts:1811 (opens new window)


# LinearScale

LinearScale: ChartComponent & { prototype: LinearScale<LinearScaleOptions> }

# Defined in

types/index.d.ts:3147 (opens new window)

types/index.d.ts:3148 (opens new window)


# LogarithmicScale

LogarithmicScale: ChartComponent & { prototype: LogarithmicScale<LogarithmicScaleOptions> }

# Defined in

types/index.d.ts:3171 (opens new window)

types/index.d.ts:3172 (opens new window)


# PieController

PieController: ChartComponent & { prototype: DoughnutController }

# Defined in

types/index.d.ts:365 (opens new window)

types/index.d.ts:366 (opens new window)


# PolarAreaController

PolarAreaController: ChartComponent & { prototype: PolarAreaController }

# Defined in

types/index.d.ts:391 (opens new window)

types/index.d.ts:394 (opens new window)


# RadarController

RadarController: ChartComponent & { prototype: RadarController }

# Defined in

types/index.d.ts:426 (opens new window)

types/index.d.ts:427 (opens new window)


# RadialLinearScale

RadialLinearScale: ChartComponent & { prototype: RadialLinearScale<RadialLinearScaleOptions> }

# Defined in

types/index.d.ts:3414 (opens new window)

types/index.d.ts:3424 (opens new window)


# ScatterController

ScatterController: ChartComponent & { prototype: LineController }

# Defined in

types/index.d.ts:240 (opens new window)

types/index.d.ts:241 (opens new window)


# SubTitle

Const SubTitle: Plugin

# Defined in

types/index.d.ts:2351 (opens new window)


# Ticks

Const Ticks: Object

# Type declaration

Name Type
formatters { logarithmic: (tickValue: number, index: number, ticks: { value: number }[]) => string ; numeric: (tickValue: number, index: number, ticks: { value: number }[]) => string ; values: (value: unknown) => string | string[] }
formatters.logarithmic [object Object]
formatters.numeric [object Object]
formatters.values [object Object]

# Defined in

types/index.d.ts:1359 (opens new window)


# TimeScale

TimeScale: ChartComponent & { prototype: TimeScale<TimeScaleOptions> }

# Defined in

types/index.d.ts:3256 (opens new window)

types/index.d.ts:3262 (opens new window)


# TimeSeriesScale

TimeSeriesScale: ChartComponent & { prototype: TimeSeriesScale<TimeScaleOptions> }

# Defined in

types/index.d.ts:3267 (opens new window)

types/index.d.ts:3268 (opens new window)


# Title

Const Title: Plugin

# Defined in

types/index.d.ts:2352 (opens new window)


# Tooltip

Tooltip: Tooltip

# Defined in

types/index.d.ts:2495 (opens new window)

types/index.d.ts:2499 (opens new window)


# defaults

Const defaults: Defaults

# Defined in

types/index.d.ts:707 (opens new window)


# layouts

Const layouts: Object

# Type declaration

Name Type
addBox (chart: Chart<keyof ChartTypeRegistry, (number | [number, number] | ScatterDataPoint | BubbleDataPoint)[], unknown>, item: LayoutItem) => void
configure (chart: Chart<keyof ChartTypeRegistry, (number | [number, number] | ScatterDataPoint | BubbleDataPoint)[], unknown>, item: LayoutItem, options: { fullSize?: number ; position?: LayoutPosition ; weight?: number }) => void
removeBox (chart: Chart<keyof ChartTypeRegistry, (number | [number, number] | ScatterDataPoint | BubbleDataPoint)[], unknown>, layoutItem: LayoutItem) => void
update (chart: Chart<keyof ChartTypeRegistry, (number | [number, number] | ScatterDataPoint | BubbleDataPoint)[], unknown>, width: number, height: number) => void

# Defined in

types/index.d.ts:775 (opens new window)


# registerables

Const registerables: readonly ChartComponentLike[]

# Defined in

types/index.d.ts:558 (opens new window)


# registry

Const registry: Registry

# Defined in

types/index.d.ts:1142 (opens new window)