comics-api

An ApolloServer powered GraphQL API for serving comic data from the comics PostgreSQL database.

API Endpoints
https://comics-api.thewhitehouse.dev
Version

main

Queries

bag

Description

Returns a single Bag by its bagId.

Response

Returns a Bag

Arguments
Name Description
bagId - ID!

Example

Query
query bag($bagId: ID!) {
  bag(bagId: $bagId) {
    bagId
    manufacturer
    era
    material
    thickness
    dimensions
    isResealable
    isThick
    hasAcid
  }
}
Variables
{"bagId": "4"}
Response
{
  "data": {
    "bag": {
      "bagId": "4",
      "manufacturer": "abc123",
      "era": "abc123",
      "material": "abc123",
      "thickness": 123,
      "dimensions": "xyz789",
      "isResealable": false,
      "isThick": false,
      "hasAcid": false
    }
  }
}

bags

Description

Returns a List of all Bags.

Response

Returns [Bag!]!

Example

Query
query bags {
  bags {
    bagId
    manufacturer
    era
    material
    thickness
    dimensions
    isResealable
    isThick
    hasAcid
  }
}
Response
{
  "data": {
    "bags": [
      {
        "bagId": "4",
        "manufacturer": "xyz789",
        "era": "xyz789",
        "material": "xyz789",
        "thickness": 987,
        "dimensions": "xyz789",
        "isResealable": true,
        "isThick": true,
        "hasAcid": false
      }
    ]
  }
}

board

Description

Returns a single Board.

Response

Returns a Board

Arguments
Name Description
boardId - ID!

Example

Query
query board($boardId: ID!) {
  board(boardId: $boardId) {
    boardId
    manufacturer
    era
    thickness
    dimensions
    hasAcid
  }
}
Variables
{"boardId": "4"}
Response
{
  "data": {
    "board": {
      "boardId": "4",
      "manufacturer": "xyz789",
      "era": "xyz789",
      "thickness": 987,
      "dimensions": "xyz789",
      "hasAcid": false
    }
  }
}

boards

Description

Returns a List of all Boards.

Response

Returns [Board!]!

Example

Query
query boards {
  boards {
    boardId
    manufacturer
    era
    thickness
    dimensions
    hasAcid
  }
}
Response
{
  "data": {
    "boards": [
      {
        "boardId": 4,
        "manufacturer": "xyz789",
        "era": "abc123",
        "thickness": 987,
        "dimensions": "xyz789",
        "hasAcid": false
      }
    ]
  }
}

box

Description

Returns a single Box by its boxId.

Response

Returns a Box

Arguments
Name Description
boxId - ID!

Example

Query
query box($boxId: ID!) {
  box(boxId: $boxId) {
    boxId
    name
    size
    color
    material
    comics {
      ...ComicFragment
    }
  }
}
Variables
{"boxId": 4}
Response
{
  "data": {
    "box": {
      "boxId": "4",
      "name": "abc123",
      "size": "SHORT",
      "color": "abc123",
      "material": "abc123",
      "comics": [Comic]
    }
  }
}

boxes

Description

Returns a List of all Boxes.

Response

Returns [Box!]!

Example

Query
query boxes {
  boxes {
    boxId
    name
    size
    color
    material
    comics {
      ...ComicFragment
    }
  }
}
Response
{
  "data": {
    "boxes": [
      {
        "boxId": 4,
        "name": "xyz789",
        "size": "SHORT",
        "color": "abc123",
        "material": "abc123",
        "comics": [Comic]
      }
    ]
  }
}

comic

Response

Returns a Comic

Arguments
Name Description
comicId - ID!

Example

Query
query comic($comicId: ID!) {
  comic(comicId: $comicId) {
    comicId
    series {
      ...SeriesFragment
    }
    title
    issue
    cover
    printing
    distribution
    type
    releaseDate
    price
    upc
    isbn
    notes
    box {
      ...BoxFragment
    }
    transaction {
      ...TransactionFragment
    }
    purchasePrice
    event {
      ...EventFragment
    }
    bag {
      ...BagFragment
    }
    board {
      ...BoardFragment
    }
  }
}
Variables
{"comicId": 4}
Response
{
  "data": {
    "comic": {
      "comicId": 4,
      "series": Series,
      "title": "abc123",
      "issue": 123.45,
      "cover": 987,
      "printing": 987,
      "distribution": "DIRECT",
      "type": "ISSUE",
      "releaseDate": "xyz789",
      "price": 123.45,
      "upc": "abc123",
      "isbn": "xyz789",
      "notes": "xyz789",
      "box": Box,
      "transaction": Transaction,
      "purchasePrice": 123.45,
      "event": Event,
      "bag": Bag,
      "board": Board
    }
  }
}

