/*
 * Portions Copyright 2005 Sun Microsystems, Inc.  All Rights Reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.  Sun designates this
 * particular file as subject to the "Classpath" exception as provided
 * by Sun in the LICENSE file that accompanied this code.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
 * CA 95054 USA or visit www.sun.com if you need additional information or
 * have any questions.
 */

/*
 */

/*
 * (C) Copyright Taligent, Inc. 1996, 1997 - All Rights Reserved
 * (C) Copyright IBM Corp. 1996 - 1998 - All Rights Reserved
 *
 * The original version of this source code and documentation
 * is copyrighted and owned by Taligent, Inc., a wholly-owned
 * subsidiary of IBM. These materials are provided under terms
 * of a License Agreement between Taligent and Sun. This technology
 * is protected by multiple US and International patents.
 *
 * This notice and attribution to Taligent may not be removed.
 * Taligent is a registered trademark of Taligent, Inc.
 *
 */

package sun.text.resources;

import java.util.ListResourceBundle;

public class CollationData_mk extends ListResourceBundle {

    protected final Object[][] getContents() {
        return new Object[][] {
             { "Rule",
                /* for mk, default plus the following */

              "& 9 < \u0482 " +       // thousand sign
              "& Z " +                // Arabic script sorts after Z's
              "< \u0430 , \u0410" +   // a
              "< \u0431 , \u0411" +   // be
              "< \u0432 , \u0412" +   // ve
              "< \u0433 , \u0413" +   // ghe
              "; \u0491 , \u0490" +   // ghe-upturn
              "; \u0495 , \u0494" +   // ghe-mid-hook
              "; \u0453 , \u0403" +   // gje
              "; \u0493 , \u0492" +   // ghe-stroke
              "< \u0434 , \u0414" +   // de
              "< \u0452 , \u0402" +   // dje
              "< \u0435 , \u0415" +   // ie
              "; \u04bd , \u04bc" +   // che
              "; \u0451 , \u0401" +   // io
              "; \u04bf , \u04be" +   // che-descender
              "< \u0454 , \u0404" +   // uk ie
              "< \u0436 , \u0416" +   // zhe
              "; \u0497 , \u0496" +   // zhe-descender
              "; \u04c2 , \u04c1" +   // zhe-breve
              "< \u0437 , \u0417" +   // ze
              "; \u0499 , \u0498" +   // zh-descender
              "< \u0455 , \u0405" +   // dze
              "< \u0438 , \u0418" +   // i
              "< \u0456 , \u0406" +   // uk/bg i
              "; \u04c0 " +           // palochka
              "< \u0457 , \u0407" +   // uk yi
              "< \u0439 , \u0419" +   // short i
              "< \u0458 , \u0408" +   // je
              "< \u043a , \u041a" +   // ka
              "; \u049f , \u049e" +   // ka-stroke
              "; \u04c4 , \u04c3" +   // ka-hook
              "; \u049d , \u049c" +   // ka-vt-stroke
              "; \u04a1 , \u04a0" +   // bashkir-ka
              "; \u045c , \u040c" +   // kje
              "; \u049b , \u049a" +   // ka-descender
              "< \u043b , \u041b" +   // el
              "< \u0459 , \u0409" +   // lje
              "< \u043c , \u041c" +   // em
              "< \u043d , \u041d" +   // en
              "; \u0463 " +           // yat
              "; \u04a3 , \u04a2" +   // en-descender
              "; \u04a5 , \u04a4" +   // en-ghe
              "; \u04bb , \u04ba" +   // shha
              "; \u04c8 , \u04c7" +   // en-hook
              "< \u045a , \u040a" +   // nje
              "< \u043e , \u041e" +   // o
              "; \u04a9 , \u04a8" +   // ha
              "< \u043f , \u041f" +   // pe
              "; \u04a7 , \u04a6" +   // pe-mid-hook
              "< \u0440 , \u0420" +   // er
              "< \u0441 , \u0421" +   // es
              "; \u04ab , \u04aa" +   // es-descender
              "< \u0442 , \u0422" +   // te
              "; \u04ad , \u04ac" +   // te-descender
              "< \u045b , \u040b" +   // tshe
              "< \u0443 , \u0423" +   // u
              "; \u04af , \u04ae" +   // straight u
              "< \u045e , \u040e" +   // short u
              "< \u04b1 , \u04b0" +   // straight u-stroke
              "< \u0444 , \u0424" +   // ef
              "< \u0445 , \u0425" +   // ha
              "; \u04b3 , \u04b2" +   // ha-descender
              "< \u0446 , \u0426" +   // tse
              "; \u04b5 , \u04b4" +   // te tse
              "< \u0447 , \u0427" +   // che
              "; \u04b7 ; \u04b6" +   // che-descender
              "; \u04b9 , \u04b8" +   // che-vt-stroke
              "; \u04cc , \u04cb" +   // che
              "< \u045f , \u040f" +   // dzhe
              "< \u0448 , \u0428" +   // sha
              "< \u0449 , \u0429" +   // shcha
              "< \u044a , \u042a" +   // hard sign
              "< \u044b , \u042b" +   // yeru
              "< \u044c , \u042c" +   // soft sign
              "< \u044d , \u042d" +   // e
              "< \u044e , \u042e" +   // yu
              "< \u044f , \u042f" +   // ya
              "< \u0461 , \u0460" +   // omega
              "< \u0462 " +           // yat
              "< \u0465 , \u0464" +   // iotified e
              "< \u0467 , \u0466" +   // little yus
              "< \u0469 , \u0468" +   // iotified little yus
              "< \u046b , \u046a" +   // big yus
              "< \u046d , \u046c" +   // iotified big yus
              "< \u046f , \u046e" +   // ksi
              "< \u0471 , \u0470" +   // psi
              "< \u0473 , \u0472" +   // fita
              "< \u0475 , \u0474" +   // izhitsa
              "; \u0477 , \u0476" +   // izhitsa-double-grave
              "< \u0479 , \u0478" +   // uk
              "< \u047b , \u047a" +   // round omega
              "< \u047d , \u047c" +   // omega-titlo
              "< \u047f , \u047e" +   // ot
              "< \u0481 , \u0480"     // koppa
            }
        };
    }
}
