Download as pdf or txt
Download as pdf or txt
You are on page 1of 7

Med Biol Eng Comput (2014) 52:741–747

DOI 10.1007/s11517-014-1177-3

Original Article

Hiding message into DNA sequence through DNA coding


and chaotic maps
Guoyan Liu · Hongjun Liu · Abdurahman Kadir 

Received: 14 April 2013 / Accepted: 27 June 2014 / Published online: 15 July 2014
© International Federation for Medical and Biological Engineering 2014

Abstract The paper proposes an improved reversible 1 Introduction


substitution method to hide data into deoxyribonucleic
acid (DNA) sequence, and four measures have been taken In the past few years, plenty of data hiding schemes have
to enhance the robustness and enlarge the hiding capacity, been proposed to embed the secret message into images
such as encode the secret message by DNA coding, encrypt [5, 9, 11, 16]. A successful scheme is that the data in host
it by pseudo-random sequence, generate the relative hiding image cannot be easily detected or attacked by the intrud-
locations by piecewise linear chaotic map, and embed the ers, but the aim is difficult to achieve.
encoded and encrypted message into a randomly selected In recent years, biotechnology has been applied in many
DNA sequence using the complementary rule. The key aspects of human’s life, and using biological information
space and the hiding capacity are analyzed. Experimen- as a carrier instead of image to hide message has become
tal results indicate that the proposed method has a better an interesting and more secure option, for the host image
performance compared with the competing methods with may be distorted to some degree and can be easily detected.
respect to robustness and capacity. DNA sequences have some inherent properties that can be
employed to hide all kinds of message, especially for the
Keywords  Data hiding · DNA sequence · DNA coding · short text or digital information.
Chebyshev · PWLCM Some researchers have turned to research how to hide data
into DNA sequences. Clelland et al. [3] firstly proposed the
data hiding method in DNA microdots. Leier et al. [6] pro-
posed a robust scheme using a special key sequence called a
primer to decode an encrypted DNA sequence. A robustness
analysis was provided by the authors, but a capacity analysis
was not provided. Peterson [10] proposed a method to hide
G. Liu  data in DNA sequence by substituting three consecutive bases
Department of Dermatology, Affiliated Hospital of Weifang as a character. Shimanovsky et al. [12] proposed an unrecov-
Medical University, Weifang 261031, China
erable scheme, i.e., exploited the codon redundancy to hide
H. Liu (*)  data in mRNA. Chang et al. [2] proposed two schemes to
School of Information Engineering, Weifang Vocational College, hide data in DNA sequence based upon software views.
Weifang 261041, China Two facts make the DNA sequence suitable for data hid-
e-mail: smithliu@126.com
ing. Firstly, it is almost impossible to find the difference
A. Kadir  between a real DNA sequence and a faked one. Secondly,
School of Computer Science and Engineering, Xinjiang there are a large number of DNA sequences publicly avail-
University of Finance and Economics, Ürümqi 830012, China able on various Web sites, such as the EBI database [14]; a
rough estimation puts the number of DNA sequences pub-
A. Kadir 
Postdoctoral Research Workstation of Computer Application licly available to be about 163 million (EMBL nucleotide
Technology, Xinjiang University, Ürümqi 830046, China sequences database release 101) [15].

13

742 Med Biol Eng Comput (2014) 52:741–747

