import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {
    static PrintWriter out;

    public static void main(String[] args) throws IOException {
        out = new PrintWriter(new OutputStreamWriter(System.out));
        CF_Reader in = new CF_Reader();

        char[] word = in.next().toCharArray();
        int ln = word.length;
        int halve = (ln - 1) / 2;
        boolean f = isPalindrome(0, halve-1, word);
        boolean s =  isPalindrome(halve + 1, ln - 1, word);
        boolean l = isPalindrome(0, ln - 1, word);
        System.out.println((f && s && l) ? "Yes": "No");

        out.close();
    }



    static boolean isPalindrome(int start, int end, char[] word) {
        while (start < end) {
            if (word[start] != word[end]) return false;
            start++;
            end--;
        }
        return true;
    }


    static class CF_Reader {
        BufferedReader br;
        StringTokenizer st;

        public CF_Reader() throws IOException {
            br = new BufferedReader(new InputStreamReader(System.in));
        }

        String next() throws IOException {
            while (st == null || !st.hasMoreTokens())
                st = new StringTokenizer(br.readLine().trim());
            return st.nextToken();
        }

        long nextLong() throws IOException {
            return Long.parseLong(next());
        }

        int nextInt() throws IOException {
            return Integer.parseInt(next());
        }

        double nextDouble() throws IOException {
            return Double.parseDouble(next());
        }

        char nextCharacter() throws IOException {
            return next().charAt(0);
        }

        String nextLine() throws IOException {
            return br.readLine().trim();
        }
    }
} import java.io.BufferedReader; BufferedReader java.io import java.io.IOException; IOException java.io import java.io.InputStreamReader; InputStreamReader java.io import java.io.OutputStreamWriter; OutputStreamWriter java.io import java.io.PrintWriter; PrintWriter java.io import java.lang.reflect.Array; Array java.lang.reflect import java.util.Arrays; Arrays java.util import java.util.StringTokenizer; StringTokenizer java.util public class Main {
    static PrintWriter out;

    public static void main(String[] args) throws IOException {
        out = new PrintWriter(new OutputStreamWriter(System.out));
        CF_Reader in = new CF_Reader();

        char[] word = in.next().toCharArray();
        int ln = word.length;
        int halve = (ln - 1) / 2;
        boolean f = isPalindrome(0, halve-1, word);
        boolean s =  isPalindrome(halve + 1, ln - 1, word);
        boolean l = isPalindrome(0, ln - 1, word);
        System.out.println((f && s && l) ? "Yes": "No");

        out.close();
    }



    static boolean isPalindrome(int start, int end, char[] word) {
        while (start < end) {
            if (word[start] != word[end]) return false;
            start++;
            end--;
        }
        return true;
    }


    static class CF_Reader {
        BufferedReader br;
        StringTokenizer st;

        public CF_Reader() throws IOException {
            br = new BufferedReader(new InputStreamReader(System.in));
        }

        String next() throws IOException {
            while (st == null || !st.hasMoreTokens())
                st = new StringTokenizer(br.readLine().trim());
            return st.nextToken();
        }

        long nextLong() throws IOException {
            return Long.parseLong(next());
        }

        int nextInt() throws IOException {
            return Integer.parseInt(next());
        }

        double nextDouble() throws IOException {
            return Double.parseDouble(next());
        }

        char nextCharacter() throws IOException {
            return next().charAt(0);
        }

        String nextLine() throws IOException {
            return br.readLine().trim();
        }
    }
} Main static PrintWriter out; out public static void main(String[] args) throws IOException {
        out = new PrintWriter(new OutputStreamWriter(System.out));
        CF_Reader in = new CF_Reader();

        char[] word = in.next().toCharArray();
        int ln = word.length;
        int halve = (ln - 1) / 2;
        boolean f = isPalindrome(0, halve-1, word);
        boolean s =  isPalindrome(halve + 1, ln - 1, word);
        boolean l = isPalindrome(0, ln - 1, word);
        System.out.println((f && s && l) ? "Yes": "No");

        out.close();
    } main {
        out = new PrintWriter(new OutputStreamWriter(System.out));
        CF_Reader in = new CF_Reader();

        char[] word = in.next().toCharArray();
        int ln = word.length;
        int halve = (ln - 1) / 2;
        boolean f = isPalindrome(0, halve-1, word);
        boolean s =  isPalindrome(halve + 1, ln - 1, word);
        boolean l = isPalindrome(0, ln - 1, word);
        System.out.println((f && s && l) ? "Yes": "No");

        out.close();
    } out = new PrintWriter(new OutputStreamWriter(System.out)) out new PrintWriter(new OutputStreamWriter(System.out)) CF_Reader in = new CF_Reader(); in new CF_Reader() char[] word = in.next().toCharArray(); word in.next().toCharArray() in.next().toCharArray in.next() in.next in int ln = word.length; ln word.length word word.length int halve = (ln - 1) / 2; halve (ln - 1) / 2 (ln - 1) ln 1 2 boolean f = isPalindrome(0, halve-1, word); f isPalindrome(0, halve-1, word) isPalindrome 0 halve-1 halve 1 word boolean s =  isPalindrome(halve + 1, ln - 1, word); s isPalindrome(halve + 1, ln - 1, word) isPalindrome halve + 1 halve 1 ln - 1 ln 1 word boolean l = isPalindrome(0, ln - 1, word); l isPalindrome(0, ln - 1, word) isPalindrome 0 ln - 1 ln 1 word System.out.println((f && s && l) ? "Yes": "No") System.out.println System.out System System.out (f && s && l) ? "Yes": "No" (f && s && l) f && s && l f s l "Yes" "No" out.close() out.close out String[] args args static boolean isPalindrome(int start, int end, char[] word) {
        while (start < end) {
            if (word[start] != word[end]) return false;
            start++;
            end--;
        }
        return true;
    } isPalindrome {
        while (start < end) {
            if (word[start] != word[end]) return false;
            start++;
            end--;
        }
        return true;
    } while (start < end) {
            if (word[start] != word[end]) return false;
            start++;
            end--;
        } start < end start end {
            if (word[start] != word[end]) return false;
            start++;
            end--;
        } if (word[start] != word[end]) return false; word[start] != word[end] word[start] word start word[end] word end return false; false start++ start end-- end return true; true int start start int end end char[] word word static class CF_Reader {
        BufferedReader br;
        StringTokenizer st;

        public CF_Reader() throws IOException {
            br = new BufferedReader(new InputStreamReader(System.in));
        }

        String next() throws IOException {
            while (st == null || !st.hasMoreTokens())
                st = new StringTokenizer(br.readLine().trim());
            return st.nextToken();
        }

        long nextLong() throws IOException {
            return Long.parseLong(next());
        }

        int nextInt() throws IOException {
            return Integer.parseInt(next());
        }

        double nextDouble() throws IOException {
            return Double.parseDouble(next());
        }

        char nextCharacter() throws IOException {
            return next().charAt(0);
        }

        String nextLine() throws IOException {
            return br.readLine().trim();
        }
    } CF_Reader BufferedReader br; br StringTokenizer st; st public CF_Reader() throws IOException {
            br = new BufferedReader(new InputStreamReader(System.in));
        } CF_Reader {
            br = new BufferedReader(new InputStreamReader(System.in));
        } br = new BufferedReader(new InputStreamReader(System.in)) br new BufferedReader(new InputStreamReader(System.in)) String next() throws IOException {
            while (st == null || !st.hasMoreTokens())
                st = new StringTokenizer(br.readLine().trim());
            return st.nextToken();
        } next {
            while (st == null || !st.hasMoreTokens())
                st = new StringTokenizer(br.readLine().trim());
            return st.nextToken();
        } while (st == null || !st.hasMoreTokens())
                st = new StringTokenizer(br.readLine().trim()); st == null || !st.hasMoreTokens() st == null st null !st.hasMoreTokens() st.hasMoreTokens() st.hasMoreTokens st st = new StringTokenizer(br.readLine().trim()) st new StringTokenizer(br.readLine().trim()) return st.nextToken(); st.nextToken() st.nextToken st long nextLong() throws IOException {
            return Long.parseLong(next());
        } nextLong {
            return Long.parseLong(next());
        } return Long.parseLong(next()); Long.parseLong(next()) Long.parseLong Long next() next int nextInt() throws IOException {
            return Integer.parseInt(next());
        } nextInt {
            return Integer.parseInt(next());
        } return Integer.parseInt(next()); Integer.parseInt(next()) Integer.parseInt Integer next() next double nextDouble() throws IOException {
            return Double.parseDouble(next());
        } nextDouble {
            return Double.parseDouble(next());
        } return Double.parseDouble(next()); Double.parseDouble(next()) Double.parseDouble Double next() next char nextCharacter() throws IOException {
            return next().charAt(0);
        } nextCharacter {
            return next().charAt(0);
        } return next().charAt(0); next().charAt(0) next().charAt next() next 0 String nextLine() throws IOException {
            return br.readLine().trim();
        } nextLine {
            return br.readLine().trim();
        } return br.readLine().trim(); br.readLine().trim() br.readLine().trim br.readLine() br.readLine br public class Main {
    static PrintWriter out;

    public static void main(String[] args) throws IOException {
        out = new PrintWriter(new OutputStreamWriter(System.out));
        CF_Reader in = new CF_Reader();

        char[] word = in.next().toCharArray();
        int ln = word.length;
        int halve = (ln - 1) / 2;
        boolean f = isPalindrome(0, halve-1, word);
        boolean s =  isPalindrome(halve + 1, ln - 1, word);
        boolean l = isPalindrome(0, ln - 1, word);
        System.out.println((f && s && l) ? "Yes": "No");

        out.close();
    }



    static boolean isPalindrome(int start, int end, char[] word) {
        while (start < end) {
            if (word[start] != word[end]) return false;
            start++;
            end--;
        }
        return true;
    }


    static class CF_Reader {
        BufferedReader br;
        StringTokenizer st;

        public CF_Reader() throws IOException {
            br = new BufferedReader(new InputStreamReader(System.in));
        }

        String next() throws IOException {
            while (st == null || !st.hasMoreTokens())
                st = new StringTokenizer(br.readLine().trim());
            return st.nextToken();
        }

        long nextLong() throws IOException {
            return Long.parseLong(next());
        }

        int nextInt() throws IOException {
            return Integer.parseInt(next());
        }

        double nextDouble() throws IOException {
            return Double.parseDouble(next());
        }

        char nextCharacter() throws IOException {
            return next().charAt(0);
        }

        String nextLine() throws IOException {
            return br.readLine().trim();
        }
    }
} public class Main {
    static PrintWriter out;

    public static void main(String[] args) throws IOException {
        out = new PrintWriter(new OutputStreamWriter(System.out));
        CF_Reader in = new CF_Reader();

        char[] word = in.next().toCharArray();
        int ln = word.length;
        int halve = (ln - 1) / 2;
        boolean f = isPalindrome(0, halve-1, word);
        boolean s =  isPalindrome(halve + 1, ln - 1, word);
        boolean l = isPalindrome(0, ln - 1, word);
        System.out.println((f && s && l) ? "Yes": "No");

        out.close();
    }



    static boolean isPalindrome(int start, int end, char[] word) {
        while (start < end) {
            if (word[start] != word[end]) return false;
            start++;
            end--;
        }
        return true;
    }


    static class CF_Reader {
        BufferedReader br;
        StringTokenizer st;

        public CF_Reader() throws IOException {
            br = new BufferedReader(new InputStreamReader(System.in));
        }

        String next() throws IOException {
            while (st == null || !st.hasMoreTokens())
                st = new StringTokenizer(br.readLine().trim());
            return st.nextToken();
        }

        long nextLong() throws IOException {
            return Long.parseLong(next());
        }

        int nextInt() throws IOException {
            return Integer.parseInt(next());
        }

        double nextDouble() throws IOException {
            return Double.parseDouble(next());
        }

        char nextCharacter() throws IOException {
            return next().charAt(0);
        }

        String nextLine() throws IOException {
            return br.readLine().trim();
        }
    }
} Main
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {
    static PrintWriter out;

    public static void main(String[] args) throws IOException {
        out = new PrintWriter(new OutputStreamWriter(System.out));
        CF_Reader in = new CF_Reader();

        char[] word = in.next().toCharArray();
        int ln = word.length;
        int halve = (ln - 1) / 2;
        boolean f = isPalindrome(0, halve-1, word);
        boolean s =  isPalindrome(halve + 1, ln - 1, word);
        boolean l = isPalindrome(0, ln - 1, word);
        System.out.println((f && s && l) ? "Yes": "No");

        out.close();
    }



    static boolean isPalindrome(int start, int end, char[] word) {
        while (start < end) {
            if (word[start] != word[end]) return false;
            start++;
            end--;
        }
        return true;
    }


    static class CF_Reader {
        BufferedReader br;
        StringTokenizer st;

        public CF_Reader() throws IOException {
            br = new BufferedReader(new InputStreamReader(System.in));
        }

        String next() throws IOException {
            while (st == null || !st.hasMoreTokens())
                st = new StringTokenizer(br.readLine().trim());
            return st.nextToken();
        }

        long nextLong() throws IOException {
            return Long.parseLong(next());
        }

        int nextInt() throws IOException {
            return Integer.parseInt(next());
        }

        double nextDouble() throws IOException {
            return Double.parseDouble(next());
        }

        char nextCharacter() throws IOException {
            return next().charAt(0);
        }

        String nextLine() throws IOException {
            return br.readLine().trim();
        }
    }
}