comics

Description

Returns a List of all Comics.

Response

Returns [Comic!]!

Example

Query
query comics {
  comics {
    comicId
    series {
      ...SeriesFragment
    }
    title
    issue
    cover
    printing
    distribution
    type
    releaseDate
    price
    upc
    isbn
    notes
    box {
      ...BoxFragment
    }
    transaction {
      ...TransactionFragment
    }
    purchasePrice
    event {
      ...EventFragment
    }
    bag {
      ...BagFragment
    }
    board {
      ...BoardFragment
    }
  }
}
Response
{
  "data": {
    "comics": [
      {
        "comicId": 4,
        "series": Series,
        "title": "abc123",
        "issue": 987.65,
        "cover": 987,
        "printing": 987,
        "distribution": "DIRECT",
        "type": "ISSUE",
        "releaseDate": "xyz789",
        "price": 123.45,
        "upc": "xyz789",
        "isbn": "abc123",
        "notes": "abc123",
        "box": Box,
        "transaction": Transaction,
        "purchasePrice": 987.65,
        "event": Event,
        "bag": Bag,
        "board": Board
      }
    ]
  }
}

event

Description

Returns a single Event by its eventId.

Response

Returns an Event

Arguments
Name Description
eventId - ID!

Example

Query
query event($eventId: ID!) {
  event(eventId: $eventId) {
    eventId
    publisher
    name
    description
    startDate
    endDate
    comics {
      ...EventComicFragment
    }
  }
}
Variables
{"eventId": 4}
Response
{
  "data": {
    "event": {
      "eventId": "4",
      "publisher": "xyz789",
      "name": "abc123",
      "description": "xyz789",
      "startDate": "xyz789",
      "endDate": "xyz789",
      "comics": [EventComic]
    }
  }
}

events

Description

Returns a List of all Events.

Response

Returns [Event!]!

Example

Query
query events {
  events {
    eventId
    publisher
    name
    description
    startDate
    endDate
    comics {
      ...EventComicFragment
    }
  }
}
Response
{
  "data": {
    "events": [
      {
        "eventId": "4",
        "publisher": "abc123",
        "name": "abc123",
        "description": "abc123",
        "startDate": "abc123",
        "endDate": "abc123",
        "comics": [EventComic]
      }
    ]
  }
}

genre

Description

Returns a single Genre by its genreId.

Response

Returns a Genre

Arguments
Name Description
genreId - ID!

Example

Query
query genre($genreId: ID!) {
  genre(genreId: $genreId) {
    genreId
    name
  }
}
Variables
{"genreId": 4}
Response
{
  "data": {
    "genre": {
      "genreId": 4,
      "name": "abc123"
    }
  }
}

genres

Description

Returns a List of all Genres.

Response

Returns [Genre!]!

Example

Query
query genres {
  genres {
    genreId
    name
  }
}
Response
{
  "data": {
    "genres": [
      {
        "genreId": "4",
        "name": "abc123"
      }
    ]
  }
}

me

Description

Returns the current User.

Response

Returns a User!

Example

Query
query me {
  me {
    isAdmin
  }
}
Response
{"data": {"me": {"isAdmin": false}}}

sere

Description

Returns a single Series by its seriesId

Response

Returns a Series

Arguments
Name Description
seriesId - ID!

Example

Query
query sere($seriesId: ID!) {
  sere(seriesId: $seriesId) {
    seriesId
    publisher
    imprint
    name
    type
    volume
    age
    startYear
    endYear
    genres {
      ...GenreFragment
    }
    comics {
      ...ComicFragment
    }
  }
}
Variables
{"seriesId": "4"}
Response
{
  "data": {
    "sere": {
      "seriesId": "4",
      "publisher": "xyz789",
      "imprint": "xyz789",
      "name": "abc123",
      "type": "COLLECTION",
      "volume": 123,
      "age": "PLATINUM",
      "startYear": 123,
      "endYear": 987,
      "genres": [Genre],
      "comics": [Comic]
    }
  }
}

