Kea 2.7.0
rdataclass.h
Go to the documentation of this file.
1// Copyright (C) 2010-2024 Internet Systems Consortium, Inc. ("ISC")
2//
3// This Source Code Form is subject to the terms of the Mozilla Public
4// License, v. 2.0. If a copy of the MPL was not distributed with this
5// file, You can obtain one at http://mozilla.org/MPL/2.0/.
6
7#ifndef DNS_RDATACLASS_H
8#define DNS_RDATACLASS_H
9
10#include <dns/master_loader.h>
11#include <dns/name.h>
12#include <dns/rdata.h>
13#include <dns/rrttl.h>
14#include <dns/rrtype.h>
15#include <dns/serial.h>
16#include <util/buffer.h>
17
18#include <boost/shared_ptr.hpp>
19
20#include <memory>
21#include <stdint.h>
22#include <string>
23#include <vector>
24
25namespace isc {
26namespace dns {
27
28class Name;
29class MasterLexer;
30class MasterLoaderCallbacks;
31class AbstractMessageRenderer;
32
33namespace rdata {
34namespace any {
35
36struct TSIGImpl;
37
44class TSIG : public Rdata {
45public:
46 explicit TSIG(const std::string& type_str);
47 TSIG(isc::util::InputBuffer& buffer, size_t rdata_len);
48 TSIG(const TSIG& other);
50 MasterLexer& lexer, const Name* name,
52 virtual std::string toText() const;
53 virtual void toWire(isc::util::OutputBuffer& buffer) const;
54 virtual void toWire(AbstractMessageRenderer& renderer) const;
55 virtual int compare(const Rdata& other) const;
56
82 TSIG(const Name& algorithm, uint64_t time_signed, uint16_t fudge,
83 uint16_t mac_size, const void* mac, uint16_t original_id,
84 uint16_t error, uint16_t other_len, const void* other_data);
85
95 TSIG& operator=(const TSIG& source);
96
99
103 const Name& getAlgorithm() const;
104
110 uint64_t getTimeSigned() const;
111
115 uint16_t getFudge() const;
116
120 uint16_t getMACSize() const;
121
134 const void* getMAC() const;
135
139 uint16_t getOriginalID() const;
140
144 uint16_t getError() const;
145
149 uint16_t getOtherLen() const;
150
156 const void* getOtherData() const;
157private:
158 std::unique_ptr<TSIGImpl> constructFromLexer(MasterLexer& lexer, const Name* origin);
159
160 std::unique_ptr<TSIGImpl> impl_;
161};
162
163} // end of namespace "any"
164
165namespace ch {
166
167class A : public Rdata {
168public:
169 explicit A(const std::string& type_str);
170 A(isc::util::InputBuffer& buffer, size_t rdata_len);
171 A(const A& other);
173 MasterLexer& lexer, const Name* name,
174 MasterLoader::Options options, MasterLoaderCallbacks& callbacks);
175 virtual std::string toText() const;
176 virtual void toWire(isc::util::OutputBuffer& buffer) const;
177 virtual void toWire(AbstractMessageRenderer& renderer) const;
178 virtual int compare(const Rdata& other) const;
179};
180
181} // end of namespace "ch"
182
183namespace generic {
184namespace detail {
185
206inline Name
207createNameFromLexer(MasterLexer& lexer, const Name* origin) {
208 const MasterToken::StringRegion& str_region =
209 lexer.getNextToken(MasterToken::STRING).getStringRegion();
210 return (Name(str_region.beg, str_region.len, origin));
211}
212
213template<class Type, uint16_t typeCode>
214class TXTLikeImpl;
215
216} // namespace detail
217
218class NS : public Rdata {
219public:
220 explicit NS(const std::string& type_str);
221 NS(isc::util::InputBuffer& buffer, size_t rdata_len);
222 NS(const NS& other);
224 MasterLexer& lexer, const Name* name,
225 MasterLoader::Options options, MasterLoaderCallbacks& callbacks);
226 virtual std::string toText() const;
227 virtual void toWire(isc::util::OutputBuffer& buffer) const;
228 virtual void toWire(AbstractMessageRenderer& renderer) const;
229 virtual int compare(const Rdata& other) const;
230
233 explicit NS(const Name& nsname) : nsname_(nsname) {
234 }
238 const Name& getNSName() const;
239private:
240 Name nsname_;
241};
242
243struct OPTImpl;
244
245class OPT : public Rdata {
246public:
247 explicit OPT(const std::string& type_str);
248 OPT(isc::util::InputBuffer& buffer, size_t rdata_len);
249 OPT(const OPT& other);
251 MasterLexer& lexer, const Name* name,
252 MasterLoader::Options options, MasterLoaderCallbacks& callbacks);
253 virtual std::string toText() const;
254 virtual void toWire(isc::util::OutputBuffer& buffer) const;
255 virtual void toWire(AbstractMessageRenderer& renderer) const;
256 virtual int compare(const Rdata& other) const;
257
258 // The default constructor makes sense for OPT as it can be empty.
260 OPT& operator=(const OPT& source);
262
265 class PseudoRR {
266 public:
271 PseudoRR(uint16_t code,
272 boost::shared_ptr<std::vector<uint8_t> >& data);
273
275 uint16_t getCode() const;
276
278 const uint8_t* getData() const;
279
282 uint16_t getLength() const;
283
284 private:
285 uint16_t code_;
286 boost::shared_ptr<std::vector<uint8_t>> data_;
287 };
288
297 void appendPseudoRR(uint16_t code, const uint8_t* data, uint16_t length);
298
305 const std::vector<PseudoRR>& getPseudoRRs() const;
306
307private:
308 std::unique_ptr<OPTImpl> impl_;
309};
310
311class PTR : public Rdata {
312public:
313 explicit PTR(const std::string& type_str);
314 PTR(isc::util::InputBuffer& buffer, size_t rdata_len);
315 PTR(const PTR& other);
317 MasterLexer& lexer, const Name* name,
318 MasterLoader::Options options, MasterLoaderCallbacks& callbacks);
319 virtual std::string toText() const;
320 virtual void toWire(isc::util::OutputBuffer& buffer) const;
321 virtual void toWire(AbstractMessageRenderer& renderer) const;
322 virtual int compare(const Rdata& other) const;
323
327 explicit PTR(const Name& ptr_name) : ptr_name_(ptr_name) {
328 }
332 const Name& getPTRName() const;
333private:
334 Name ptr_name_;
335};
336
337struct RRSIGImpl;
338
345class RRSIG : public Rdata {
346public:
347 explicit RRSIG(const std::string& type_str);
348 RRSIG(isc::util::InputBuffer& buffer, size_t rdata_len);
349 RRSIG(const RRSIG& other);
351 MasterLexer& lexer, const Name* name,
352 MasterLoader::Options options, MasterLoaderCallbacks& callbacks);
353 virtual std::string toText() const;
354 virtual void toWire(isc::util::OutputBuffer& buffer) const;
355 virtual void toWire(AbstractMessageRenderer& renderer) const;
356 virtual int compare(const Rdata& other) const;
357
358 RRSIG& operator=(const RRSIG& source);
360
361 // specialized methods
362 const RRType& typeCovered() const;
363private:
364 // helper function for string and lexer constructors
365 std::unique_ptr<RRSIGImpl> constructFromLexer(MasterLexer& lexer, const Name* origin);
366
367 std::unique_ptr<RRSIGImpl> impl_;
368};
369
370class SOA : public Rdata {
371public:
372 explicit SOA(const std::string& type_str);
373 SOA(isc::util::InputBuffer& buffer, size_t rdata_len);
374 SOA(const SOA& other);
376 MasterLexer& lexer, const Name* name,
377 MasterLoader::Options options, MasterLoaderCallbacks& callbacks);
378 virtual std::string toText() const;
379 virtual void toWire(isc::util::OutputBuffer& buffer) const;
380 virtual void toWire(AbstractMessageRenderer& renderer) const;
381 virtual int compare(const Rdata& other) const;
382
383 SOA(const Name& mname, const Name& rname, uint32_t serial,
384 uint32_t refresh, uint32_t retry, uint32_t expire,
385 uint32_t minimum);
386
389
391 uint32_t getMinimum() const;
392private:
395 Name mname_;
396 Name rname_;
398 uint8_t numdata_[20];
399};
400
401struct TKEYImpl;
402
409class TKEY : public Rdata {
410public:
411 explicit TKEY(const std::string& type_str);
412 TKEY(isc::util::InputBuffer& buffer, size_t rdata_len);
413 TKEY(const TKEY& other);
415 MasterLexer& lexer, const Name* name,
416 MasterLoader::Options options, MasterLoaderCallbacks& callbacks);
417 virtual std::string toText() const;
418 virtual void toWire(isc::util::OutputBuffer& buffer) const;
419 virtual void toWire(AbstractMessageRenderer& renderer) const;
420 virtual int compare(const Rdata& other) const;
421
442 TKEY(const Name& algorithm, uint32_t inception, uint32_t expire,
443 uint16_t mode, uint16_t error, uint16_t key_len,
444 const void* key, uint16_t other_len, const void* other_data);
445
455 TKEY& operator=(const TKEY& source);
456
459
463 const Name& getAlgorithm() const;
464
468 uint32_t getInception() const;
469
471 std::string getInceptionDate() const;
472
476 uint32_t getExpire() const;
477
479 std::string getExpireDate() const;
480
484 uint16_t getMode() const;
485
489 uint16_t getError() const;
490
494 uint16_t getKeyLen() const;
495
499 const void* getKey() const;
500
504 uint16_t getOtherLen() const;
505
511 const void* getOtherData() const;
512
514 static const uint16_t GSS_API_MODE;
515
516private:
517 std::unique_ptr<TKEYImpl> constructFromLexer(MasterLexer& lexer, const Name* origin);
518
519 std::unique_ptr<TKEYImpl> impl_;
520};
521
522class TXT : public Rdata {
523public:
524 explicit TXT(const std::string& type_str);
525 TXT(isc::util::InputBuffer& buffer, size_t rdata_len);
526 TXT(const TXT& other);
528 MasterLexer& lexer, const Name* name,
529 MasterLoader::Options options, MasterLoaderCallbacks& callbacks);
530 virtual std::string toText() const;
531 virtual void toWire(isc::util::OutputBuffer& buffer) const;
532 virtual void toWire(AbstractMessageRenderer& renderer) const;
533 virtual int compare(const Rdata& other) const;
534
535 TXT& operator=(const TXT& source);
537
538private:
540 std::unique_ptr<TXTImpl> impl_;
541};
542} // namespace generic
543
544
545namespace in {
546
547class A : public Rdata {
548public:
549 explicit A(const std::string& type_str);
550 A(isc::util::InputBuffer& buffer, size_t rdata_len);
551 A(const A& other);
553 MasterLexer& lexer, const Name* name,
554 MasterLoader::Options options, MasterLoaderCallbacks& callbacks);
555 virtual std::string toText() const;
556 virtual void toWire(isc::util::OutputBuffer& buffer) const;
557 virtual void toWire(AbstractMessageRenderer& renderer) const;
558 virtual int compare(const Rdata& other) const;
559private:
560 uint32_t addr_; // raw IPv4 address (network byte order)
561};
562
563class AAAA : public Rdata {
564public:
565 explicit AAAA(const std::string& type_str);
566 AAAA(isc::util::InputBuffer& buffer, size_t rdata_len);
567 AAAA(const AAAA& other);
569 MasterLexer& lexer, const Name* name,
570 MasterLoader::Options options, MasterLoaderCallbacks& callbacks);
571 virtual std::string toText() const;
572 virtual void toWire(isc::util::OutputBuffer& buffer) const;
573 virtual void toWire(AbstractMessageRenderer& renderer) const;
574 virtual int compare(const Rdata& other) const;
575private:
576 uint8_t addr_[16]; // raw IPv6 address (network byte order)
577};
578
585class DHCID : public Rdata {
586public:
587 explicit DHCID(const std::string& type_str);
588 DHCID(isc::util::InputBuffer& buffer, size_t rdata_len);
589 DHCID(const DHCID& other);
591 MasterLexer& lexer, const Name* name,
592 MasterLoader::Options options, MasterLoaderCallbacks& callbacks);
593 virtual std::string toText() const;
594 virtual void toWire(isc::util::OutputBuffer& buffer) const;
595 virtual void toWire(AbstractMessageRenderer& renderer) const;
596 virtual int compare(const Rdata& other) const;
597
601 const std::vector<uint8_t>& getDigest() const;
602
603private:
604 // helper for string and lexer constructors
605 void constructFromLexer(MasterLexer& lexer);
606
611 std::vector<uint8_t> digest_;
612};
613
614} // end of namespace "in"
615} // end of namespace "rdata"
616} // end of namespace "dns"
617} // end of namespace "isc"
618#endif // DNS_RDATACLASS_H
The AbstractMessageRenderer class is an abstract base class that provides common interfaces for rende...
Tokenizer for parsing DNS master files.
Set of issue callbacks for a loader.
Options
Options how the parsing should work.
@ STRING
A single string.
The Name class encapsulates DNS names.
Definition name.h:219
The RRType class encapsulates DNS resource record types.
Definition rrtype.h:96
This class defines DNS serial numbers and serial arithmetic.
Definition serial.h:41
The Rdata class is an abstract base class that provides a set of common interfaces to manipulate conc...
Definition rdata.h:120
rdata::TSIG class represents the TSIG RDATA as defined in RFC2845.
Definition rdataclass.h:44
TSIG(isc::util::InputBuffer &buffer, size_t rdata_len)
TSIG(const Name &algorithm, uint64_t time_signed, uint16_t fudge, uint16_t mac_size, const void *mac, uint16_t original_id, uint16_t error, uint16_t other_len, const void *other_data)
Constructor from RDATA field parameters.
uint16_t getOriginalID() const
Return the value of the Original ID field.
uint16_t getError() const
Return the value of the Error field.
virtual std::string toText() const
Convert an Rdata to a string.
TSIG & operator=(const TSIG &source)
Assignment operator.
~TSIG()
The destructor.
virtual void toWire(AbstractMessageRenderer &renderer) const
Render the Rdata in the wire format into a MessageRenderer object.
TSIG(const TSIG &other)
TSIG(MasterLexer &lexer, const Name *name, MasterLoader::Options options, MasterLoaderCallbacks &callbacks)
const Name & getAlgorithm() const
Return the algorithm name.
uint16_t getOtherLen() const
Return the value of the Other Len field.
TSIG(const std::string &type_str)
const void * getOtherData() const
Return the value of the Other Data field.
virtual int compare(const Rdata &other) const
Compare two instances of Rdata.
const void * getMAC() const
Return the value of the MAC field.
uint16_t getFudge() const
Return the value of the Fudge field.
virtual void toWire(isc::util::OutputBuffer &buffer) const
Render the Rdata in the wire format into a buffer.
uint16_t getMACSize() const
Return the value of the MAC Size field.
uint64_t getTimeSigned() const
Return the value of the Time Signed field.
A(MasterLexer &lexer, const Name *name, MasterLoader::Options options, MasterLoaderCallbacks &callbacks)
A(const A &other)
A(const std::string &type_str)
virtual void toWire(isc::util::OutputBuffer &buffer) const
Render the Rdata in the wire format into a buffer.
virtual int compare(const Rdata &other) const
Compare two instances of Rdata.
virtual void toWire(AbstractMessageRenderer &renderer) const
Render the Rdata in the wire format into a MessageRenderer object.
A(isc::util::InputBuffer &buffer, size_t rdata_len)
virtual std::string toText() const
Convert an Rdata to a string.
virtual std::string toText() const
Convert an Rdata to a string.
NS(MasterLexer &lexer, const Name *name, MasterLoader::Options options, MasterLoaderCallbacks &callbacks)
virtual void toWire(isc::util::OutputBuffer &buffer) const
Render the Rdata in the wire format into a buffer.
NS(isc::util::InputBuffer &buffer, size_t rdata_len)
virtual int compare(const Rdata &other) const
Compare two instances of Rdata.
NS(const std::string &type_str)
virtual void toWire(AbstractMessageRenderer &renderer) const
Render the Rdata in the wire format into a MessageRenderer object.
const Name & getNSName() const
Specialized methods.
NS(const Name &nsname)
Specialized constructor.
Definition rdataclass.h:233
A class representing a pseudo RR (or option) within an OPT RR (see RFC 6891).
Definition rdataclass.h:265
const uint8_t * getData() const
Return the option data of this pseudo RR.
uint16_t getLength() const
Return the length of the option data of this pseudo RR.
uint16_t getCode() const
Return the option code of this pseudo RR.
PseudoRR(uint16_t code, boost::shared_ptr< std::vector< uint8_t > > &data)
Constructor.
virtual void toWire(isc::util::OutputBuffer &buffer) const
Render the Rdata in the wire format into a buffer.
virtual std::string toText() const
Convert an Rdata to a string.
void appendPseudoRR(uint16_t code, const uint8_t *data, uint16_t length)
Append a pseudo RR (option) in this OPT RR.
virtual int compare(const Rdata &other) const
Compare two instances of Rdata.
OPT & operator=(const OPT &source)
const std::vector< PseudoRR > & getPseudoRRs() const
Return a vector of the pseudo RRs (options) in this OPT RR.
OPT(MasterLexer &lexer, const Name *name, MasterLoader::Options options, MasterLoaderCallbacks &callbacks)
virtual void toWire(AbstractMessageRenderer &renderer) const
Render the Rdata in the wire format into a MessageRenderer object.
OPT(isc::util::InputBuffer &buffer, size_t rdata_len)
OPT(const std::string &type_str)
virtual std::string toText() const
Convert an Rdata to a string.
PTR(const std::string &type_str)
virtual void toWire(AbstractMessageRenderer &renderer) const
Render the Rdata in the wire format into a MessageRenderer object.
PTR(isc::util::InputBuffer &buffer, size_t rdata_len)
PTR(MasterLexer &lexer, const Name *name, MasterLoader::Options options, MasterLoaderCallbacks &callbacks)
virtual int compare(const Rdata &other) const
Compare two instances of Rdata.
const Name & getPTRName() const
Specialized methods.
PTR(const Name &ptr_name)
Specialized constructor.
Definition rdataclass.h:327
virtual void toWire(isc::util::OutputBuffer &buffer) const
Render the Rdata in the wire format into a buffer.
rdata::RRSIG class represents the RRSIG RDATA as defined in RFC4034.
Definition rdataclass.h:345
const RRType & typeCovered() const
virtual void toWire(isc::util::OutputBuffer &buffer) const
Render the Rdata in the wire format into a buffer.
virtual std::string toText() const
Convert an Rdata to a string.
RRSIG(const std::string &type_str)
virtual int compare(const Rdata &other) const
Compare two instances of Rdata.
RRSIG(MasterLexer &lexer, const Name *name, MasterLoader::Options options, MasterLoaderCallbacks &callbacks)
RRSIG & operator=(const RRSIG &source)
virtual void toWire(AbstractMessageRenderer &renderer) const
Render the Rdata in the wire format into a MessageRenderer object.
RRSIG(isc::util::InputBuffer &buffer, size_t rdata_len)
SOA(const std::string &type_str)
Serial getSerial() const
Returns the serial stored in the SOA.
SOA(const Name &mname, const Name &rname, uint32_t serial, uint32_t refresh, uint32_t retry, uint32_t expire, uint32_t minimum)
SOA(isc::util::InputBuffer &buffer, size_t rdata_len)
virtual std::string toText() const
Convert an Rdata to a string.
virtual int compare(const Rdata &other) const
Compare two instances of Rdata.
virtual void toWire(AbstractMessageRenderer &renderer) const
Render the Rdata in the wire format into a MessageRenderer object.
virtual void toWire(isc::util::OutputBuffer &buffer) const
Render the Rdata in the wire format into a buffer.
uint32_t getMinimum() const
brief Returns the minimum TTL field value of the SOA.
SOA(MasterLexer &lexer, const Name *name, MasterLoader::Options options, MasterLoaderCallbacks &callbacks)
rdata::TKEY class represents the TKEY RDATA as defined in RFC2930.
Definition rdataclass.h:409
const Name & getAlgorithm() const
Return the algorithm name.
virtual void toWire(isc::util::OutputBuffer &buffer) const
Render the Rdata in the wire format into a buffer.
virtual int compare(const Rdata &other) const
Compare two instances of Rdata.
TKEY & operator=(const TKEY &source)
Assignment operator.
uint32_t getInception() const
Return the value of the Inception field as a number.
uint16_t getMode() const
Return the value of the Mode field.
virtual void toWire(AbstractMessageRenderer &renderer) const
Render the Rdata in the wire format into a MessageRenderer object.
std::string getInceptionDate() const
Return the value of the Inception field as a string.
virtual std::string toText() const
Convert an Rdata to a string.
TKEY(isc::util::InputBuffer &buffer, size_t rdata_len)
uint32_t getExpire() const
Return the value of the Expire field as a number.
static const uint16_t GSS_API_MODE
The GSS_API constant for the Mode field.
Definition rdataclass.h:514
const void * getKey() const
Return the value of the Key field.
std::string getExpireDate() const
Return the value of the Expire field as a string.
TKEY(const std::string &type_str)
uint16_t getOtherLen() const
Return the value of the Other Len field.
TKEY(MasterLexer &lexer, const Name *name, MasterLoader::Options options, MasterLoaderCallbacks &callbacks)
uint16_t getError() const
Return the value of the Error field.
TKEY(const Name &algorithm, uint32_t inception, uint32_t expire, uint16_t mode, uint16_t error, uint16_t key_len, const void *key, uint16_t other_len, const void *other_data)
Constructor from RDATA field parameters.
uint16_t getKeyLen() const
Return the value of the Key Len field.
const void * getOtherData() const
Return the value of the Other Data field.
virtual int compare(const Rdata &other) const
Compare two instances of Rdata.
TXT(MasterLexer &lexer, const Name *name, MasterLoader::Options options, MasterLoaderCallbacks &callbacks)
virtual std::string toText() const
Convert an Rdata to a string.
virtual void toWire(AbstractMessageRenderer &renderer) const
Render the Rdata in the wire format into a MessageRenderer object.
TXT & operator=(const TXT &source)
TXT(const std::string &type_str)
virtual void toWire(isc::util::OutputBuffer &buffer) const
Render the Rdata in the wire format into a buffer.
TXT(isc::util::InputBuffer &buffer, size_t rdata_len)
rdata::TXTLikeImpl class represents the TXT-like RDATA for TXT and SPF types.
Definition txt_like.h:31
virtual void toWire(AbstractMessageRenderer &renderer) const
Render the Rdata in the wire format into a MessageRenderer object.
AAAA(isc::util::InputBuffer &buffer, size_t rdata_len)
AAAA(MasterLexer &lexer, const Name *name, MasterLoader::Options options, MasterLoaderCallbacks &callbacks)
virtual int compare(const Rdata &other) const
Compare two instances of Rdata.
AAAA(const AAAA &other)
virtual std::string toText() const
Convert an Rdata to a string.
virtual void toWire(isc::util::OutputBuffer &buffer) const
Render the Rdata in the wire format into a buffer.
AAAA(const std::string &type_str)
A(const std::string &type_str)
A(isc::util::InputBuffer &buffer, size_t rdata_len)
virtual void toWire(AbstractMessageRenderer &renderer) const
Render the Rdata in the wire format into a MessageRenderer object.
virtual int compare(const Rdata &other) const
Compare two instances of Rdata.
A(const A &other)
A(MasterLexer &lexer, const Name *name, MasterLoader::Options options, MasterLoaderCallbacks &callbacks)
virtual void toWire(isc::util::OutputBuffer &buffer) const
Render the Rdata in the wire format into a buffer.
virtual std::string toText() const
Convert an Rdata to a string.
rdata::DHCID class represents the DHCID RDATA as defined in RFC4701.
Definition rdataclass.h:585
virtual int compare(const Rdata &other) const
Compare two instances of Rdata.
virtual void toWire(isc::util::OutputBuffer &buffer) const
Render the Rdata in the wire format into a buffer.
DHCID(isc::util::InputBuffer &buffer, size_t rdata_len)
virtual std::string toText() const
Convert an Rdata to a string.
DHCID(const DHCID &other)
DHCID(const std::string &type_str)
virtual void toWire(AbstractMessageRenderer &renderer) const
Render the Rdata in the wire format into a MessageRenderer object.
const std::vector< uint8_t > & getDigest() const
Return the digest.
DHCID(MasterLexer &lexer, const Name *name, MasterLoader::Options options, MasterLoaderCallbacks &callbacks)
The InputBuffer class is a buffer abstraction for manipulating read-only data.
Definition buffer.h:81
The OutputBuffer class is a buffer abstraction for manipulating mutable data.
Definition buffer.h:343
Name createNameFromLexer(MasterLexer &lexer, const Name *origin)
Construct a Name object using a master lexer and optional origin.
Definition rdataclass.h:207
Defines the logger used by the top-level component of kea-lfc.
A simple representation of a range of a string.