The principle of hiding data into DNA sequence is as 2 Encode and encrypt secret message
follows: a reference sequence S is randomly selected from
some publicly available DNA sequence databases, only the 2.1 Encode secret message using DNA coding
sender and the receiver are aware of the reference sequence.
The sender transforms S into a new sequence S ′ by embed- Each DNA sequence contains four nucleic acid bases,
ding the secret message M into it. After the sequence S ′ is which are A (adenine), C (cytosine), G (guanine), and
sent to the receiver with other real sequences, the receiver T (thymine), where A and T, C and G are complemen-
examines the received sequences to identify S ′, recovers the tary pairs. In the binary code, 0 and 1 are complemen-
secret message M, and converts S ′ back to S. tary, so 0 (00) and 3 (11) are complementary pair, 1 (01)
Shiu et al. [13] proposed three data hiding methods to and 2 (10) are complementary pair too. So in the 4! = 24
embed the secret message into a reference DNA sequence. kinds of coding, there are only 8 of them to meet the
Method 1, 2, and 3 are insertion method, complementary complementary rule, for example, 0123 can be encoded
pair method, and substitution method, respectively. The to CTAG, CATG, GTAC, GATC, TCGA, TGCA, ACGT,
results show that Method 2 offers the worst capacity, while and AGCT. Here, we select one of them to encode the
Method 3 shows the best capacity. Method 1 is the most secret message.
robust, and Method 3 is the least. Of the three methods, DNA coding proposes a novel encoding method as
only Method 3 remains zero payload, which indicates that an alternative to traditional ASCII coding. Nucleotides
encrypted reference sequence can confuse the attacker, and are used as a quaternary coding, and each letter can be
difficult to be exactly identified. denoted by three nucleotides. The length of DNA coding
Guo et al. [4] proposed a new DNA sequence-based is only 6-bit, which is shorter than the 8-bit ASCII cod-
data hiding scheme. They establish an injective mapping ing. In Ref. [6], Clelland et al. proposed the translation
between one complementary rule and two secret bits in a table from alphabets to DNA nucleotides, as shown in
message. Based on this mapping mechanism, the proposed Table 1.
scheme can effectively hide two secret bits in a message by If we use C, T, A, G to denote 0 (00), 1 (01), 2 (10),
replacing one character. This approach can greatly improve 3 (11), then use CGA (001110) to denote the letter A, and
the embedding capacity in data hiding. Robustness and use CCA (000010) to denote the letter B, etc., then, the
security analyses show that the probability of an attacker’s secret message to be hidden can be encoded to a DNA
making a successful recovery of the hidden data is negli- sequence, for example, “AB” can be encoded to CGACCA
gible. According to the experimental results, the proposed (001110000010). Respectively, to decode the sequence, we
scheme has a stable and efficient embedding capacity with a can get the secret message.
low modification rate, and the fake DNA sequence does not Although the DNA coding in Table 1 can only be
need to expand the length of the reference DNA sequence. expressed as capital letters, numbers, and several punctua-
In this paper, we propose an improved data hiding tion marks, it is still sufficient to encode the secret message
method based on the substitution method in Ref. [13] and M; suppose the length of M is L, the length of the encoded
take four measures to enhance the robustness and enlarge message M ′ is 3L.
the hiding capacity. ➀ Encoding the secret message by DNA
coding to reduce the size; ➁ Encrypting the secret message 2.2 Encrypt the DNA sequence by Chebyshev maps
by Chebyshev chaotic maps to enhance the robustness; ➂
Generating the hiding locations randomly by the PWLCM After encoding the secret message M by DNA coding to get
system to resist attacking; ➃ Using the complementary rule M ′, we can further generate a DNA sequence by Cheby-
to hide 2-bit in one nucleotide to enlarge the hiding capac- shev maps to encrypt it.
ity. Experimental results demonstrate the effectiveness. The Chebyshev maps can be described as follows:

Table 1  Translation table from A = CGA H = CGC O = GGC V = CCT 2 = TAG 9 = GCG


alphabets to DNA nucleotides
B = CCA I = ATG P = GGA W = CCG 3 = GCA =ATA
C = GTT J = AGT Q = AAC X = CTA 4 = GAG , = TCG
D = TTG K = AAG R = TCA Y = AAA 5 = AGA . = GAT
E = GGT L = TGC S = ACG Z = AAT 6 = GGG : = GCT
F = ACT M = TCC T = TTC 0 = TTA 7 = ACA ; = ATT
G = TTT N = TCT U = CTG 1 = ACC 8 = AGG – = ATC

13
Med Biol Eng Comput (2014) 52:741–747 743

zi+1 = cos(w cos−1 zi ), −1 ≤ zi ≤ 1, (1) mi′ = xi′ ⊕ xi , i = 1, 2, . . . 3L. (5)

where w is the degree of Chebyshev maps, its correspond-


ing invariant density is as follows: 3 Generate the relative hiding locations by PWLCM
system