series

Description

Returns List of all Series.

Response

Returns [Series!]!

Example

Query
query series {
  series {
    seriesId
    publisher
    imprint
    name
    type
    volume
    age
    startYear
    endYear
    genres {
      ...GenreFragment
    }
    comics {
      ...ComicFragment
    }
  }
}
Response
{
  "data": {
    "series": [
      {
        "seriesId": "4",
        "publisher": "abc123",
        "imprint": "abc123",
        "name": "xyz789",
        "type": "COLLECTION",
        "volume": 987,
        "age": "PLATINUM",
        "startYear": 987,
        "endYear": 123,
        "genres": [Genre],
        "comics": [Comic]
      }
    ]
  }
}

shop

Description

Returns a single Shop by its shopId.

Response

Returns a Shop

Arguments
Name Description
shopId - ID!

Example

Query
query shop($shopId: ID!) {
  shop(shopId: $shopId) {
    shopId
    name
    type
    city
    state
    country
    zip
    transactions {
      ...TransactionFragment
    }
  }
}
Variables
{"shopId": "4"}
Response
{
  "data": {
    "shop": {
      "shopId": "4",
      "name": "abc123",
      "type": "BOOKSTORE",
      "city": "abc123",
      "state": "xyz789",
      "country": "xyz789",
      "zip": "xyz789",
      "transactions": [Transaction]
    }
  }
}

shops

Description

Returns a List of all Shops.

Response

Returns [Shop!]!

Example

Query
query shops {
  shops {
    shopId
    name
    type
    city
    state
    country
    zip
    transactions {
      ...TransactionFragment
    }
  }
}
Response
{
  "data": {
    "shops": [
      {
        "shopId": "4",
        "name": "xyz789",
        "type": "BOOKSTORE",
        "city": "xyz789",
        "state": "xyz789",
        "country": "abc123",
        "zip": "abc123",
        "transactions": [Transaction]
      }
    ]
  }
}

transaction

Description

Returns a single Transaction by its txId

Response

Returns a Transaction

Arguments
Name Description
txId - ID!

Example

Query
query transaction($txId: ID!) {
  transaction(txId: $txId) {
    txId
    date
    total
    taxRate
    discount
    method
    shop {
      ...ShopFragment
    }
    notes
    comics {
      ...ComicFragment
    }
  }
}
Variables
{"txId": 4}
Response
{
  "data": {
    "transaction": {
      "txId": "4",
      "date": "abc123",
      "total": 987.65,
      "taxRate": 123.45,
      "discount": 123.45,
      "method": "CARD",
      "shop": Shop,
      "notes": "abc123",
      "comics": [Comic]
    }
  }
}

transactions

Description

Returns a List of all Transactions.

Response

Returns [Transaction!]!

Example

Query
query transactions {
  transactions {
    txId
    date
    total
    taxRate
    discount
    method
    shop {
      ...ShopFragment
    }
    notes
    comics {
      ...ComicFragment
    }
  }
}
Response
{
  "data": {
    "transactions": [
      {
        "txId": 4,
        "date": "abc123",
        "total": 987.65,
        "taxRate": 123.45,
        "discount": 123.45,
        "method": "CARD",
        "shop": Shop,
        "notes": "xyz789",
        "comics": [Comic]
      }
    ]
  }
}

Mutations

addBox

Description

Creates and returns a new Box.

Response

Returns a Box

Arguments
Name Description
box - AddBox!

Example

Query
mutation addBox($box: AddBox!) {
  addBox(box: $box) {
    boxId
    name
    size
    color
    material
    comics {
      ...ComicFragment
    }
  }
}
Variables
{"box": AddBox}
Response
{
  "data": {
    "addBox": {
      "boxId": "4",
      "name": "xyz789",
      "size": "SHORT",
      "color": "xyz789",
      "material": "xyz789",
      "comics": [Comic]
    }
  }
}

addGenre

Description

Creates and returns a s new Genre.

Response

Returns a Genre

Arguments
Name Description
genre - AddGenre!

Example

