In this problem you will write a simple code generator for a 2D programming language derived from [Brainfuck](https://en.wikipedia.org/wiki/Brainfuck).

The code in this language is a rectangular grid of characters '.' and 'X'. The code is converted to a Brainfuck program as follows: the characters are read in the usual order (top to bottom, left to right), and each 'X' character is converted a Brainfuck instruction to be executed. The instruction is defined by the left, top and right neighbors of the 'X' character using the following conversion table:

<image>

You are given a string. Output a program in the described language which prints this string.

You can download the language interpreter used for judging here: <https://assets.codeforces.com/rounds/952/puzzling-interpreter.cpp> (use C++11 to compile the code). Note several implementation details:

  * The first step of the language interpretation is conversion to a Brainfuck program, which is then executed.
  * The code must be rectangular, with all lines of the same length. It can have at most 10,000 lines and 10,000 columns, and can have at most 500,000 'X' characters.
  * The code has toroidal topology, i.e. the 'X' on the first line will have top neighbor in the last line.
  * Brainfuck interpreter has 30000 memory cells which store integers from 0 to 255 with increment/decrement done modulo 256.
  * Console input (, command) is allowed in Brainfuck code but has no effect when executed.

Input

The input consists of a single string of characters with ASCII codes between 33 ('!') and 122 ('z'), inclusive. The length of the string is between 1 and 10 characters, inclusive.

Output

Output a program in the described language which, when executed, will print the given message.

Example

Input

$$$

Output

.......X.......
......XXX......
.....XXXXX.....
....XXXXXXX....
...XXXXXXXXX...
..XXXXXXXXXXX..
.XXXXXXXXXXXXX.
...............
X.............X
X..............
X..............
X..............

Note

The example corresponds to the following Brainfuck program:
    
    
           -  
          >+<  
         >+++<  
        >+++++<  
       >+++++++<  
      >+++++++++<  
     >+++++++++++<  
      
    <             >  
    .  
    .  
    .  
    

The triangular block decrements the first memory cell and sets the value of the second memory cell to 36 - the ASCII code of '$' character. The next line after the triangular block moves the memory pointer to the second memory cell, and the next three lines print the '$' character three times.
#include <bits/stdc++.h>
using namespace std;
const long long inf = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9 + 7;
const int N = 50 + 5;
char s[N];
int n;
vector<string> brainfuck;
int maxLen = 4;
void append(string str) {
  brainfuck.push_back(str);
  maxLen = max(maxLen, (int)str.size() + 1);
}
void add(int row) {
  for (int i = 1; i <= row; i++) {
    int leading_dots = row - i + 1;
    int X_num = i * 2 - 1;
    append(string(leading_dots, '.') + string(X_num, 'X'));
  }
  append("");
}
void sub(int x) {
  if (x == 0) return;
  string s;
  while (x--) s += ".X";
  s += ".";
  append(s);
  append("");
}
void change(int diff) {
  if (diff > 0) {
    int row = 1;
    while (row * row < diff) ++row;
    add(row + 1);
    sub(row * row - diff);
  } else if (diff < 0) {
    sub(-diff);
  }
}
void print() {
  append(".X");
  append(".X");
  append("");
}
int main() {
  scanf("%s", s);
  n = strlen(s);
  int pre = 0, cur = 0;
  for (int i = 0; i < n; i++) {
    cur = s[i] + 1;
    int diff = (pre - cur + 256) % 256;
    sub(diff);
    print();
    pre = s[i];
  }
  for (auto &s : brainfuck) {
    if (s == "x") {
      printf("X%sX\n", string(maxLen - 2, '.').c_str());
    } else {
      int trailing_dots = maxLen - s.length();
      printf("%s%s\n", s.c_str(), string(trailing_dots, '.').c_str());
    }
  }
  return 0;
}