ρ(z) = 1 (π 1 − z2 ). (2)
When we hide the secret message into a reference DNA
Chebyshev maps have important properties of excel- sequence, it is necessary to identify the embedding loca-
lent cryptosystem [8]. If w ∈ [2, 6], its Lyapunov exponent tion. In our previous work, the second author and collab-
is positive, which indicates that the Chebyshev maps are orators designed an algorithm to embed the signal, which
chaotic. can ensure the message not to be easily cracked [7]. Here,
We use Eqs. (1) and (3) to generate a pseudo-random we employ the PWLCM system to generate the random
sequence X = {x1 , x2 , . . . , x3L }, which is applied to encrypt embedding locations.
the encoded message M ′ by bitwise exclusive or (XOR) The equation of PWLCM system is shown in Eq. (6).
operation to eliminate the statistic significance.  �
  yi qi , �
 0 ≤ yi < qi
 00, zi ∈ (−1, −0.5] yi+1 = Fqi (yi ) = (yi − qi ) (0.5 − qi ) , qi ≤ yi < 0.5 ,


 01, z ∈ (−0.5, 0] 
yi ≥ 0.5
i 
F (1 − y ),
xi = . (3) qi i

 10, z i ∈ (0, 0.5] (6)


11, zi ∈ (0.5, 1]
where yi ∊ [0, 1). When the control parameter qi ∊ (0, 0.5),
Suppose M = {m1 , m2 , . . . , mi , . . . mL }, each let- Eq. (6) evolves into chaotic state.
ter mi  ∊  M can be expressed as three nucleic acid bases PWLCM system has uniform invariant distribution and

m(i−1)×3+1 ′
, m(i−1)×3+2 ′
, m(i−1)×3+3 ∈ {C, T , A, G} by DNA very good ergodicity, confusion, and determinacy, so it
coding, then M can be expressed as M ′ = {m1′ , m2′ , . . . , can provide an excellent random sequence, which is suit-

m(i−1)×3+1 ′
, m(i−1)×3+2 ′
, m(i−1)×3+3 ′ }
, . . . , m3L . After the able for the cryptosystem [1]. The plot and distribution of
PWLCM system is shown in Fig. 1.
bitwise XOR operation by Eq. (4), we can get the result
Here, we generate the relative embedding loca-
XM ′ = {x1′ , x2′ , . . . , m(i−1)×3+1
′ ′
, m(i−1)×3+2 ′
, m(i−1)×3+3 ,...,
tions sequence P = {p1 , p2 , . . . , p3L } by PWLCM sys-
′ } , i.e., XM ′ = X ⊕ M ′.
x3L tem. After iterating Eq. (6) for finite times to elimi-
xi′ = mi′ ⊕ xi , nate the transient process, continue to iterate it for 3L
i = 1, 2, . . . 3L. (4)
times to get Y = {y1 , y2 , . . . , y3L }, and then convert Y to
M′ can also be recovered by Eq. (5), i.e., M′ = XM ′ ⊕ X. sequence P = {p1 , p2 , . . . , p3L } to serve as the relative

Fig. 1  Plot and distribution of PWLCM system. a The plot of PWLCM system. b The distribution of x and q with 1,000 iterations

13

744 Med Biol Eng Comput (2014) 52:741–747

hiding locations. If the randomly selected reference DNA Step 2. For i from 1 to 15:
sequence is long enough, the value of pi is determined
by the length of secret message L. If pi ∈ {1, 2, 3, 4}, if si′ is the same with and si, then set mj = 0 and j = j + 1;
the values can be generated by Eq. (7). If pi ∈ {1, 2} or else if si′ is the same with C(si), then set mj  = 1 and
pi ∈ {1, 2, 3}, their values can be generated by the similar j = j + 1;
equations.
 Step 3. Concatenate all mk’s, 1 ≤ k ≤ j − 1, to be M. M
 1, yi ∈ (−1, −0.5] is the secret message. Set all si′’s to be si′’s to recover S ′ back

to the reference sequence S.

 2, y ∈ (−0.5, 0]
i
pi = . (7)

 3, yi ∈ (0, 0.5]
4.2 Improved message hiding method


4, yi ∈ (0.5, 1]

The improved substitution method also uses a reference