Query
mutation addGenre($genre: AddGenre!) {
  addGenre(genre: $genre) {
    genreId
    name
  }
}
Variables
{"genre": AddGenre}
Response
{
  "data": {
    "addGenre": {
      "genreId": "4",
      "name": "abc123"
    }
  }
}

addShop

Description

Creates and returns a new Shop.

Response

Returns a Shop

Arguments
Name Description
shop - AddShop!

Example

Query
mutation addShop($shop: AddShop!) {
  addShop(shop: $shop) {
    shopId
    name
    type
    city
    state
    country
    zip
    transactions {
      ...TransactionFragment
    }
  }
}
Variables
{"shop": AddShop}
Response
{
  "data": {
    "addShop": {
      "shopId": 4,
      "name": "abc123",
      "type": "BOOKSTORE",
      "city": "abc123",
      "state": "xyz789",
      "country": "abc123",
      "zip": "abc123",
      "transactions": [Transaction]
    }
  }
}

Types

AddBox

Description

Fields available to addBox mutation.

Fields
Input Field Description
name - String! The name of the Box.
size - BoxSize! The size of the Box. See BoxSize.
color - String! The color of the Box.
material - String! The material the box is made out of.
Example
{
  "name": "abc123",
  "size": "SHORT",
  "color": "xyz789",
  "material": "xyz789"
}

AddGenre

Description

Fields available for addGenre mutation.

Fields
Input Field Description
name - String The name of the genre.
Example
{"name": "abc123"}

AddShop

Description

Fields available for addShop mutation.

Fields
Input Field Description
name - String! The name of the Shop.
type - ShopType! The type of Shop. See ShopType.
city - String The name of the city the Shop is located in.
state - String The 2 letter abbreviation of the state the Shop is located in.
country - String The ISO 3166-1 alpha-2 code of the country the Shop is located in.
zip - String The zip code of the Shop. US only.
Example
{
  "name": "xyz789",
  "type": "BOOKSTORE",
  "city": "xyz789",
  "state": "abc123",
  "country": "xyz789",
  "zip": "abc123"
}

Bag

Description

A Bag that stores comics.

Fields
Field Name Description
bagId - ID! Uniquely identifies a Bag.
manufacturer - String! The company that manufacturers the Bag.
era - String! The era of comics that fit in this Bag.
material - String! The material the Bag is made of. Typically mylar or a poly- material.
thickness - Int! The thickness in millimeters of the Bag.
dimensions - String! The width x height of the Bag.
isResealable - Boolean! Indicates if the Bag has a resealable flap.
isThick - Boolean! Indicates if the Bag is for thick comics.
hasAcid - Boolean! Indicates if the Bag is made with chemicals or materials that contain acid.
Example
{
  "bagId": "4",
  "manufacturer": "abc123",
  "era": "xyz789",
  "material": "abc123",
  "thickness": 123,
  "dimensions": "xyz789",
  "isResealable": true,
  "isThick": true,
  "hasAcid": false
}

Board

Description

A Board that supports/backs a Comic in a Bag.

Fields
Field Name Description
boardId - ID! Uniquely identifies a Board.
manufacturer - String! The company that manufacturers the Board.
era - String! The era of comics that fit in this Board.
thickness - Int! The thickness in millimeters of the Board.
dimensions - String! The width x height of the Board.
hasAcid - Boolean! Indicates if the Board is made with chemicals or materials that contain acid.
Example
{
  "boardId": 4,
  "manufacturer": "xyz789",
  "era": "xyz789",
  "thickness": 123,
  "dimensions": "abc123",
  "hasAcid": false
}

Boolean

Description

The Boolean scalar type represents true or false.

Example
true

Box

Description

A box that stores comics.

Fields
Field Name Description
boxId - ID! Uniquely identifies a Box
name - String! The name of the Box.
size - BoxSize! The size of the Box. See BoxSize.
color - String! The color of the Box.
material - String! The material the Box is made from.
comics - [Comic!]! The Comics that are in the Box.
Example
{
  "boxId": 4,
  "name": "xyz789",
  "size": "SHORT",
  "color": "abc123",
  "material": "abc123",
  "comics": [Comic]
}

BoxSize

Description

The size of the Box.

Values
Enum Value Description

SHORT

A short comic box.

LONG

A long comic box.
Example
"SHORT"

Comic

Description

Represents a comic book in my collection.

Fields
Field Name Description
comicId - ID! Uniquely identifies a Comic.
series - Series The Series this Comic is a part of.
title - String The title of the Comic for ComicType TP and HC.
issue - Float The issue number for ComicType issue and annual.
cover - Int The cover number for ComicType ISSUE and ANNUAL.
printing - Int The printing.
distribution - ComicDistribution The method of distribution of the Comic. See ComicDistribution.
type - ComicType! The type of Comic. See ComicType.
releaseDate - String! The date the Comic was released.
price - Float! The cover price of the comic.
upc - String Universal Product Code of the Comic for ComicType ISSUE and ANNUAL.
isbn - String International Standard Book Number of the Comic. for ComicType TP and HC.
notes - String Extra information about the Comic.
box - Box The Box that the Comic is stored in.
transaction - Transaction! The transaction that purchased the Comic.
purchasePrice - Float The price the Comic was purchased at.
event - Event The Event the Comic is a part of. See Event.
bag - Bag The Bag the Comic is stored in. See Bag.
board - Board The Board the Comic is stored with. See Board.
Example
{
  "comicId": 4,
  "series": Series,
  "title": "abc123",
  "issue": 987.65,
  "cover": 123,
  "printing": 123,
  "distribution": "DIRECT",
  "type": "ISSUE",
  "releaseDate": "abc123",
  "price": 123.45,
  "upc": "abc123",
  "isbn": "xyz789",
  "notes": "xyz789",
  "box": Box,
  "transaction": Transaction,
  "purchasePrice": 123.45,
  "event": Event,
  "bag": Bag,
  "board": Board
}

ComicDistribution

Description

Defines the different methods of distributing comics to consumers. Note: most modern comics do not differentiate.

Values
Enum Value Description

DIRECT

Direct Market to consumers through comic book stores and libraries.

NEWSSTAND

Sold through newsstands and convenience stores.
Example
"DIRECT"

ComicType

Description

Defines the types of comic books.

Values
Enum Value Description

ISSUE

An individual story.

ANNUAL

An extended issue published yearly.

TP

A soft cover collection of ISSUEs and/or ANNUALs or a graphic novel.

HC

A hard cover collection of ISSUEs and/ or ANNUALS or a graphic novel.
Example
"ISSUE"

Event

Description

A story told through multiple Comics in multiple Series.

Fields
Field Name Description
eventId - ID! Unique identifier of the event.
publisher - String! The company that published the event.
name - String! The name of the event.
description - String! Description of the event's plot.
startDate - String! The date the event started.
endDate - String The date the event ended.
comics - [EventComic!]! The Comics that are apart of the Event.
Example
{
  "eventId": "4",
  "publisher": "xyz789",
  "name": "abc123",
  "description": "xyz789",
  "startDate": "abc123",
  "endDate": "xyz789",
  "comics": [EventComic]
}

EventComic

Description

A Comic that is a part of an Event.

Fields
Field Name Description
comic - Comic! The Comic in the Event. See Comic.
order - Int The numerical reading order the Comic is in the Event.
role - EventComicRole! The role the Comic plays in the Event. See EventComicRole.
Example
{"comic": Comic, "order": 987, "role": "COLLECTION"}

EventComicRole

Description

Defines the role a Comic plays in an Event.

Values
Enum Value Description

COLLECTION

Collects some or all of the issues in an Event. Does not introduce any new content to the Event.

CORE

A part of the main story.

EPILOGUE

Concludes the Event.

GUIDE

Helps readers understand the Event but does not contain any stories.

PROLOGUE

Introduces and sets-up the Event.

TIE_IN

Related to the Event but not a part of the main story.
Example
"COLLECTION"

Float

Description

The Float scalar type represents signed double-precision fractional values as specified by IEEE 754.

Example
123.45

Genre

Description

Category of Comic Series.

Fields
Field Name Description
genreId - ID! Unique identifier of the Genre.
name - String! The name of the genre.
Example
{"genreId": 4, "name": "xyz789"}

ID

Description

The ID scalar type represents a unique identifier, often used to refetch an object or as key for a cache. The ID type appears in a JSON response as a String; however, it is not intended to be human-readable. When expected as an input type, any string (such as "4") or integer (such as 4) input value will be accepted as an ID.

Example
4

Int

Description