4 Message hiding and recovery DNA sequence S, and set the secret message “OK” as M,
then M ′  =  GGCAAG. Suppose the length of S is LS, only
4.1 The substitution method in Ref. [13] when
3L
The substitution method proposed by Ref. [13] uses a refer- 
ence DNA sequence S. It assumed that S  =  ACGGAATT- LS ≥ 1 + pi ,
i=1
GCTTCAG and the secret message M = m1, m2, …, mp is
0111010. The length of S is 15, which is longer than the S can be long enough to hide M ′. The complementary rule
length of M, p, which is 7 in this case. It is stipulated that must satisfy that for each nucleotide x in DNA sequence,
the complementary rule used in this method must sat- all of the x, C(x), C(C(x)) and C(C(C(x))) are not equal,
isfy that for each letter x of a DNA sequence, all x, C(x), C(C(C(C(x))))  =  x, where C(x) is the complement of x,
C(C(x)) and C(C(C(x))) are not equal, where C(x) is the which can guarantee the complementary rule of injective
complement of x. This property is to guarantee the comple- mapping.
mentary rule to be an injective mapping. For instance, the For this method, first of all, complementary pairs should
following complementary rule may apply: be defined. That is, a unique counterpart is assigned for
each base pair. For instance, the following complementary
(AT )(CA)(GC)(TG)
rule may be applied:
Let the reference DNA sequence S = s1, s2, …, sm and
(AT )(CA)(GC)(TG).
the secret message M = m1, m2, …, mp. The method works
as follows: By this rule, if x = A, we can get
Step 1. Suppose the length of the reference sequence
S is 15. Select p distinct numbers randomly from 1 to C(A) = T ,
15. Assume that p  = 7 and these selected p numbers C(C(A)) = C(T ) = G,
are 2, 3, 5, 10, 12, 13 and 15, then let A  = {A1, A2, …, C(C(C(A))) = C(C(T )) = C(G) = C,
Ap} = {2, 3, 5, 10, 12, 13, 15} C(C(C(C(A)))) = C(C(C(T ))) = C(C(G)) = C(C) = A.
Step 2. Transform S into S ′ by the following rule:
Let the reference DNA sequence S = s1 , s2 , . . . , sLS,
For each integer i from 1–15: and the secret message M ′ = m1 , m2 , . . . , m3L, the hiding
if i is equal to some Aj and mj is 1, 1 ≤ j ≤ p, set si to be steps are as follows:
C(si); Input: The reference sequence S, secret message M, and
else if i is equal to some Aj and mj is 0, do not change si; a complementary rule, the keys to generate sequence X.
else if i is not equal to any Aj, set si to be C(C(si)); Output: A faked DNA sequence S ′ with the secret mes-
Thus S ′ = GCCATGCCAACTAGG. sage M hidden inside.
Step 1. Encode M to M ′ by DNA coding, and encrypt it
Step 3. Send S ′ to the receiver. by Eq. (4) to get the sequence XM ′ = {m1′ , m2′ , . . . , m3L
′ }.
The receiver knows the reference sequence S and the Step 2. Generate the hiding relative locations sequence
complementary rule. Let the ith character of S ′ and S be P = {p1 , p2 , . . . , p3L }.
denoted as si′ and si, respectively. The recovery process is Step 3. Initialize i to 1.
as follows: Step 4. For each element si ∊ S, we use the complemen-
Step 1. Initialize i and j to be 1. tary rule to do the following operations:

13
Med Biol Eng Comput (2014) 52:741–747 745

j = i;
i
pk, do not change si;

if j � = 1 +
k=1
i
if j =1+ pk , then
k=1
do case
case mi′ = 00, set sj′ = sj;
case mi′ = 01, set sj′ = C(sj); Fig. 2  Process of message hiding
case mi′ = 10, set sj′ = C(C(sj));
case mi′ = 11, set sj′ = C(C(C(sj))); set w = 4.2926871 and z0 = 0.2182135678932276 in Eq.
end case. (1) to get X = GTCAAG, then XM ′ = X ⊕  M ′ = CACGCT.
We use Eq. (7) to generate the relative hiding locations
Step 5. After the above steps, sequence S is changed into P = {2, 1, 4, 3, 2, 3}. The process of transforming S to S ′
sequence S ′, then send S ′ to receiver. is shown in Fig. 2, and S ′ can be transformed into S by the
inverse transformation while extracting the secret message.
4.3 Improved message recovery method
5.2 Analysis of key space
The receiver can use the following algorithm to recover the
hidden message. For an intruder to discover the secret message, the fol-
Input: A faked DNA sequence S ′ = s1′ , s2′ , . . . , sL′ S, a lowing information is necessary: ➀ the reference DNA
reference DNA sequence S = s1 , s2 , . . . , sLS, the comple- sequence, ➁ the complementary rule, ➂ the sequence X,
mentary rule, the keys to generate sequence X. and ➃ the sequence P.
Output: The hidden secret message M. For ➀, there are roughly 163 million DNA sequences
Step 1. Generate the hiding relative locations available publicly. Thus, the probability for an attacker to
P = {p1 , p2 , . . . , p3L } with the same key. make a successful guess is
Step 2. Initialize i to 1.
Step 3. For each element si′  ∊  S ′, do the following 1
,
operation: 1.63 × 108
so the key space SDNA = 1.63 × 108.
j = i; i For ➁, the number of legal complementary rules should
if j = 1 + pk then