The Int scalar type represents non-fractional signed whole numeric values. Int can represent values between -(2^31) and 2^31 - 1.

Example
987

Series

Description

A series of comics.

Fields
Field Name Description
seriesId - ID! Unique identifier of the series.
publisher - String! The company publishing the series.
imprint - String The subsidiary of the company publishing the series.
name - String! The name of the series.
type - SeriesType! The type of series. See SeriesType.
volume - Int! The numbered iteration of a series that has been published multiple times.
age - SeriesAge! The age of the series. See SeriesAge.
startYear - Int! The year the series was first published.
endYear - Int The year the series ended.
genres - [Genre!]! List of Genres the Series is classified as.
comics - [Comic!]! List of Comics in the Series.
Example
{
  "seriesId": "4",
  "publisher": "abc123",
  "imprint": "xyz789",
  "name": "xyz789",
  "type": "COLLECTION",
  "volume": 123,
  "age": "PLATINUM",
  "startYear": 987,
  "endYear": 987,
  "genres": [Genre],
  "comics": [Comic]
}

SeriesAge

Description

Represents a time period with a name in comic history

Values
Enum Value Description

PLATINUM

0 - 1938

GOLDEN

1939 - 1955

SILVER

1956 - 1969

BRONZE

1970 -1984

MODERN

1985+
Example
"PLATINUM"

SeriesType

Description

Categorizes series by the number of issues.

Values
Enum Value Description

COLLECTION

A series of issues that collect other issues

LIMITED

A series of no more than 12 issues.

ONE_SHOT

A series consisting of one issue.

REGULAR

A regular series with more than 12 issues or no initial set number of issues.
Example
"COLLECTION"

Shop

Description

A shop where comics are purchased.

Fields
Field Name Description
shopId - ID! Unique identifier of a shop. Formatted as SHOP-XXX.
name - String! The name of the Shop.
type - ShopType! The type of shop. See ShopType.
city - String The name of the city the Shop is located in.
state - String The 2 letter abbreviation of the state the Shop is located in.
country - String The ISO 3166-1 alpha-2 code of the country the Shop is located in.
zip - String The zip code of the Shop. US only.
transactions - [Transaction!]! The Transactions made at the Shop.
Example
{
  "shopId": "4",
  "name": "xyz789",
  "type": "BOOKSTORE",
  "city": "abc123",
  "state": "abc123",
  "country": "xyz789",
  "zip": "xyz789",
  "transactions": [Transaction]
}

ShopType

Description

The types of Shops where comics can be bought.

Values
Enum Value Description

BOOKSTORE

A Shop that mainly sells books but may also sell comics.

EVENT

A Shop at a comic Event. See Event.

LCS

A Local Comic Shop. A direct market comic book store.

LIBRARY

A shop that sells and lends books and comics.

ONLINE_STORE

A Shop that sells comics online.

PRIVATE_SELLER

An individual that sells comics privately.

PUBLISHER

A Shop owned directly be a comic publisher.
Example
"BOOKSTORE"

String

Description

The String scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text.

Example
"abc123"

Transaction

Description

Represents a Transaction to purchase comics.

Fields
Field Name Description
txId - ID! Unique identifier of a Transaction.
date - String! The date the Transaction occurred.
total - Float The total cost of the Transaction.
taxRate - Float The tax rate as a decimal applied to the Transaction.
discount - Float The monetary discount applied to the Transaction.
method - TransactionMethod The payment method used for the Transaction. See TransactionMethod.
shop - Shop The Shop the Transaction occurred at. See Shop.
notes - String Notes about the Transaction.
comics - [Comic!]! The comics purchased in this Transaction.
Example
{
  "txId": 4,
  "date": "xyz789",
  "total": 987.65,
  "taxRate": 123.45,
  "discount": 987.65,
  "method": "CARD",
  "shop": Shop,
  "notes": "xyz789",
  "comics": [Comic]
}

TransactionMethod

Description

Represents the payment method of a Transaction

Values
Enum Value Description

CARD

A transaction made with bank card.

CASH

A transaction made with cash.

GIFT

A non-exchange based transaction.
Example
"CARD"

User

Description

Represents and end-user.

Fields
Field Name Description
isAdmin - Boolean If the User is an administrator that can call mutations.
Example
{"isAdmin": false}