be considered. There are six legal complementary rules as
do case k=1 follows:
case sj′ = sj, mi′ = 00;
case C(sj′) = sj, mi′ = 11;
(AT )(TC)(CG)(GA), (AT )(TG)(GC)(CA), (AC)(CT )(TG)(GA),

case C(C(sj′)) = sj, mi′ = 10; (AC)(CG)(GT )(TA), (AG)(GT )(TC)(CA), and (AG)(GC)(CT )(TA).
case C(C(C(sj′))) = sj, mi′ = 01; The probability to make correct guess is 1/16.6, so the
end case. key space is 6.
For ➂, the variation of z0 ∊ [0, 1] is with a precision of
Step 4. After the Step 3, we can get −16
10 , so the key space for initial condition z0 is Sz0 = 1016.
′ }, then decrypt it by Eq. (5) to get
XM ′ = {m1′ , m2′ , . . . , m3L To ensure a large divergence of a chaotic trajectory
M and decode it by DNA coding to get the secret message

from the initial condition, the iteration times n should
M. be relatively large but not too much; it is usually set
n ∊ [100, 1,000]. We provide an increase of the key space
dimension in Eqs. (1) and (6) by 9 × 102, so the total key
5 Experiments and comparisons space Sn = 8.1 × 105.
The variation of the parameter w in the chaotic region is
5.1 Simulation results between 2 and 6 with a step of 10−7, so Sw = 4 × 107.
For ➃, the variation of y0 ∊ [0, 1] is with a precision of
Here, we set the plain text “OK” as secret mes- 10−16, so the key space for initial condition y0 is Sy0 = 1016.
sage M, according to Table 1, the result of DNA cod- Because of qi ≈ yi/2, and yi ∊ [0, 1], then Sqi = Sy0 = 1016.
ing is M ′  =  GGCAAG. Assume that S  =  ACGGAATT- Finally, the algorithm has S = 6SDNA Sz0 Sn Sw Sy0
GCTTCAGT. We use C, T, A, G to denote 00, 01, 10, 11, Sqi = 3.5575 × 1070 combinations of the secret keys.
the complementary rule (AT)(CA)(GC)(TG) is applied. We Even though the fake DNA sequence is identified, it is still

13

746 Med Biol Eng Comput (2014) 52:741–747

Table 2  Comparison of cracking probability


Method Substitution methods in Ref. [13] Methods in Ref. [4] Proposed method

Cracking probability 1
× 1 1
× 1
× 1 1
× 1
× 1
× 1
× 1
× 1
1.63×108 6 1.63×108 6 24 1.63×108 6 1016 1.8×105 4×107 1032

Table 3  Comparison of hiding capacity


Sequence Number of Payload Hiding capacity
nucleotides
Substitution method in Method in Ref. Proposed method
Ref. [13] [4]
pi ∈ {1, 2, 3, 4} pi ∈ {1, 2, 3} pi ∈ {1, 2}

AC153526 200,117 0 25,015 114,898 66,706 100,059 133,411


AC166252 149,884 0 18,736 86,562 49,961 74,942 99,923
AC167221 204,841 0 25,605 115,214 68,280 102,421 136,561
AC168874 206,488 0 25,811 123,846 68,829 103,244 137,659
AC168897 191,456 0 23,932 122,708 63,819 95,728 127,637
AC168901 200,203 0 25,025 111,642 66,734 100,102 133,469
AC168907 194,226 0 24,278 115,786 64,742 97,113 129,484
AC168908 218,028 0 27,254 129,204 72,676 109,014 145,352

virtually impossible for the sequence to be correctly recov- message is encoded by DNA coding, encrypted by pseudo-
ered without the correct keys. random sequence and generated by Chebyshev chaotic
maps. The random hiding locations are generated by the
5.3 Security comparison PWLCM system to resist attacks. The complementary
rule is applied to hide 2-bit in one nucleotide to enlarge
We compare the methods in Refs. [4, 13] with our method, the hiding capacity. Experimental results indicate that the
and the results are shown in Table 2. We can find that by hiding capacity of the proposed method is greater than the
these measures, the cracking probability of the proposed competing method, and it also has a better performance in
method apparently much lower than the three methods. robustness and capacity. In contrast with some traditional
data hiding schemes those using image as carrier, the pro-
5.4 Hiding capacity posed method is easy to implement and hard to detect.

By the substitution method in Ref. [13], each nucleotide Acknowledgments The research is supported by the National
Natural Science Foundation of China (No. 61363082) and the Minor-
can only be embedded into one bit. In order to enlarge the ity Nationality Technology Talent Cultivation Plan of Xinjiang (No.
hiding capacity, we encode the secret message by 6-bit 201123116).
DNA coding, instead of 8-bit ASCII coding, and each
nucleotide can be embedded into 2-bit by the complemen-
tary rule. We use the same eight DNA sequences in Refs.
[4, 13] as the test sample from Web site [14]; the compar- References
ison of the maximal hiding capacity is shown in Table 3,
1. Awad A, Assad SE, Wang QX, Vlădeanu C, Bakhache B (2008)
from which we can find that the hiding capacity of the Comparative study of 1-D chaotic generators for digital data
improved substitution method is greater than the substitu- encryption. IAENG Int J Comput Sci 35(4):483–488
tion method in Ref. [13]. If we set pi to different values, 2. Chang CC, Lu TC, Chang YF, Lee RCT (2007) Reversible data
their corresponding results are shown in Table 3. hiding schemes for deoxyribonucleic acid (DNA) medium. Int J
Innov Comput Inf Control 3(5):1145–1160
3. Clelland CT, Risca V, Bancroft C (1999) Hiding messages in
DNA microdots. Nature 399(6736):533–534
6 Conclusion 4. Guo C, Chang CC, Wang ZH (2012) A new data hiding scheme
based on DNA sequence. Int J Innov Comput Inf Control
8(1(A)):139–149
An improved data hiding method into DNA sequence 5. Lee CF, Huang YL (2012) An efficient image interpolation
is designed. Four measures have been taken to enhance increasing payload in reversible data hiding. Expert Syst Appl
the robustness and enlarge the hiding capacity. The plain 39(8):6712–6719

13
Med Biol Eng Comput (2014) 52:741–747 747

6. Leier A, Richter C, Banzhaf W, Rauhe H (2000) Cryptography 12. Shimanovsky B, Feng J, Potkonjak M (2002) Hiding data in
with DNA binary strands. BioSystems 57(1):13–22 DNA, the 5th international workshop on information hiding. Lect
7. Liu HJ, Wang XY, Zhu QL (2011) Asynchronous anti-noise hyper Notes Comput Sci 2578:373–386
chaotic secure communication system based on dynamic delay 13. Shiu HJ, Ng KL, Fang JF, Lee RCT, Huang CH (2010)

and state variables switching. Phys Lett A 375(30–31):2828–2835 Data hiding methods based upon DNA sequences. Inf Sci
8. Liu HJ, Wang XY, Kadir A (2012) Image encryption using 180(11):2196–2208
DNA complementary rule and chaotic maps. Appl Soft Comput 14. Website, NCBI Database: http://www.ncbi.nlm.nih.gov/
12(5):1457–1466 15. European Bioinformatics Institute. http://www.ebi.ac.uk/
9. Mali SN, Patil PM, Jalnekar RM (2012) Robust and secured 16. Yang WJ, Chung KL, Liao HYM (2012) Efficient reversible data
image-adaptive data hiding. Digit Signal Proc 22(2):314–323 hiding for color filter array images. Inf Sci 190(1):208–226
10. Peterson I (2001) Hiding in DNA, Muse, p 22
11. Qian ZX, Zhang XP (2012) Lossless data hiding in JPEG bit-
stream. J Syst Softw 85(2):309–313

13

You might also like