Source Code Cross Referenced for BarcodePDF417.java in  » PDF » pdf-itext » com » lowagie » text » pdf » Java Source Code / Java DocumentationJava Source Code and Java Documentation

Java Source Code / Java Documentation
1. 6.0 JDK Core
2. 6.0 JDK Modules
3. 6.0 JDK Modules com.sun
4. 6.0 JDK Modules com.sun.java
5. 6.0 JDK Modules sun
6. 6.0 JDK Platform
7. Ajax
8. Apache Harmony Java SE
9. Aspect oriented
10. Authentication Authorization
11. Blogger System
12. Build
13. Byte Code
14. Cache
15. Chart
16. Chat
17. Code Analyzer
18. Collaboration
19. Content Management System
20. Database Client
21. Database DBMS
22. Database JDBC Connection Pool
23. Database ORM
24. Development
25. EJB Server geronimo
26. EJB Server GlassFish
27. EJB Server JBoss 4.2.1
28. EJB Server resin 3.1.5
29. ERP CRM Financial
30. ESB
31. Forum
32. GIS
33. Graphic Library
34. Groupware
35. HTML Parser
36. IDE
37. IDE Eclipse
38. IDE Netbeans
39. Installer
40. Internationalization Localization
41. Inversion of Control
42. Issue Tracking
43. J2EE
44. JBoss
45. JMS
46. JMX
47. Library
48. Mail Clients
49. Net
50. Parser
51. PDF
52. Portal
53. Profiler
54. Project Management
55. Report
56. RSS RDF
57. Rule Engine
58. Science
59. Scripting
60. Search Engine
61. Security
62. Sevlet Container
63. Source Control
64. Swing Library
65. Template Engine
66. Test Coverage
67. Testing
68. UML
69. Web Crawler
70. Web Framework
71. Web Mail
72. Web Server
73. Web Services
74. Web Services apache cxf 2.0.1
75. Web Services AXIS2
76. Wiki Engine
77. Workflow Engines
78. XML
79. XML UI
Java
Java Tutorial
Java Open Source
Jar File Download
Java Articles
Java Products
Java by API
Photoshop Tutorials
Maya Tutorials
Flash Tutorials
3ds-Max Tutorials
Illustrator Tutorials
GIMP Tutorials
C# / C Sharp
C# / CSharp Tutorial
C# / CSharp Open Source
ASP.Net
ASP.NET Tutorial
JavaScript DHTML
JavaScript Tutorial
JavaScript Reference
HTML / CSS
HTML CSS Reference
C / ANSI-C
C Tutorial
C++
C++ Tutorial
Ruby
PHP
Python
Python Tutorial
Python Open Source
SQL Server / T-SQL
SQL Server / T-SQL Tutorial
Oracle PL / SQL
Oracle PL/SQL Tutorial
PostgreSQL
SQL / MySQL
MySQL Tutorial
VB.Net
VB.Net Tutorial
Flash / Flex / ActionScript
VBA / Excel / Access / Word
XML
XML Tutorial
Microsoft Office PowerPoint 2007 Tutorial
Microsoft Office Excel 2007 Tutorial
Microsoft Office Word 2007 Tutorial
Java Source Code / Java Documentation » PDF » pdf itext » com.lowagie.text.pdf 
Source Cross Referenced  Class Diagram Java Document (Java Doc) 


0001:        /*
0002:         *
0003:         * Copyright 2003 Paulo Soares
0004:         *
0005:         * The contents of this file are subject to the Mozilla Public License Version 1.1
0006:         * (the "License"); you may not use this file except in compliance with the License.
0007:         * You may obtain a copy of the License at http://www.mozilla.org/MPL/
0008:         *
0009:         * Software distributed under the License is distributed on an "AS IS" basis,
0010:         * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
0011:         * for the specific language governing rights and limitations under the License.
0012:         *
0013:         * The Original Code is 'iText, a free JAVA-PDF library'.
0014:         *
0015:         * The Initial Developer of the Original Code is Bruno Lowagie. Portions created by
0016:         * the Initial Developer are Copyright (C) 1999, 2000, 2001, 2002 by Bruno Lowagie.
0017:         * All Rights Reserved.
0018:         * Co-Developer of the code is Paulo Soares. Portions created by the Co-Developer
0019:         * are Copyright (C) 2000, 2001, 2002 by Paulo Soares. All Rights Reserved.
0020:         *
0021:         * Contributor(s): all the names of the contributors are added in the source code
0022:         * where applicable.
0023:         *
0024:         * Alternatively, the contents of this file may be used under the terms of the
0025:         * LGPL license (the "GNU LIBRARY GENERAL PUBLIC LICENSE"), in which case the
0026:         * provisions of LGPL are applicable instead of those above.  If you wish to
0027:         * allow use of your version of this file only under the terms of the LGPL
0028:         * License and not to allow others to use your version of this file under
0029:         * the MPL, indicate your decision by deleting the provisions above and
0030:         * replace them with the notice and other provisions required by the LGPL.
0031:         * If you do not delete the provisions above, a recipient may use your version
0032:         * of this file under either the MPL or the GNU LIBRARY GENERAL PUBLIC LICENSE.
0033:         *
0034:         * This library is free software; you can redistribute it and/or modify it
0035:         * under the terms of the MPL as stated above or under the terms of the GNU
0036:         * Library General Public License as published by the Free Software Foundation;
0037:         * either version 2 of the License, or any later version.
0038:         *
0039:         * This library is distributed in the hope that it will be useful, but WITHOUT
0040:         * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
0041:         * FOR A PARTICULAR PURPOSE. See the GNU Library general Public License for more
0042:         * details.
0043:         *
0044:         * If you didn't download this code from the following link, you should check if
0045:         * you aren't using an obsolete version:
0046:         * http://www.lowagie.com/iText/
0047:         */
0048:
0049:        package com.lowagie.text.pdf;
0050:
0051:        import java.awt.Canvas;
0052:        import java.awt.Color;
0053:        import java.awt.image.MemoryImageSource;
0054:        import java.util.ArrayList;
0055:
0056:        import com.lowagie.text.BadElementException;
0057:        import com.lowagie.text.Image;
0058:        import com.lowagie.text.pdf.codec.CCITTG4Encoder;
0059:
0060:        /** Generates the 2D barcode PDF417. Supports dimensioning auto-sizing, fixed
0061:         * and variable sizes, automatic and manual error levels, raw codeword input,
0062:         * codeword size optimization and bitmap inversion. The output can
0063:         * be a CCITT G4 <CODE>Image</CODE> or a raw bitmap.
0064:         * @author Paulo Soares (psoares@consiste.pt)
0065:         */
0066:        public class BarcodePDF417 {
0067:
0068:            /** Auto-size is made based on <CODE>aspectRatio</CODE> and <CODE>yHeight</CODE>. */
0069:            public static final int PDF417_USE_ASPECT_RATIO = 0;
0070:            /** The size of the barcode will be at least <CODE>codeColumns*codeRows</CODE>. */
0071:            public static final int PDF417_FIXED_RECTANGLE = 1;
0072:            /** The size will be at least <CODE>codeColumns</CODE>
0073:             * with a variable number of <CODE>codeRows</CODE>.
0074:             */
0075:            public static final int PDF417_FIXED_COLUMNS = 2;
0076:            /** The size will be at least <CODE>codeRows</CODE>
0077:             * with a variable number of <CODE>codeColumns</CODE>.
0078:             */
0079:            public static final int PDF417_FIXED_ROWS = 4;
0080:            /** The error level correction is set automatically according
0081:             * to ISO 15438 recomendations.
0082:             */
0083:            public static final int PDF417_AUTO_ERROR_LEVEL = 0;
0084:            /** The error level correction is set by the user. It can be 0 to 8. */
0085:            public static final int PDF417_USE_ERROR_LEVEL = 16;
0086:            /**
0087:             * One single binary segment is used
0088:             */
0089:            public static final int PDF417_FORCE_BINARY = 32;
0090:            /** No <CODE>text</CODE> interpretation is done and the content of <CODE>codewords</CODE>
0091:             * is used directly.
0092:             */
0093:            public static final int PDF417_USE_RAW_CODEWORDS = 64;
0094:            /** Inverts the output bits of the raw bitmap that is normally
0095:             * bit one for black. It has only effect for the raw bitmap.
0096:             */
0097:            public static final int PDF417_INVERT_BITMAP = 128;
0098:            /** Use Macro PDF417 Encoding
0099:             * @see #setMacroFileId(String)
0100:             * @see #setMacroSegmentId(int)
0101:             * @see #setMacroSegmentCount(int)
0102:             */
0103:            public static final int PDF417_USE_MACRO = 256;
0104:
0105:            private int macroSegmentCount = 0;
0106:            private int macroSegmentId = -1;
0107:            private String macroFileId;
0108:            protected int bitPtr;
0109:            protected int cwPtr;
0110:            protected SegmentList segmentList;
0111:
0112:            /** Creates a new <CODE>BarcodePDF417</CODE> with the default settings. */
0113:            public BarcodePDF417() {
0114:                setDefaultParameters();
0115:            }
0116:
0117:            /**
0118:             * Sets the segment id for macro PDF417 encoding
0119:             * @param id the id (starting at 0)
0120:             * @see #setMacroSegmentCount(int)
0121:             */
0122:            public void setMacroSegmentId(int id) {
0123:                this .macroSegmentId = id;
0124:            }
0125:
0126:            /**
0127:             * Sets the segment count for macro PDF417 encoding
0128:             * @param cnt the number of macro segments
0129:             * @see #setMacroSegmentId(int)
0130:             */
0131:            public void setMacroSegmentCount(int cnt) {
0132:                this .macroSegmentCount = cnt;
0133:            }
0134:
0135:            /**
0136:             * Sets the File ID for macro PDF417 encoding 
0137:             * @param id the file id
0138:             */
0139:            public void setMacroFileId(String id) {
0140:                this .macroFileId = id;
0141:            }
0142:
0143:            protected boolean checkSegmentType(Segment segment, char type) {
0144:                if (segment == null)
0145:                    return false;
0146:                return segment.type == type;
0147:            }
0148:
0149:            protected int getSegmentLength(Segment segment) {
0150:                if (segment == null)
0151:                    return 0;
0152:                return segment.end - segment.start;
0153:            }
0154:
0155:            /** Set the default settings that correspond to <CODE>PDF417_USE_ASPECT_RATIO</CODE>
0156:             * and <CODE>PDF417_AUTO_ERROR_LEVEL</CODE>.
0157:             */
0158:            public void setDefaultParameters() {
0159:                options = 0;
0160:                outBits = null;
0161:                text = new byte[0];
0162:                yHeight = 3;
0163:                aspectRatio = 0.5f;
0164:            }
0165:
0166:            protected void outCodeword17(int codeword) {
0167:                int bytePtr = bitPtr / 8;
0168:                int bit = bitPtr - bytePtr * 8;
0169:                outBits[bytePtr++] |= codeword >> (9 + bit);
0170:                outBits[bytePtr++] |= codeword >> (1 + bit);
0171:                codeword <<= 8;
0172:                outBits[bytePtr] |= codeword >> (1 + bit);
0173:                bitPtr += 17;
0174:            }
0175:
0176:            protected void outCodeword18(int codeword) {
0177:                int bytePtr = bitPtr / 8;
0178:                int bit = bitPtr - bytePtr * 8;
0179:                outBits[bytePtr++] |= codeword >> (10 + bit);
0180:                outBits[bytePtr++] |= codeword >> (2 + bit);
0181:                codeword <<= 8;
0182:                outBits[bytePtr] |= codeword >> (2 + bit);
0183:                if (bit == 7)
0184:                    outBits[++bytePtr] |= 0x80;
0185:                bitPtr += 18;
0186:            }
0187:
0188:            protected void outCodeword(int codeword) {
0189:                outCodeword17(codeword);
0190:            }
0191:
0192:            protected void outStopPattern() {
0193:                outCodeword18(STOP_PATTERN);
0194:            }
0195:
0196:            protected void outStartPattern() {
0197:                outCodeword17(START_PATTERN);
0198:            }
0199:
0200:            protected void outPaintCode() {
0201:                int codePtr = 0;
0202:                bitColumns = START_CODE_SIZE * (codeColumns + 3) + STOP_SIZE;
0203:                int lenBits = ((bitColumns - 1) / 8 + 1) * codeRows;
0204:                outBits = new byte[lenBits];
0205:                for (int row = 0; row < codeRows; ++row) {
0206:                    bitPtr = ((bitColumns - 1) / 8 + 1) * 8 * row;
0207:                    int rowMod = row % 3;
0208:                    int cluster[] = CLUSTERS[rowMod];
0209:                    outStartPattern();
0210:                    int edge = 0;
0211:                    switch (rowMod) {
0212:                    case 0:
0213:                        edge = 30 * (row / 3) + ((codeRows - 1) / 3);
0214:                        break;
0215:                    case 1:
0216:                        edge = 30 * (row / 3) + errorLevel * 3
0217:                                + ((codeRows - 1) % 3);
0218:                        break;
0219:                    default:
0220:                        edge = 30 * (row / 3) + codeColumns - 1;
0221:                        break;
0222:                    }
0223:                    outCodeword(cluster[edge]);
0224:
0225:                    for (int column = 0; column < codeColumns; ++column) {
0226:                        outCodeword(cluster[codewords[codePtr++]]);
0227:                    }
0228:
0229:                    switch (rowMod) {
0230:                    case 0:
0231:                        edge = 30 * (row / 3) + codeColumns - 1;
0232:                        break;
0233:                    case 1:
0234:                        edge = 30 * (row / 3) + ((codeRows - 1) / 3);
0235:                        break;
0236:                    default:
0237:                        edge = 30 * (row / 3) + errorLevel * 3
0238:                                + ((codeRows - 1) % 3);
0239:                        break;
0240:                    }
0241:                    outCodeword(cluster[edge]);
0242:                    outStopPattern();
0243:                }
0244:                if ((options & PDF417_INVERT_BITMAP) != 0) {
0245:                    for (int k = 0; k < outBits.length; ++k)
0246:                        outBits[k] ^= 0xff;
0247:                }
0248:            }
0249:
0250:            protected void calculateErrorCorrection(int dest) {
0251:                if (errorLevel < 0 || errorLevel > 8)
0252:                    errorLevel = 0;
0253:                int A[] = ERROR_LEVEL[errorLevel];
0254:                int Alength = 2 << errorLevel;
0255:                for (int k = 0; k < Alength; ++k)
0256:                    codewords[dest + k] = 0;
0257:                int lastE = Alength - 1;
0258:                for (int k = 0; k < lenCodewords; ++k) {
0259:                    int t1 = codewords[k] + codewords[dest];
0260:                    for (int e = 0; e <= lastE; ++e) {
0261:                        int t2 = (t1 * A[lastE - e]) % MOD;
0262:                        int t3 = MOD - t2;
0263:                        codewords[dest + e] = ((e == lastE ? 0 : codewords[dest
0264:                                + e + 1]) + t3)
0265:                                % MOD;
0266:                    }
0267:                }
0268:                for (int k = 0; k < Alength; ++k)
0269:                    codewords[dest + k] = (MOD - codewords[dest + k]) % MOD;
0270:            }
0271:
0272:            private static int getTextTypeAndValue(byte[] input, int maxLength,
0273:                    int idx) {
0274:                if (idx >= maxLength)
0275:                    return 0;
0276:                char c = (char) (input[idx] & 0xff);
0277:                if (c >= 'A' && c <= 'Z')
0278:                    return (ALPHA + c - 'A');
0279:                if (c >= 'a' && c <= 'z')
0280:                    return (LOWER + c - 'a');
0281:                if (c == ' ')
0282:                    return (ALPHA + LOWER + MIXED + SPACE);
0283:                int ms = MIXED_SET.indexOf(c);
0284:                int ps = PUNCTUATION_SET.indexOf(c);
0285:                if (ms < 0 && ps < 0)
0286:                    return (ISBYTE + c);
0287:                if (ms == ps)
0288:                    return (MIXED + PUNCTUATION + ms);
0289:                if (ms >= 0)
0290:                    return (MIXED + ms);
0291:                return (PUNCTUATION + ps);
0292:            }
0293:
0294:            protected int getTextTypeAndValue(int maxLength, int idx) {
0295:                return getTextTypeAndValue(text, maxLength, idx);
0296:            }
0297:
0298:            private void textCompaction(byte[] input, int start, int length) {
0299:                int dest[] = new int[ABSOLUTE_MAX_TEXT_SIZE * 2];
0300:                int mode = ALPHA;
0301:                int ptr = 0;
0302:                int fullBytes = 0;
0303:                int v = 0;
0304:                int k;
0305:                int size;
0306:                length += start;
0307:                for (k = start; k < length; ++k) {
0308:                    v = getTextTypeAndValue(input, length, k);
0309:                    if ((v & mode) != 0) {
0310:                        dest[ptr++] = v & 0xff;
0311:                        continue;
0312:                    }
0313:                    if ((v & ISBYTE) != 0) {
0314:                        if ((ptr & 1) != 0) {
0315:                            dest[ptr++] = (mode & PUNCTUATION) != 0 ? PAL : PS;
0316:                            mode = (mode & PUNCTUATION) != 0 ? ALPHA : mode;
0317:                        }
0318:                        dest[ptr++] = BYTESHIFT;
0319:                        dest[ptr++] = v & 0xff;
0320:                        fullBytes += 2;
0321:                        continue;
0322:                    }
0323:                    switch (mode) {
0324:                    case ALPHA:
0325:                        if ((v & LOWER) != 0) {
0326:                            dest[ptr++] = LL;
0327:                            dest[ptr++] = v & 0xff;
0328:                            mode = LOWER;
0329:                        } else if ((v & MIXED) != 0) {
0330:                            dest[ptr++] = ML;
0331:                            dest[ptr++] = v & 0xff;
0332:                            mode = MIXED;
0333:                        } else if ((getTextTypeAndValue(input, length, k + 1)
0334:                                & getTextTypeAndValue(input, length, k + 2) & PUNCTUATION) != 0) {
0335:                            dest[ptr++] = ML;
0336:                            dest[ptr++] = PL;
0337:                            dest[ptr++] = v & 0xff;
0338:                            mode = PUNCTUATION;
0339:                        } else {
0340:                            dest[ptr++] = PS;
0341:                            dest[ptr++] = v & 0xff;
0342:                        }
0343:                        break;
0344:                    case LOWER:
0345:                        if ((v & ALPHA) != 0) {
0346:                            if ((getTextTypeAndValue(input, length, k + 1)
0347:                                    & getTextTypeAndValue(input, length, k + 2) & ALPHA) != 0) {
0348:                                dest[ptr++] = ML;
0349:                                dest[ptr++] = AL;
0350:                                mode = ALPHA;
0351:                            } else {
0352:                                dest[ptr++] = AS;
0353:                            }
0354:                            dest[ptr++] = v & 0xff;
0355:                        } else if ((v & MIXED) != 0) {
0356:                            dest[ptr++] = ML;
0357:                            dest[ptr++] = v & 0xff;
0358:                            mode = MIXED;
0359:                        } else if ((getTextTypeAndValue(input, length, k + 1)
0360:                                & getTextTypeAndValue(input, length, k + 2) & PUNCTUATION) != 0) {
0361:                            dest[ptr++] = ML;
0362:                            dest[ptr++] = PL;
0363:                            dest[ptr++] = v & 0xff;
0364:                            mode = PUNCTUATION;
0365:                        } else {
0366:                            dest[ptr++] = PS;
0367:                            dest[ptr++] = v & 0xff;
0368:                        }
0369:                        break;
0370:                    case MIXED:
0371:                        if ((v & LOWER) != 0) {
0372:                            dest[ptr++] = LL;
0373:                            dest[ptr++] = v & 0xff;
0374:                            mode = LOWER;
0375:                        } else if ((v & ALPHA) != 0) {
0376:                            dest[ptr++] = AL;
0377:                            dest[ptr++] = v & 0xff;
0378:                            mode = ALPHA;
0379:                        } else if ((getTextTypeAndValue(input, length, k + 1)
0380:                                & getTextTypeAndValue(input, length, k + 2) & PUNCTUATION) != 0) {
0381:                            dest[ptr++] = PL;
0382:                            dest[ptr++] = v & 0xff;
0383:                            mode = PUNCTUATION;
0384:                        } else {
0385:                            dest[ptr++] = PS;
0386:                            dest[ptr++] = v & 0xff;
0387:                        }
0388:                        break;
0389:                    case PUNCTUATION:
0390:                        dest[ptr++] = PAL;
0391:                        mode = ALPHA;
0392:                        --k;
0393:                        break;
0394:                    }
0395:                }
0396:                if ((ptr & 1) != 0)
0397:                    dest[ptr++] = PS;
0398:                size = (ptr + fullBytes) / 2;
0399:                if (size + cwPtr > MAX_DATA_CODEWORDS) {
0400:                    throw new IndexOutOfBoundsException("The text is too big.");
0401:                }
0402:                length = ptr;
0403:                ptr = 0;
0404:                while (ptr < length) {
0405:                    v = dest[ptr++];
0406:                    if (v >= 30) {
0407:                        codewords[cwPtr++] = v;
0408:                        codewords[cwPtr++] = dest[ptr++];
0409:                    } else
0410:                        codewords[cwPtr++] = v * 30 + dest[ptr++];
0411:                }
0412:            }
0413:
0414:            protected void textCompaction(int start, int length) {
0415:                textCompaction(text, start, length);
0416:            }
0417:
0418:            protected void basicNumberCompaction(int start, int length) {
0419:                basicNumberCompaction(text, start, length);
0420:            }
0421:
0422:            private void basicNumberCompaction(byte[] input, int start,
0423:                    int length) {
0424:                int ret = cwPtr;
0425:                int retLast = length / 3;
0426:                int ni, k;
0427:                cwPtr += retLast + 1;
0428:                for (k = 0; k <= retLast; ++k)
0429:                    codewords[ret + k] = 0;
0430:                codewords[ret + retLast] = 1;
0431:                length += start;
0432:                for (ni = start; ni < length; ++ni) {
0433:                    // multiply by 10
0434:                    for (k = retLast; k >= 0; --k)
0435:                        codewords[ret + k] *= 10;
0436:                    // add the digit
0437:                    codewords[ret + retLast] += input[ni] - '0';
0438:                    // propagate carry
0439:                    for (k = retLast; k > 0; --k) {
0440:                        codewords[ret + k - 1] += codewords[ret + k] / 900;
0441:                        codewords[ret + k] %= 900;
0442:                    }
0443:                }
0444:            }
0445:
0446:            private void numberCompaction(byte[] input, int start, int length) {
0447:                int full = (length / 44) * 15;
0448:                int size = length % 44;
0449:                int k;
0450:                if (size == 0)
0451:                    size = full;
0452:                else
0453:                    size = full + size / 3 + 1;
0454:                if (size + cwPtr > MAX_DATA_CODEWORDS) {
0455:                    throw new IndexOutOfBoundsException("The text is too big.");
0456:                }
0457:                length += start;
0458:                for (k = start; k < length; k += 44) {
0459:                    size = length - k < 44 ? length - k : 44;
0460:                    basicNumberCompaction(input, k, size);
0461:                }
0462:            }
0463:
0464:            protected void numberCompaction(int start, int length) {
0465:                numberCompaction(text, start, length);
0466:            }
0467:
0468:            protected void byteCompaction6(int start) {
0469:                int length = 6;
0470:                int ret = cwPtr;
0471:                int retLast = 4;
0472:                int ni, k;
0473:                cwPtr += retLast + 1;
0474:                for (k = 0; k <= retLast; ++k)
0475:                    codewords[ret + k] = 0;
0476:                length += start;
0477:                for (ni = start; ni < length; ++ni) {
0478:                    // multiply by 256
0479:                    for (k = retLast; k >= 0; --k)
0480:                        codewords[ret + k] *= 256;
0481:                    // add the digit
0482:                    codewords[ret + retLast] += (int) text[ni] & 0xff;
0483:                    // propagate carry
0484:                    for (k = retLast; k > 0; --k) {
0485:                        codewords[ret + k - 1] += codewords[ret + k] / 900;
0486:                        codewords[ret + k] %= 900;
0487:                    }
0488:                }
0489:            }
0490:
0491:            void byteCompaction(int start, int length) {
0492:                int k, j;
0493:                int size = (length / 6) * 5 + (length % 6);
0494:                if (size + cwPtr > MAX_DATA_CODEWORDS) {
0495:                    throw new IndexOutOfBoundsException("The text is too big.");
0496:                }
0497:                length += start;
0498:                for (k = start; k < length; k += 6) {
0499:                    size = length - k < 44 ? length - k : 6;
0500:                    if (size < 6) {
0501:                        for (j = 0; j < size; ++j)
0502:                            codewords[cwPtr++] = (int) text[k + j] & 0xff;
0503:                    } else {
0504:                        byteCompaction6(k);
0505:                    }
0506:                }
0507:            }
0508:
0509:            void breakString() {
0510:                int textLength = text.length;
0511:                int lastP = 0;
0512:                int startN = 0;
0513:                int nd = 0;
0514:                char c = 0;
0515:                int k, j;
0516:                boolean lastTxt, txt;
0517:                Segment v;
0518:                Segment vp;
0519:                Segment vn;
0520:
0521:                if ((options & PDF417_FORCE_BINARY) != 0) {
0522:                    segmentList.add('B', 0, textLength);
0523:                    return;
0524:                }
0525:                for (k = 0; k < textLength; ++k) {
0526:                    c = (char) (text[k] & 0xff);
0527:                    if (c >= '0' && c <= '9') {
0528:                        if (nd == 0)
0529:                            startN = k;
0530:                        ++nd;
0531:                        continue;
0532:                    }
0533:                    if (nd >= 13) {
0534:                        if (lastP != startN) {
0535:                            c = (char) (text[lastP] & 0xff);
0536:                            lastTxt = (c >= ' ' && c < 127) || c == '\r'
0537:                                    || c == '\n' || c == '\t';
0538:                            for (j = lastP; j < startN; ++j) {
0539:                                c = (char) (text[j] & 0xff);
0540:                                txt = (c >= ' ' && c < 127) || c == '\r'
0541:                                        || c == '\n' || c == '\t';
0542:                                if (txt != lastTxt) {
0543:                                    segmentList.add(lastTxt ? 'T' : 'B', lastP,
0544:                                            j);
0545:                                    lastP = j;
0546:                                    lastTxt = txt;
0547:                                }
0548:                            }
0549:                            segmentList.add(lastTxt ? 'T' : 'B', lastP, startN);
0550:                        }
0551:                        segmentList.add('N', startN, k);
0552:                        lastP = k;
0553:                    }
0554:                    nd = 0;
0555:                }
0556:                if (nd < 13)
0557:                    startN = textLength;
0558:                if (lastP != startN) {
0559:                    c = (char) (text[lastP] & 0xff);
0560:                    lastTxt = (c >= ' ' && c < 127) || c == '\r' || c == '\n'
0561:                            || c == '\t';
0562:                    for (j = lastP; j < startN; ++j) {
0563:                        c = (char) (text[j] & 0xff);
0564:                        txt = (c >= ' ' && c < 127) || c == '\r' || c == '\n'
0565:                                || c == '\t';
0566:                        if (txt != lastTxt) {
0567:                            segmentList.add(lastTxt ? 'T' : 'B', lastP, j);
0568:                            lastP = j;
0569:                            lastTxt = txt;
0570:                        }
0571:                    }
0572:                    segmentList.add(lastTxt ? 'T' : 'B', lastP, startN);
0573:                }
0574:                if (nd >= 13)
0575:                    segmentList.add('N', startN, textLength);
0576:                //optimize
0577:                //merge short binary
0578:                for (k = 0; k < segmentList.size(); ++k) {
0579:                    v = segmentList.get(k);
0580:                    vp = segmentList.get(k - 1);
0581:                    vn = segmentList.get(k + 1);
0582:                    if (checkSegmentType(v, 'B') && getSegmentLength(v) == 1) {
0583:                        if (checkSegmentType(vp, 'T')
0584:                                && checkSegmentType(vn, 'T')
0585:                                && getSegmentLength(vp) + getSegmentLength(vn) >= 3) {
0586:                            vp.end = vn.end;
0587:                            segmentList.remove(k);
0588:                            segmentList.remove(k);
0589:                            k = -1;
0590:                            continue;
0591:                        }
0592:                    }
0593:                }
0594:                //merge text sections
0595:                for (k = 0; k < segmentList.size(); ++k) {
0596:                    v = segmentList.get(k);
0597:                    vp = segmentList.get(k - 1);
0598:                    vn = segmentList.get(k + 1);
0599:                    if (checkSegmentType(v, 'T') && getSegmentLength(v) >= 5) {
0600:                        boolean redo = false;
0601:                        if ((checkSegmentType(vp, 'B') && getSegmentLength(vp) == 1)
0602:                                || checkSegmentType(vp, 'T')) {
0603:                            redo = true;
0604:                            v.start = vp.start;
0605:                            segmentList.remove(k - 1);
0606:                            --k;
0607:                        }
0608:                        if ((checkSegmentType(vn, 'B') && getSegmentLength(vn) == 1)
0609:                                || checkSegmentType(vn, 'T')) {
0610:                            redo = true;
0611:                            v.end = vn.end;
0612:                            segmentList.remove(k + 1);
0613:                        }
0614:                        if (redo) {
0615:                            k = -1;
0616:                            continue;
0617:                        }
0618:                    }
0619:                }
0620:                //merge binary sections
0621:                for (k = 0; k < segmentList.size(); ++k) {
0622:                    v = segmentList.get(k);
0623:                    vp = segmentList.get(k - 1);
0624:                    vn = segmentList.get(k + 1);
0625:                    if (checkSegmentType(v, 'B')) {
0626:                        boolean redo = false;
0627:                        if ((checkSegmentType(vp, 'T') && getSegmentLength(vp) < 5)
0628:                                || checkSegmentType(vp, 'B')) {
0629:                            redo = true;
0630:                            v.start = vp.start;
0631:                            segmentList.remove(k - 1);
0632:                            --k;
0633:                        }
0634:                        if ((checkSegmentType(vn, 'T') && getSegmentLength(vn) < 5)
0635:                                || checkSegmentType(vn, 'B')) {
0636:                            redo = true;
0637:                            v.end = vn.end;
0638:                            segmentList.remove(k + 1);
0639:                        }
0640:                        if (redo) {
0641:                            k = -1;
0642:                            continue;
0643:                        }
0644:                    }
0645:                }
0646:                // check if all numbers
0647:                if (segmentList.size() == 1
0648:                        && (v = segmentList.get(0)).type == 'T'
0649:                        && getSegmentLength(v) >= 8) {
0650:                    for (k = v.start; k < v.end; ++k) {
0651:                        c = (char) (text[k] & 0xff);
0652:                        if (c < '0' || c > '9')
0653:                            break;
0654:                    }
0655:                    if (k == v.end)
0656:                        v.type = 'N';
0657:                }
0658:            }
0659:
0660:            protected void assemble() {
0661:                int k;
0662:                if (segmentList.size() == 0)
0663:                    return;
0664:                cwPtr = 1;
0665:                for (k = 0; k < segmentList.size(); ++k) {
0666:                    Segment v = segmentList.get(k);
0667:                    switch (v.type) {
0668:                    case 'T':
0669:                        if (k != 0)
0670:                            codewords[cwPtr++] = TEXT_MODE;
0671:                        textCompaction(v.start, getSegmentLength(v));
0672:                        break;
0673:                    case 'N':
0674:                        codewords[cwPtr++] = NUMERIC_MODE;
0675:                        numberCompaction(v.start, getSegmentLength(v));
0676:                        break;
0677:                    case 'B':
0678:                        codewords[cwPtr++] = (getSegmentLength(v) % 6) != 0 ? BYTE_MODE
0679:                                : BYTE_MODE_6;
0680:                        byteCompaction(v.start, getSegmentLength(v));
0681:                        break;
0682:                    }
0683:                }
0684:
0685:                if ((options & PDF417_USE_MACRO) != 0) {
0686:                    macroCodes();
0687:                }
0688:
0689:            }
0690:
0691:            private void macroCodes() {
0692:                if (macroSegmentId < 0) {
0693:                    throw new IllegalStateException(
0694:                            "macroSegmentId must be >=0");
0695:                }
0696:                if (macroSegmentId >= macroSegmentCount) {
0697:                    throw new IllegalStateException(
0698:                            "macroSegmentId must be < macroSemgentCount");
0699:                }
0700:                if (macroSegmentCount < 1) {
0701:                    throw new IllegalStateException(
0702:                            "macroSemgentCount must be > 0");
0703:                }
0704:
0705:                codewords[cwPtr++] = MACRO_SEGMENT_ID;
0706:                append(macroSegmentId, 5);
0707:
0708:                if (macroFileId != null) {
0709:                    append(macroFileId);
0710:                }
0711:
0712:                codewords[cwPtr++] = MACRO_SEGMENT_COUNT;
0713:                codewords[cwPtr++] = 1;
0714:                append(macroSegmentCount, 5);
0715:
0716:                if (macroSegmentId >= macroSegmentCount - 1) {
0717:                    codewords[cwPtr++] = MACRO_LAST_SEGMENT;
0718:                }
0719:
0720:            }
0721:
0722:            private void append(int in, int len) {
0723:                StringBuffer sb = new StringBuffer(len + 1);
0724:                sb.append(Integer.toString(in));
0725:                for (int i = sb.length(); i < len; i++) {
0726:                    sb.insert(0, "0");
0727:                }
0728:
0729:                byte[] bytes = PdfEncodings.convertToBytes(sb.toString(),
0730:                        "cp437");
0731:                numberCompaction(bytes, 0, bytes.length);
0732:            }
0733:
0734:            private void append(String s) {
0735:                byte[] bytes = PdfEncodings.convertToBytes(s, "cp437");
0736:                textCompaction(bytes, 0, bytes.length);
0737:            }
0738:
0739:            protected static int maxPossibleErrorLevel(int remain) {
0740:                int level = 8;
0741:                int size = 512;
0742:                while (level > 0) {
0743:                    if (remain >= size)
0744:                        return level;
0745:                    --level;
0746:                    size >>= 1;
0747:                }
0748:                return 0;
0749:            }
0750:
0751:            protected void dumpList() {
0752:                if (segmentList.size() == 0)
0753:                    return;
0754:                for (int k = 0; k < segmentList.size(); ++k) {
0755:                    Segment v = segmentList.get(k);
0756:                    int len = getSegmentLength(v);
0757:                    char c[] = new char[len];
0758:                    for (int j = 0; j < len; ++j) {
0759:                        c[j] = (char) (text[v.start + j] & 0xff);
0760:                        if (c[j] == '\r')
0761:                            c[j] = '\n';
0762:                    }
0763:                    StringBuffer sb = new StringBuffer();
0764:                    sb.append(v.type);
0765:                    sb.append(c);
0766:                    System.out.println(sb.toString());
0767:                }
0768:            }
0769:
0770:            protected int getMaxSquare() {
0771:                if (codeColumns > 21) {
0772:                    codeColumns = 29;
0773:                    codeRows = 32;
0774:                } else {
0775:                    codeColumns = 16;
0776:                    codeRows = 58;
0777:                }
0778:                return MAX_DATA_CODEWORDS + 2;
0779:            }
0780:
0781:            /** Paints the barcode. If no exception was thrown a valid barcode is available. */
0782:            public void paintCode() {
0783:                int maxErr, lenErr, tot, pad;
0784:                if ((options & PDF417_USE_RAW_CODEWORDS) != 0) {
0785:                    if (lenCodewords > MAX_DATA_CODEWORDS || lenCodewords < 1
0786:                            || lenCodewords != codewords[0]) {
0787:                        throw new IllegalArgumentException(
0788:                                "Invalid codeword size.");
0789:                    }
0790:                } else {
0791:                    if (text == null)
0792:                        throw new NullPointerException("Text cannot be null.");
0793:                    if (text.length > ABSOLUTE_MAX_TEXT_SIZE) {
0794:                        throw new IndexOutOfBoundsException(
0795:                                "The text is too big.");
0796:                    }
0797:                    segmentList = new SegmentList();
0798:                    breakString();
0799:                    //dumpList();
0800:                    assemble();
0801:                    segmentList = null;
0802:                    codewords[0] = lenCodewords = cwPtr;
0803:                }
0804:                maxErr = maxPossibleErrorLevel(MAX_DATA_CODEWORDS + 2
0805:                        - lenCodewords);
0806:                if ((options & PDF417_USE_ERROR_LEVEL) == 0) {
0807:                    if (lenCodewords < 41)
0808:                        errorLevel = 2;
0809:                    else if (lenCodewords < 161)
0810:                        errorLevel = 3;
0811:                    else if (lenCodewords < 321)
0812:                        errorLevel = 4;
0813:                    else
0814:                        errorLevel = 5;
0815:                }
0816:                if (errorLevel < 0)
0817:                    errorLevel = 0;
0818:                else if (errorLevel > maxErr)
0819:                    errorLevel = maxErr;
0820:                if (codeColumns < 1)
0821:                    codeColumns = 1;
0822:                else if (codeColumns > 30)
0823:                    codeColumns = 30;
0824:                if (codeRows < 3)
0825:                    codeRows = 3;
0826:                else if (codeRows > 90)
0827:                    codeRows = 90;
0828:                lenErr = 2 << errorLevel;
0829:                boolean fixedColumn = (options & PDF417_FIXED_ROWS) == 0;
0830:                boolean skipRowColAdjust = false;
0831:                tot = lenCodewords + lenErr;
0832:                if ((options & PDF417_FIXED_RECTANGLE) != 0) {
0833:                    tot = codeColumns * codeRows;
0834:                    if (tot > MAX_DATA_CODEWORDS + 2) {
0835:                        tot = getMaxSquare();
0836:                    }
0837:                    if (tot < lenCodewords + lenErr)
0838:                        tot = lenCodewords + lenErr;
0839:                    else
0840:                        skipRowColAdjust = true;
0841:                } else if ((options & (PDF417_FIXED_COLUMNS | PDF417_FIXED_ROWS)) == 0) {
0842:                    double c, b;
0843:                    fixedColumn = true;
0844:                    if (aspectRatio < 0.001)
0845:                        aspectRatio = 0.001f;
0846:                    else if (aspectRatio > 1000)
0847:                        aspectRatio = 1000;
0848:                    b = 73 * aspectRatio - 4;
0849:                    c = (-b + Math.sqrt(b * b + 4 * 17 * aspectRatio
0850:                            * (lenCodewords + lenErr) * yHeight))
0851:                            / (2 * 17 * aspectRatio);
0852:                    codeColumns = (int) (c + 0.5);
0853:                    if (codeColumns < 1)
0854:                        codeColumns = 1;
0855:                    else if (codeColumns > 30)
0856:                        codeColumns = 30;
0857:                }
0858:                if (!skipRowColAdjust) {
0859:                    if (fixedColumn) {
0860:                        codeRows = (tot - 1) / codeColumns + 1;
0861:                        if (codeRows < 3)
0862:                            codeRows = 3;
0863:                        else if (codeRows > 90) {
0864:                            codeRows = 90;
0865:                            codeColumns = (tot - 1) / 90 + 1;
0866:                        }
0867:                    } else {
0868:                        codeColumns = (tot - 1) / codeRows + 1;
0869:                        if (codeColumns > 30) {
0870:                            codeColumns = 30;
0871:                            codeRows = (tot - 1) / 30 + 1;
0872:                        }
0873:                    }
0874:                    tot = codeRows * codeColumns;
0875:                }
0876:                if (tot > MAX_DATA_CODEWORDS + 2) {
0877:                    tot = getMaxSquare();
0878:                }
0879:                errorLevel = maxPossibleErrorLevel(tot - lenCodewords);
0880:                lenErr = 2 << errorLevel;
0881:                pad = tot - lenErr - lenCodewords;
0882:                cwPtr = lenCodewords;
0883:                while (pad-- != 0)
0884:                    codewords[cwPtr++] = TEXT_MODE;
0885:                codewords[0] = lenCodewords = cwPtr;
0886:                calculateErrorCorrection(lenCodewords);
0887:                lenCodewords = tot;
0888:                outPaintCode();
0889:            }
0890:
0891:            /** Gets an <CODE>Image</CODE> with the barcode. The image will have to be
0892:             * scaled in the Y direction by <CODE>yHeight</CODE>for the barcode
0893:             * to have the right printing aspect.
0894:             * @return the barcode <CODE>Image</CODE>
0895:             * @throws BadElementException on error
0896:             */
0897:            public Image getImage() throws BadElementException {
0898:                paintCode();
0899:                byte g4[] = CCITTG4Encoder.compress(outBits, bitColumns,
0900:                        codeRows);
0901:                return Image.getInstance(bitColumns, codeRows, false,
0902:                        Image.CCITTG4,
0903:                        (options & PDF417_INVERT_BITMAP) == 0 ? 0
0904:                                : Image.CCITT_BLACKIS1, g4, null);
0905:            }
0906:
0907:            /** Creates a <CODE>java.awt.Image</CODE>.
0908:             * @param foreground the color of the bars
0909:             * @param background the color of the background
0910:             * @return the image
0911:             */
0912:            public java.awt.Image createAwtImage(Color foreground,
0913:                    Color background) {
0914:                int f = foreground.getRGB();
0915:                int g = background.getRGB();
0916:                Canvas canvas = new Canvas();
0917:
0918:                paintCode();
0919:                int h = (int) yHeight;
0920:                int pix[] = new int[bitColumns * codeRows * h];
0921:                int stride = (bitColumns + 7) / 8;
0922:                int ptr = 0;
0923:                for (int k = 0; k < codeRows; ++k) {
0924:                    int p = k * stride;
0925:                    for (int j = 0; j < bitColumns; ++j) {
0926:                        int b = outBits[p + (j / 8)] & 0xff;
0927:                        b <<= j % 8;
0928:                        pix[ptr++] = (b & 0x80) == 0 ? g : f;
0929:                    }
0930:                    for (int j = 1; j < h; ++j) {
0931:                        System.arraycopy(pix, ptr - bitColumns, pix, ptr
0932:                                + bitColumns * (j - 1), bitColumns);
0933:                    }
0934:                    ptr += bitColumns * (h - 1);
0935:                }
0936:
0937:                java.awt.Image img = canvas.createImage(new MemoryImageSource(
0938:                        bitColumns, codeRows * h, pix, 0, bitColumns));
0939:                return img;
0940:            }
0941:
0942:            /** Gets the raw image bits of the barcode. The image will have to
0943:             * be scaled in the Y direction by <CODE>yHeight</CODE>.
0944:             * @return The raw barcode image
0945:             */
0946:            public byte[] getOutBits() {
0947:                return this .outBits;
0948:            }
0949:
0950:            /** Gets the number of X pixels of <CODE>outBits</CODE>.
0951:             * @return the number of X pixels of <CODE>outBits</CODE>
0952:             */
0953:            public int getBitColumns() {
0954:                return this .bitColumns;
0955:            }
0956:
0957:            /** Gets the number of Y pixels of <CODE>outBits</CODE>.
0958:             * It is also the number of rows in the barcode.
0959:             * @return the number of Y pixels of <CODE>outBits</CODE>
0960:             */
0961:            public int getCodeRows() {
0962:                return this .codeRows;
0963:            }
0964:
0965:            /** Sets the number of barcode rows. This number may be changed
0966:             * to keep the barcode valid.
0967:             * @param codeRows the number of barcode rows
0968:             */
0969:            public void setCodeRows(int codeRows) {
0970:                this .codeRows = codeRows;
0971:            }
0972:
0973:            /** Gets the number of barcode data columns.
0974:             * @return he number of barcode data columns
0975:             */
0976:            public int getCodeColumns() {
0977:                return this .codeColumns;
0978:            }
0979:
0980:            /** Sets the number of barcode data columns.
0981:             * This number may be changed to keep the barcode valid.
0982:             * @param codeColumns the number of barcode data columns
0983:             */
0984:            public void setCodeColumns(int codeColumns) {
0985:                this .codeColumns = codeColumns;
0986:            }
0987:
0988:            /** Gets the codeword array. This array is always 928 elements long.
0989:             * It can be writen to if the option <CODE>PDF417_USE_RAW_CODEWORDS</CODE>
0990:             * is set.
0991:             * @return the codeword array
0992:             */
0993:            public int[] getCodewords() {
0994:                return this .codewords;
0995:            }
0996:
0997:            /** Gets the length of the codewords.
0998:             * @return the length of the codewords
0999:             */
1000:            public int getLenCodewords() {
1001:                return this .lenCodewords;
1002:            }
1003:
1004:            /** Sets the length of the codewords.
1005:             * @param lenCodewords the length of the codewords
1006:             */
1007:            public void setLenCodewords(int lenCodewords) {
1008:                this .lenCodewords = lenCodewords;
1009:            }
1010:
1011:            /** Gets the error level correction used for the barcode. It may different
1012:             * from the previously set value.
1013:             * @return the error level correction used for the barcode
1014:             */
1015:            public int getErrorLevel() {
1016:                return this .errorLevel;
1017:            }
1018:
1019:            /** Sets the error level correction for the barcode.
1020:             * @param errorLevel the error level correction for the barcode
1021:             */
1022:            public void setErrorLevel(int errorLevel) {
1023:                this .errorLevel = errorLevel;
1024:            }
1025:
1026:            /** Gets the bytes that form the barcode. This bytes should
1027:             * be interpreted in the codepage Cp437.
1028:             * @return the bytes that form the barcode
1029:             */
1030:            public byte[] getText() {
1031:                return this .text;
1032:            }
1033:
1034:            /** Sets the bytes that form the barcode. This bytes should
1035:             * be interpreted in the codepage Cp437.
1036:             * @param text the bytes that form the barcode
1037:             */
1038:            public void setText(byte[] text) {
1039:                this .text = text;
1040:            }
1041:
1042:            /** Sets the text that will form the barcode. This text is converted
1043:             * to bytes using the encoding Cp437.
1044:             * @param s the text that will form the barcode
1045:             */
1046:            public void setText(String s) {
1047:                this .text = PdfEncodings.convertToBytes(s, "cp437");
1048:            }
1049:
1050:            /** Gets the options to generate the barcode.
1051:             * @return the options to generate the barcode
1052:             */
1053:            public int getOptions() {
1054:                return this .options;
1055:            }
1056:
1057:            /** Sets the options to generate the barcode. This can be all
1058:             * the <CODE>PDF417_*</CODE> constants.
1059:             * @param options the options to generate the barcode
1060:             */
1061:            public void setOptions(int options) {
1062:                this .options = options;
1063:            }
1064:
1065:            /** Gets the barcode aspect ratio.
1066:             * @return the barcode aspect ratio
1067:             */
1068:            public float getAspectRatio() {
1069:                return this .aspectRatio;
1070:            }
1071:
1072:            /** Sets the barcode aspect ratio. A ratio or 0.5 will make the
1073:             * barcode width twice as large as the height.
1074:             * @param aspectRatio the barcode aspect ratio
1075:             */
1076:            public void setAspectRatio(float aspectRatio) {
1077:                this .aspectRatio = aspectRatio;
1078:            }
1079:
1080:            /** Gets the Y pixel height relative to X.
1081:             * @return the Y pixel height relative to X
1082:             */
1083:            public float getYHeight() {
1084:                return this .yHeight;
1085:            }
1086:
1087:            /** Sets the Y pixel height relative to X. It is usually 3.
1088:             * @param yHeight the Y pixel height relative to X
1089:             */
1090:            public void setYHeight(float yHeight) {
1091:                this .yHeight = yHeight;
1092:            }
1093:
1094:            protected static final int START_PATTERN = 0x1fea8;
1095:            protected static final int STOP_PATTERN = 0x3fa29;
1096:            protected static final int START_CODE_SIZE = 17;
1097:            protected static final int STOP_SIZE = 18;
1098:            protected static final int MOD = 929;
1099:            protected static final int ALPHA = 0x10000;
1100:            protected static final int LOWER = 0x20000;
1101:            protected static final int MIXED = 0x40000;
1102:            protected static final int PUNCTUATION = 0x80000;
1103:            protected static final int ISBYTE = 0x100000;
1104:            protected static final int BYTESHIFT = 913;
1105:            protected static final int PL = 25;
1106:            protected static final int LL = 27;
1107:            protected static final int AS = 27;
1108:            protected static final int ML = 28;
1109:            protected static final int AL = 28;
1110:            protected static final int PS = 29;
1111:            protected static final int PAL = 29;
1112:            protected static final int SPACE = 26;
1113:            protected static final int TEXT_MODE = 900;
1114:            protected static final int BYTE_MODE_6 = 924;
1115:            protected static final int BYTE_MODE = 901;
1116:            protected static final int NUMERIC_MODE = 902;
1117:            protected static final int ABSOLUTE_MAX_TEXT_SIZE = 5420;
1118:            protected static final int MAX_DATA_CODEWORDS = 926;
1119:            protected static final int MACRO_SEGMENT_ID = 928;
1120:            protected static final int MACRO_SEGMENT_COUNT = 923;
1121:            protected static final int MACRO_LAST_SEGMENT = 922;
1122:
1123:            private static final String MIXED_SET = "0123456789&\r\t,:#-.$/+%*=^";
1124:            private static final String PUNCTUATION_SET = ";<>@[\\]_`~!\r\t,:\n-.$/\"|*()?{}'";
1125:
1126:            private static final int CLUSTERS[][] = {
1127:                    { 0x1d5c0, 0x1eaf0, 0x1f57c, 0x1d4e0, 0x1ea78, 0x1f53e,
1128:                            0x1a8c0, 0x1d470, 0x1a860, 0x15040, 0x1a830,
1129:                            0x15020, 0x1adc0, 0x1d6f0, 0x1eb7c, 0x1ace0,
1130:                            0x1d678, 0x1eb3e, 0x158c0, 0x1ac70, 0x15860,
1131:                            0x15dc0, 0x1aef0, 0x1d77c, 0x15ce0, 0x1ae78,
1132:                            0x1d73e, 0x15c70, 0x1ae3c, 0x15ef0, 0x1af7c,
1133:                            0x15e78, 0x1af3e, 0x15f7c, 0x1f5fa, 0x1d2e0,
1134:                            0x1e978, 0x1f4be, 0x1a4c0, 0x1d270, 0x1e93c,
1135:                            0x1a460, 0x1d238, 0x14840, 0x1a430, 0x1d21c,
1136:                            0x14820, 0x1a418, 0x14810, 0x1a6e0, 0x1d378,
1137:                            0x1e9be, 0x14cc0, 0x1a670, 0x1d33c, 0x14c60,
1138:                            0x1a638, 0x1d31e, 0x14c30, 0x1a61c, 0x14ee0,
1139:                            0x1a778, 0x1d3be, 0x14e70, 0x1a73c, 0x14e38,
1140:                            0x1a71e, 0x14f78, 0x1a7be, 0x14f3c, 0x14f1e,
1141:                            0x1a2c0, 0x1d170, 0x1e8bc, 0x1a260, 0x1d138,
1142:                            0x1e89e, 0x14440, 0x1a230, 0x1d11c, 0x14420,
1143:                            0x1a218, 0x14410, 0x14408, 0x146c0, 0x1a370,
1144:                            0x1d1bc, 0x14660, 0x1a338, 0x1d19e, 0x14630,
1145:                            0x1a31c, 0x14618, 0x1460c, 0x14770, 0x1a3bc,
1146:                            0x14738, 0x1a39e, 0x1471c, 0x147bc, 0x1a160,
1147:                            0x1d0b8, 0x1e85e, 0x14240, 0x1a130, 0x1d09c,
1148:                            0x14220, 0x1a118, 0x1d08e, 0x14210, 0x1a10c,
1149:                            0x14208, 0x1a106, 0x14360, 0x1a1b8, 0x1d0de,
1150:                            0x14330, 0x1a19c, 0x14318, 0x1a18e, 0x1430c,
1151:                            0x14306, 0x1a1de, 0x1438e, 0x14140, 0x1a0b0,
1152:                            0x1d05c, 0x14120, 0x1a098, 0x1d04e, 0x14110,
1153:                            0x1a08c, 0x14108, 0x1a086, 0x14104, 0x141b0,
1154:                            0x14198, 0x1418c, 0x140a0, 0x1d02e, 0x1a04c,
1155:                            0x1a046, 0x14082, 0x1cae0, 0x1e578, 0x1f2be,
1156:                            0x194c0, 0x1ca70, 0x1e53c, 0x19460, 0x1ca38,
1157:                            0x1e51e, 0x12840, 0x19430, 0x12820, 0x196e0,
1158:                            0x1cb78, 0x1e5be, 0x12cc0, 0x19670, 0x1cb3c,
1159:                            0x12c60, 0x19638, 0x12c30, 0x12c18, 0x12ee0,
1160:                            0x19778, 0x1cbbe, 0x12e70, 0x1973c, 0x12e38,
1161:                            0x12e1c, 0x12f78, 0x197be, 0x12f3c, 0x12fbe,
1162:                            0x1dac0, 0x1ed70, 0x1f6bc, 0x1da60, 0x1ed38,
1163:                            0x1f69e, 0x1b440, 0x1da30, 0x1ed1c, 0x1b420,
1164:                            0x1da18, 0x1ed0e, 0x1b410, 0x1da0c, 0x192c0,
1165:                            0x1c970, 0x1e4bc, 0x1b6c0, 0x19260, 0x1c938,
1166:                            0x1e49e, 0x1b660, 0x1db38, 0x1ed9e, 0x16c40,
1167:                            0x12420, 0x19218, 0x1c90e, 0x16c20, 0x1b618,
1168:                            0x16c10, 0x126c0, 0x19370, 0x1c9bc, 0x16ec0,
1169:                            0x12660, 0x19338, 0x1c99e, 0x16e60, 0x1b738,
1170:                            0x1db9e, 0x16e30, 0x12618, 0x16e18, 0x12770,
1171:                            0x193bc, 0x16f70, 0x12738, 0x1939e, 0x16f38,
1172:                            0x1b79e, 0x16f1c, 0x127bc, 0x16fbc, 0x1279e,
1173:                            0x16f9e, 0x1d960, 0x1ecb8, 0x1f65e, 0x1b240,
1174:                            0x1d930, 0x1ec9c, 0x1b220, 0x1d918, 0x1ec8e,
1175:                            0x1b210, 0x1d90c, 0x1b208, 0x1b204, 0x19160,
1176:                            0x1c8b8, 0x1e45e, 0x1b360, 0x19130, 0x1c89c,
1177:                            0x16640, 0x12220, 0x1d99c, 0x1c88e, 0x16620,
1178:                            0x12210, 0x1910c, 0x16610, 0x1b30c, 0x19106,
1179:                            0x12204, 0x12360, 0x191b8, 0x1c8de, 0x16760,
1180:                            0x12330, 0x1919c, 0x16730, 0x1b39c, 0x1918e,
1181:                            0x16718, 0x1230c, 0x12306, 0x123b8, 0x191de,
1182:                            0x167b8, 0x1239c, 0x1679c, 0x1238e, 0x1678e,
1183:                            0x167de, 0x1b140, 0x1d8b0, 0x1ec5c, 0x1b120,
1184:                            0x1d898, 0x1ec4e, 0x1b110, 0x1d88c, 0x1b108,
1185:                            0x1d886, 0x1b104, 0x1b102, 0x12140, 0x190b0,
1186:                            0x1c85c, 0x16340, 0x12120, 0x19098, 0x1c84e,
1187:                            0x16320, 0x1b198, 0x1d8ce, 0x16310, 0x12108,
1188:                            0x19086, 0x16308, 0x1b186, 0x16304, 0x121b0,
1189:                            0x190dc, 0x163b0, 0x12198, 0x190ce, 0x16398,
1190:                            0x1b1ce, 0x1638c, 0x12186, 0x16386, 0x163dc,
1191:                            0x163ce, 0x1b0a0, 0x1d858, 0x1ec2e, 0x1b090,
1192:                            0x1d84c, 0x1b088, 0x1d846, 0x1b084, 0x1b082,
1193:                            0x120a0, 0x19058, 0x1c82e, 0x161a0, 0x12090,
1194:                            0x1904c, 0x16190, 0x1b0cc, 0x19046, 0x16188,
1195:                            0x12084, 0x16184, 0x12082, 0x120d8, 0x161d8,
1196:                            0x161cc, 0x161c6, 0x1d82c, 0x1d826, 0x1b042,
1197:                            0x1902c, 0x12048, 0x160c8, 0x160c4, 0x160c2,
1198:                            0x18ac0, 0x1c570, 0x1e2bc, 0x18a60, 0x1c538,
1199:                            0x11440, 0x18a30, 0x1c51c, 0x11420, 0x18a18,
1200:                            0x11410, 0x11408, 0x116c0, 0x18b70, 0x1c5bc,
1201:                            0x11660, 0x18b38, 0x1c59e, 0x11630, 0x18b1c,
1202:                            0x11618, 0x1160c, 0x11770, 0x18bbc, 0x11738,
1203:                            0x18b9e, 0x1171c, 0x117bc, 0x1179e, 0x1cd60,
1204:                            0x1e6b8, 0x1f35e, 0x19a40, 0x1cd30, 0x1e69c,
1205:                            0x19a20, 0x1cd18, 0x1e68e, 0x19a10, 0x1cd0c,
1206:                            0x19a08, 0x1cd06, 0x18960, 0x1c4b8, 0x1e25e,
1207:                            0x19b60, 0x18930, 0x1c49c, 0x13640, 0x11220,
1208:                            0x1cd9c, 0x1c48e, 0x13620, 0x19b18, 0x1890c,
1209:                            0x13610, 0x11208, 0x13608, 0x11360, 0x189b8,
1210:                            0x1c4de, 0x13760, 0x11330, 0x1cdde, 0x13730,
1211:                            0x19b9c, 0x1898e, 0x13718, 0x1130c, 0x1370c,
1212:                            0x113b8, 0x189de, 0x137b8, 0x1139c, 0x1379c,
1213:                            0x1138e, 0x113de, 0x137de, 0x1dd40, 0x1eeb0,
1214:                            0x1f75c, 0x1dd20, 0x1ee98, 0x1f74e, 0x1dd10,
1215:                            0x1ee8c, 0x1dd08, 0x1ee86, 0x1dd04, 0x19940,
1216:                            0x1ccb0, 0x1e65c, 0x1bb40, 0x19920, 0x1eedc,
1217:                            0x1e64e, 0x1bb20, 0x1dd98, 0x1eece, 0x1bb10,
1218:                            0x19908, 0x1cc86, 0x1bb08, 0x1dd86, 0x19902,
1219:                            0x11140, 0x188b0, 0x1c45c, 0x13340, 0x11120,
1220:                            0x18898, 0x1c44e, 0x17740, 0x13320, 0x19998,
1221:                            0x1ccce, 0x17720, 0x1bb98, 0x1ddce, 0x18886,
1222:                            0x17710, 0x13308, 0x19986, 0x17708, 0x11102,
1223:                            0x111b0, 0x188dc, 0x133b0, 0x11198, 0x188ce,
1224:                            0x177b0, 0x13398, 0x199ce, 0x17798, 0x1bbce,
1225:                            0x11186, 0x13386, 0x111dc, 0x133dc, 0x111ce,
1226:                            0x177dc, 0x133ce, 0x1dca0, 0x1ee58, 0x1f72e,
1227:                            0x1dc90, 0x1ee4c, 0x1dc88, 0x1ee46, 0x1dc84,
1228:                            0x1dc82, 0x198a0, 0x1cc58, 0x1e62e, 0x1b9a0,
1229:                            0x19890, 0x1ee6e, 0x1b990, 0x1dccc, 0x1cc46,
1230:                            0x1b988, 0x19884, 0x1b984, 0x19882, 0x1b982,
1231:                            0x110a0, 0x18858, 0x1c42e, 0x131a0, 0x11090,
1232:                            0x1884c, 0x173a0, 0x13190, 0x198cc, 0x18846,
1233:                            0x17390, 0x1b9cc, 0x11084, 0x17388, 0x13184,
1234:                            0x11082, 0x13182, 0x110d8, 0x1886e, 0x131d8,
1235:                            0x110cc, 0x173d8, 0x131cc, 0x110c6, 0x173cc,
1236:                            0x131c6, 0x110ee, 0x173ee, 0x1dc50, 0x1ee2c,
1237:                            0x1dc48, 0x1ee26, 0x1dc44, 0x1dc42, 0x19850,
1238:                            0x1cc2c, 0x1b8d0, 0x19848, 0x1cc26, 0x1b8c8,
1239:                            0x1dc66, 0x1b8c4, 0x19842, 0x1b8c2, 0x11050,
1240:                            0x1882c, 0x130d0, 0x11048, 0x18826, 0x171d0,
1241:                            0x130c8, 0x19866, 0x171c8, 0x1b8e6, 0x11042,
1242:                            0x171c4, 0x130c2, 0x171c2, 0x130ec, 0x171ec,
1243:                            0x171e6, 0x1ee16, 0x1dc22, 0x1cc16, 0x19824,
1244:                            0x19822, 0x11028, 0x13068, 0x170e8, 0x11022,
1245:                            0x13062, 0x18560, 0x10a40, 0x18530, 0x10a20,
1246:                            0x18518, 0x1c28e, 0x10a10, 0x1850c, 0x10a08,
1247:                            0x18506, 0x10b60, 0x185b8, 0x1c2de, 0x10b30,
1248:                            0x1859c, 0x10b18, 0x1858e, 0x10b0c, 0x10b06,
1249:                            0x10bb8, 0x185de, 0x10b9c, 0x10b8e, 0x10bde,
1250:                            0x18d40, 0x1c6b0, 0x1e35c, 0x18d20, 0x1c698,
1251:                            0x18d10, 0x1c68c, 0x18d08, 0x1c686, 0x18d04,
1252:                            0x10940, 0x184b0, 0x1c25c, 0x11b40, 0x10920,
1253:                            0x1c6dc, 0x1c24e, 0x11b20, 0x18d98, 0x1c6ce,
1254:                            0x11b10, 0x10908, 0x18486, 0x11b08, 0x18d86,
1255:                            0x10902, 0x109b0, 0x184dc, 0x11bb0, 0x10998,
1256:                            0x184ce, 0x11b98, 0x18dce, 0x11b8c, 0x10986,
1257:                            0x109dc, 0x11bdc, 0x109ce, 0x11bce, 0x1cea0,
1258:                            0x1e758, 0x1f3ae, 0x1ce90, 0x1e74c, 0x1ce88,
1259:                            0x1e746, 0x1ce84, 0x1ce82, 0x18ca0, 0x1c658,
1260:                            0x19da0, 0x18c90, 0x1c64c, 0x19d90, 0x1cecc,
1261:                            0x1c646, 0x19d88, 0x18c84, 0x19d84, 0x18c82,
1262:                            0x19d82, 0x108a0, 0x18458, 0x119a0, 0x10890,
1263:                            0x1c66e, 0x13ba0, 0x11990, 0x18ccc, 0x18446,
1264:                            0x13b90, 0x19dcc, 0x10884, 0x13b88, 0x11984,
1265:                            0x10882, 0x11982, 0x108d8, 0x1846e, 0x119d8,
1266:                            0x108cc, 0x13bd8, 0x119cc, 0x108c6, 0x13bcc,
1267:                            0x119c6, 0x108ee, 0x119ee, 0x13bee, 0x1ef50,
1268:                            0x1f7ac, 0x1ef48, 0x1f7a6, 0x1ef44, 0x1ef42,
1269:                            0x1ce50, 0x1e72c, 0x1ded0, 0x1ef6c, 0x1e726,
1270:                            0x1dec8, 0x1ef66, 0x1dec4, 0x1ce42, 0x1dec2,
1271:                            0x18c50, 0x1c62c, 0x19cd0, 0x18c48, 0x1c626,
1272:                            0x1bdd0, 0x19cc8, 0x1ce66, 0x1bdc8, 0x1dee6,
1273:                            0x18c42, 0x1bdc4, 0x19cc2, 0x1bdc2, 0x10850,
1274:                            0x1842c, 0x118d0, 0x10848, 0x18426, 0x139d0,
1275:                            0x118c8, 0x18c66, 0x17bd0, 0x139c8, 0x19ce6,
1276:                            0x10842, 0x17bc8, 0x1bde6, 0x118c2, 0x17bc4,
1277:                            0x1086c, 0x118ec, 0x10866, 0x139ec, 0x118e6,
1278:                            0x17bec, 0x139e6, 0x17be6, 0x1ef28, 0x1f796,
1279:                            0x1ef24, 0x1ef22, 0x1ce28, 0x1e716, 0x1de68,
1280:                            0x1ef36, 0x1de64, 0x1ce22, 0x1de62, 0x18c28,
1281:                            0x1c616, 0x19c68, 0x18c24, 0x1bce8, 0x19c64,
1282:                            0x18c22, 0x1bce4, 0x19c62, 0x1bce2, 0x10828,
1283:                            0x18416, 0x11868, 0x18c36, 0x138e8, 0x11864,
1284:                            0x10822, 0x179e8, 0x138e4, 0x11862, 0x179e4,
1285:                            0x138e2, 0x179e2, 0x11876, 0x179f6, 0x1ef12,
1286:                            0x1de34, 0x1de32, 0x19c34, 0x1bc74, 0x1bc72,
1287:                            0x11834, 0x13874, 0x178f4, 0x178f2, 0x10540,
1288:                            0x10520, 0x18298, 0x10510, 0x10508, 0x10504,
1289:                            0x105b0, 0x10598, 0x1058c, 0x10586, 0x105dc,
1290:                            0x105ce, 0x186a0, 0x18690, 0x1c34c, 0x18688,
1291:                            0x1c346, 0x18684, 0x18682, 0x104a0, 0x18258,
1292:                            0x10da0, 0x186d8, 0x1824c, 0x10d90, 0x186cc,
1293:                            0x10d88, 0x186c6, 0x10d84, 0x10482, 0x10d82,
1294:                            0x104d8, 0x1826e, 0x10dd8, 0x186ee, 0x10dcc,
1295:                            0x104c6, 0x10dc6, 0x104ee, 0x10dee, 0x1c750,
1296:                            0x1c748, 0x1c744, 0x1c742, 0x18650, 0x18ed0,
1297:                            0x1c76c, 0x1c326, 0x18ec8, 0x1c766, 0x18ec4,
1298:                            0x18642, 0x18ec2, 0x10450, 0x10cd0, 0x10448,
1299:                            0x18226, 0x11dd0, 0x10cc8, 0x10444, 0x11dc8,
1300:                            0x10cc4, 0x10442, 0x11dc4, 0x10cc2, 0x1046c,
1301:                            0x10cec, 0x10466, 0x11dec, 0x10ce6, 0x11de6,
1302:                            0x1e7a8, 0x1e7a4, 0x1e7a2, 0x1c728, 0x1cf68,
1303:                            0x1e7b6, 0x1cf64, 0x1c722, 0x1cf62, 0x18628,
1304:                            0x1c316, 0x18e68, 0x1c736, 0x19ee8, 0x18e64,
1305:                            0x18622, 0x19ee4, 0x18e62, 0x19ee2, 0x10428,
1306:                            0x18216, 0x10c68, 0x18636, 0x11ce8, 0x10c64,
1307:                            0x10422, 0x13de8, 0x11ce4, 0x10c62, 0x13de4,
1308:                            0x11ce2, 0x10436, 0x10c76, 0x11cf6, 0x13df6,
1309:                            0x1f7d4, 0x1f7d2, 0x1e794, 0x1efb4, 0x1e792,
1310:                            0x1efb2, 0x1c714, 0x1cf34, 0x1c712, 0x1df74,
1311:                            0x1cf32, 0x1df72, 0x18614, 0x18e34, 0x18612,
1312:                            0x19e74, 0x18e32, 0x1bef4 },
1313:                    { 0x1f560, 0x1fab8, 0x1ea40, 0x1f530, 0x1fa9c, 0x1ea20,
1314:                            0x1f518, 0x1fa8e, 0x1ea10, 0x1f50c, 0x1ea08,
1315:                            0x1f506, 0x1ea04, 0x1eb60, 0x1f5b8, 0x1fade,
1316:                            0x1d640, 0x1eb30, 0x1f59c, 0x1d620, 0x1eb18,
1317:                            0x1f58e, 0x1d610, 0x1eb0c, 0x1d608, 0x1eb06,
1318:                            0x1d604, 0x1d760, 0x1ebb8, 0x1f5de, 0x1ae40,
1319:                            0x1d730, 0x1eb9c, 0x1ae20, 0x1d718, 0x1eb8e,
1320:                            0x1ae10, 0x1d70c, 0x1ae08, 0x1d706, 0x1ae04,
1321:                            0x1af60, 0x1d7b8, 0x1ebde, 0x15e40, 0x1af30,
1322:                            0x1d79c, 0x15e20, 0x1af18, 0x1d78e, 0x15e10,
1323:                            0x1af0c, 0x15e08, 0x1af06, 0x15f60, 0x1afb8,
1324:                            0x1d7de, 0x15f30, 0x1af9c, 0x15f18, 0x1af8e,
1325:                            0x15f0c, 0x15fb8, 0x1afde, 0x15f9c, 0x15f8e,
1326:                            0x1e940, 0x1f4b0, 0x1fa5c, 0x1e920, 0x1f498,
1327:                            0x1fa4e, 0x1e910, 0x1f48c, 0x1e908, 0x1f486,
1328:                            0x1e904, 0x1e902, 0x1d340, 0x1e9b0, 0x1f4dc,
1329:                            0x1d320, 0x1e998, 0x1f4ce, 0x1d310, 0x1e98c,
1330:                            0x1d308, 0x1e986, 0x1d304, 0x1d302, 0x1a740,
1331:                            0x1d3b0, 0x1e9dc, 0x1a720, 0x1d398, 0x1e9ce,
1332:                            0x1a710, 0x1d38c, 0x1a708, 0x1d386, 0x1a704,
1333:                            0x1a702, 0x14f40, 0x1a7b0, 0x1d3dc, 0x14f20,
1334:                            0x1a798, 0x1d3ce, 0x14f10, 0x1a78c, 0x14f08,
1335:                            0x1a786, 0x14f04, 0x14fb0, 0x1a7dc, 0x14f98,
1336:                            0x1a7ce, 0x14f8c, 0x14f86, 0x14fdc, 0x14fce,
1337:                            0x1e8a0, 0x1f458, 0x1fa2e, 0x1e890, 0x1f44c,
1338:                            0x1e888, 0x1f446, 0x1e884, 0x1e882, 0x1d1a0,
1339:                            0x1e8d8, 0x1f46e, 0x1d190, 0x1e8cc, 0x1d188,
1340:                            0x1e8c6, 0x1d184, 0x1d182, 0x1a3a0, 0x1d1d8,
1341:                            0x1e8ee, 0x1a390, 0x1d1cc, 0x1a388, 0x1d1c6,
1342:                            0x1a384, 0x1a382, 0x147a0, 0x1a3d8, 0x1d1ee,
1343:                            0x14790, 0x1a3cc, 0x14788, 0x1a3c6, 0x14784,
1344:                            0x14782, 0x147d8, 0x1a3ee, 0x147cc, 0x147c6,
1345:                            0x147ee, 0x1e850, 0x1f42c, 0x1e848, 0x1f426,
1346:                            0x1e844, 0x1e842, 0x1d0d0, 0x1e86c, 0x1d0c8,
1347:                            0x1e866, 0x1d0c4, 0x1d0c2, 0x1a1d0, 0x1d0ec,
1348:                            0x1a1c8, 0x1d0e6, 0x1a1c4, 0x1a1c2, 0x143d0,
1349:                            0x1a1ec, 0x143c8, 0x1a1e6, 0x143c4, 0x143c2,
1350:                            0x143ec, 0x143e6, 0x1e828, 0x1f416, 0x1e824,
1351:                            0x1e822, 0x1d068, 0x1e836, 0x1d064, 0x1d062,
1352:                            0x1a0e8, 0x1d076, 0x1a0e4, 0x1a0e2, 0x141e8,
1353:                            0x1a0f6, 0x141e4, 0x141e2, 0x1e814, 0x1e812,
1354:                            0x1d034, 0x1d032, 0x1a074, 0x1a072, 0x1e540,
1355:                            0x1f2b0, 0x1f95c, 0x1e520, 0x1f298, 0x1f94e,
1356:                            0x1e510, 0x1f28c, 0x1e508, 0x1f286, 0x1e504,
1357:                            0x1e502, 0x1cb40, 0x1e5b0, 0x1f2dc, 0x1cb20,
1358:                            0x1e598, 0x1f2ce, 0x1cb10, 0x1e58c, 0x1cb08,
1359:                            0x1e586, 0x1cb04, 0x1cb02, 0x19740, 0x1cbb0,
1360:                            0x1e5dc, 0x19720, 0x1cb98, 0x1e5ce, 0x19710,
1361:                            0x1cb8c, 0x19708, 0x1cb86, 0x19704, 0x19702,
1362:                            0x12f40, 0x197b0, 0x1cbdc, 0x12f20, 0x19798,
1363:                            0x1cbce, 0x12f10, 0x1978c, 0x12f08, 0x19786,
1364:                            0x12f04, 0x12fb0, 0x197dc, 0x12f98, 0x197ce,
1365:                            0x12f8c, 0x12f86, 0x12fdc, 0x12fce, 0x1f6a0,
1366:                            0x1fb58, 0x16bf0, 0x1f690, 0x1fb4c, 0x169f8,
1367:                            0x1f688, 0x1fb46, 0x168fc, 0x1f684, 0x1f682,
1368:                            0x1e4a0, 0x1f258, 0x1f92e, 0x1eda0, 0x1e490,
1369:                            0x1fb6e, 0x1ed90, 0x1f6cc, 0x1f246, 0x1ed88,
1370:                            0x1e484, 0x1ed84, 0x1e482, 0x1ed82, 0x1c9a0,
1371:                            0x1e4d8, 0x1f26e, 0x1dba0, 0x1c990, 0x1e4cc,
1372:                            0x1db90, 0x1edcc, 0x1e4c6, 0x1db88, 0x1c984,
1373:                            0x1db84, 0x1c982, 0x1db82, 0x193a0, 0x1c9d8,
1374:                            0x1e4ee, 0x1b7a0, 0x19390, 0x1c9cc, 0x1b790,
1375:                            0x1dbcc, 0x1c9c6, 0x1b788, 0x19384, 0x1b784,
1376:                            0x19382, 0x1b782, 0x127a0, 0x193d8, 0x1c9ee,
1377:                            0x16fa0, 0x12790, 0x193cc, 0x16f90, 0x1b7cc,
1378:                            0x193c6, 0x16f88, 0x12784, 0x16f84, 0x12782,
1379:                            0x127d8, 0x193ee, 0x16fd8, 0x127cc, 0x16fcc,
1380:                            0x127c6, 0x16fc6, 0x127ee, 0x1f650, 0x1fb2c,
1381:                            0x165f8, 0x1f648, 0x1fb26, 0x164fc, 0x1f644,
1382:                            0x1647e, 0x1f642, 0x1e450, 0x1f22c, 0x1ecd0,
1383:                            0x1e448, 0x1f226, 0x1ecc8, 0x1f666, 0x1ecc4,
1384:                            0x1e442, 0x1ecc2, 0x1c8d0, 0x1e46c, 0x1d9d0,
1385:                            0x1c8c8, 0x1e466, 0x1d9c8, 0x1ece6, 0x1d9c4,
1386:                            0x1c8c2, 0x1d9c2, 0x191d0, 0x1c8ec, 0x1b3d0,
1387:                            0x191c8, 0x1c8e6, 0x1b3c8, 0x1d9e6, 0x1b3c4,
1388:                            0x191c2, 0x1b3c2, 0x123d0, 0x191ec, 0x167d0,
1389:                            0x123c8, 0x191e6, 0x167c8, 0x1b3e6, 0x167c4,
1390:                            0x123c2, 0x167c2, 0x123ec, 0x167ec, 0x123e6,
1391:                            0x167e6, 0x1f628, 0x1fb16, 0x162fc, 0x1f624,
1392:                            0x1627e, 0x1f622, 0x1e428, 0x1f216, 0x1ec68,
1393:                            0x1f636, 0x1ec64, 0x1e422, 0x1ec62, 0x1c868,
1394:                            0x1e436, 0x1d8e8, 0x1c864, 0x1d8e4, 0x1c862,
1395:                            0x1d8e2, 0x190e8, 0x1c876, 0x1b1e8, 0x1d8f6,
1396:                            0x1b1e4, 0x190e2, 0x1b1e2, 0x121e8, 0x190f6,
1397:                            0x163e8, 0x121e4, 0x163e4, 0x121e2, 0x163e2,
1398:                            0x121f6, 0x163f6, 0x1f614, 0x1617e, 0x1f612,
1399:                            0x1e414, 0x1ec34, 0x1e412, 0x1ec32, 0x1c834,
1400:                            0x1d874, 0x1c832, 0x1d872, 0x19074, 0x1b0f4,
1401:                            0x19072, 0x1b0f2, 0x120f4, 0x161f4, 0x120f2,
1402:                            0x161f2, 0x1f60a, 0x1e40a, 0x1ec1a, 0x1c81a,
1403:                            0x1d83a, 0x1903a, 0x1b07a, 0x1e2a0, 0x1f158,
1404:                            0x1f8ae, 0x1e290, 0x1f14c, 0x1e288, 0x1f146,
1405:                            0x1e284, 0x1e282, 0x1c5a0, 0x1e2d8, 0x1f16e,
1406:                            0x1c590, 0x1e2cc, 0x1c588, 0x1e2c6, 0x1c584,
1407:                            0x1c582, 0x18ba0, 0x1c5d8, 0x1e2ee, 0x18b90,
1408:                            0x1c5cc, 0x18b88, 0x1c5c6, 0x18b84, 0x18b82,
1409:                            0x117a0, 0x18bd8, 0x1c5ee, 0x11790, 0x18bcc,
1410:                            0x11788, 0x18bc6, 0x11784, 0x11782, 0x117d8,
1411:                            0x18bee, 0x117cc, 0x117c6, 0x117ee, 0x1f350,
1412:                            0x1f9ac, 0x135f8, 0x1f348, 0x1f9a6, 0x134fc,
1413:                            0x1f344, 0x1347e, 0x1f342, 0x1e250, 0x1f12c,
1414:                            0x1e6d0, 0x1e248, 0x1f126, 0x1e6c8, 0x1f366,
1415:                            0x1e6c4, 0x1e242, 0x1e6c2, 0x1c4d0, 0x1e26c,
1416:                            0x1cdd0, 0x1c4c8, 0x1e266, 0x1cdc8, 0x1e6e6,
1417:                            0x1cdc4, 0x1c4c2, 0x1cdc2, 0x189d0, 0x1c4ec,
1418:                            0x19bd0, 0x189c8, 0x1c4e6, 0x19bc8, 0x1cde6,
1419:                            0x19bc4, 0x189c2, 0x19bc2, 0x113d0, 0x189ec,
1420:                            0x137d0, 0x113c8, 0x189e6, 0x137c8, 0x19be6,
1421:                            0x137c4, 0x113c2, 0x137c2, 0x113ec, 0x137ec,
1422:                            0x113e6, 0x137e6, 0x1fba8, 0x175f0, 0x1bafc,
1423:                            0x1fba4, 0x174f8, 0x1ba7e, 0x1fba2, 0x1747c,
1424:                            0x1743e, 0x1f328, 0x1f996, 0x132fc, 0x1f768,
1425:                            0x1fbb6, 0x176fc, 0x1327e, 0x1f764, 0x1f322,
1426:                            0x1767e, 0x1f762, 0x1e228, 0x1f116, 0x1e668,
1427:                            0x1e224, 0x1eee8, 0x1f776, 0x1e222, 0x1eee4,
1428:                            0x1e662, 0x1eee2, 0x1c468, 0x1e236, 0x1cce8,
1429:                            0x1c464, 0x1dde8, 0x1cce4, 0x1c462, 0x1dde4,
1430:                            0x1cce2, 0x1dde2, 0x188e8, 0x1c476, 0x199e8,
1431:                            0x188e4, 0x1bbe8, 0x199e4, 0x188e2, 0x1bbe4,
1432:                            0x199e2, 0x1bbe2, 0x111e8, 0x188f6, 0x133e8,
1433:                            0x111e4, 0x177e8, 0x133e4, 0x111e2, 0x177e4,
1434:                            0x133e2, 0x177e2, 0x111f6, 0x133f6, 0x1fb94,
1435:                            0x172f8, 0x1b97e, 0x1fb92, 0x1727c, 0x1723e,
1436:                            0x1f314, 0x1317e, 0x1f734, 0x1f312, 0x1737e,
1437:                            0x1f732, 0x1e214, 0x1e634, 0x1e212, 0x1ee74,
1438:                            0x1e632, 0x1ee72, 0x1c434, 0x1cc74, 0x1c432,
1439:                            0x1dcf4, 0x1cc72, 0x1dcf2, 0x18874, 0x198f4,
1440:                            0x18872, 0x1b9f4, 0x198f2, 0x1b9f2, 0x110f4,
1441:                            0x131f4, 0x110f2, 0x173f4, 0x131f2, 0x173f2,
1442:                            0x1fb8a, 0x1717c, 0x1713e, 0x1f30a, 0x1f71a,
1443:                            0x1e20a, 0x1e61a, 0x1ee3a, 0x1c41a, 0x1cc3a,
1444:                            0x1dc7a, 0x1883a, 0x1987a, 0x1b8fa, 0x1107a,
1445:                            0x130fa, 0x171fa, 0x170be, 0x1e150, 0x1f0ac,
1446:                            0x1e148, 0x1f0a6, 0x1e144, 0x1e142, 0x1c2d0,
1447:                            0x1e16c, 0x1c2c8, 0x1e166, 0x1c2c4, 0x1c2c2,
1448:                            0x185d0, 0x1c2ec, 0x185c8, 0x1c2e6, 0x185c4,
1449:                            0x185c2, 0x10bd0, 0x185ec, 0x10bc8, 0x185e6,
1450:                            0x10bc4, 0x10bc2, 0x10bec, 0x10be6, 0x1f1a8,
1451:                            0x1f8d6, 0x11afc, 0x1f1a4, 0x11a7e, 0x1f1a2,
1452:                            0x1e128, 0x1f096, 0x1e368, 0x1e124, 0x1e364,
1453:                            0x1e122, 0x1e362, 0x1c268, 0x1e136, 0x1c6e8,
1454:                            0x1c264, 0x1c6e4, 0x1c262, 0x1c6e2, 0x184e8,
1455:                            0x1c276, 0x18de8, 0x184e4, 0x18de4, 0x184e2,
1456:                            0x18de2, 0x109e8, 0x184f6, 0x11be8, 0x109e4,
1457:                            0x11be4, 0x109e2, 0x11be2, 0x109f6, 0x11bf6,
1458:                            0x1f9d4, 0x13af8, 0x19d7e, 0x1f9d2, 0x13a7c,
1459:                            0x13a3e, 0x1f194, 0x1197e, 0x1f3b4, 0x1f192,
1460:                            0x13b7e, 0x1f3b2, 0x1e114, 0x1e334, 0x1e112,
1461:                            0x1e774, 0x1e332, 0x1e772, 0x1c234, 0x1c674,
1462:                            0x1c232, 0x1cef4, 0x1c672, 0x1cef2, 0x18474,
1463:                            0x18cf4, 0x18472, 0x19df4, 0x18cf2, 0x19df2,
1464:                            0x108f4, 0x119f4, 0x108f2, 0x13bf4, 0x119f2,
1465:                            0x13bf2, 0x17af0, 0x1bd7c, 0x17a78, 0x1bd3e,
1466:                            0x17a3c, 0x17a1e, 0x1f9ca, 0x1397c, 0x1fbda,
1467:                            0x17b7c, 0x1393e, 0x17b3e, 0x1f18a, 0x1f39a,
1468:                            0x1f7ba, 0x1e10a, 0x1e31a, 0x1e73a, 0x1ef7a,
1469:                            0x1c21a, 0x1c63a, 0x1ce7a, 0x1defa, 0x1843a,
1470:                            0x18c7a, 0x19cfa, 0x1bdfa, 0x1087a, 0x118fa,
1471:                            0x139fa, 0x17978, 0x1bcbe, 0x1793c, 0x1791e,
1472:                            0x138be, 0x179be, 0x178bc, 0x1789e, 0x1785e,
1473:                            0x1e0a8, 0x1e0a4, 0x1e0a2, 0x1c168, 0x1e0b6,
1474:                            0x1c164, 0x1c162, 0x182e8, 0x1c176, 0x182e4,
1475:                            0x182e2, 0x105e8, 0x182f6, 0x105e4, 0x105e2,
1476:                            0x105f6, 0x1f0d4, 0x10d7e, 0x1f0d2, 0x1e094,
1477:                            0x1e1b4, 0x1e092, 0x1e1b2, 0x1c134, 0x1c374,
1478:                            0x1c132, 0x1c372, 0x18274, 0x186f4, 0x18272,
1479:                            0x186f2, 0x104f4, 0x10df4, 0x104f2, 0x10df2,
1480:                            0x1f8ea, 0x11d7c, 0x11d3e, 0x1f0ca, 0x1f1da,
1481:                            0x1e08a, 0x1e19a, 0x1e3ba, 0x1c11a, 0x1c33a,
1482:                            0x1c77a, 0x1823a, 0x1867a, 0x18efa, 0x1047a,
1483:                            0x10cfa, 0x11dfa, 0x13d78, 0x19ebe, 0x13d3c,
1484:                            0x13d1e, 0x11cbe, 0x13dbe, 0x17d70, 0x1bebc,
1485:                            0x17d38, 0x1be9e, 0x17d1c, 0x17d0e, 0x13cbc,
1486:                            0x17dbc, 0x13c9e, 0x17d9e, 0x17cb8, 0x1be5e,
1487:                            0x17c9c, 0x17c8e, 0x13c5e, 0x17cde, 0x17c5c,
1488:                            0x17c4e, 0x17c2e, 0x1c0b4, 0x1c0b2, 0x18174,
1489:                            0x18172, 0x102f4, 0x102f2, 0x1e0da, 0x1c09a,
1490:                            0x1c1ba, 0x1813a, 0x1837a, 0x1027a, 0x106fa,
1491:                            0x10ebe, 0x11ebc, 0x11e9e, 0x13eb8, 0x19f5e,
1492:                            0x13e9c, 0x13e8e, 0x11e5e, 0x13ede, 0x17eb0,
1493:                            0x1bf5c, 0x17e98, 0x1bf4e, 0x17e8c, 0x17e86,
1494:                            0x13e5c, 0x17edc, 0x13e4e, 0x17ece, 0x17e58,
1495:                            0x1bf2e, 0x17e4c, 0x17e46, 0x13e2e, 0x17e6e,
1496:                            0x17e2c, 0x17e26, 0x10f5e, 0x11f5c, 0x11f4e,
1497:                            0x13f58, 0x19fae, 0x13f4c, 0x13f46, 0x11f2e,
1498:                            0x13f6e, 0x13f2c, 0x13f26 },
1499:                    { 0x1abe0, 0x1d5f8, 0x153c0, 0x1a9f0, 0x1d4fc, 0x151e0,
1500:                            0x1a8f8, 0x1d47e, 0x150f0, 0x1a87c, 0x15078,
1501:                            0x1fad0, 0x15be0, 0x1adf8, 0x1fac8, 0x159f0,
1502:                            0x1acfc, 0x1fac4, 0x158f8, 0x1ac7e, 0x1fac2,
1503:                            0x1587c, 0x1f5d0, 0x1faec, 0x15df8, 0x1f5c8,
1504:                            0x1fae6, 0x15cfc, 0x1f5c4, 0x15c7e, 0x1f5c2,
1505:                            0x1ebd0, 0x1f5ec, 0x1ebc8, 0x1f5e6, 0x1ebc4,
1506:                            0x1ebc2, 0x1d7d0, 0x1ebec, 0x1d7c8, 0x1ebe6,
1507:                            0x1d7c4, 0x1d7c2, 0x1afd0, 0x1d7ec, 0x1afc8,
1508:                            0x1d7e6, 0x1afc4, 0x14bc0, 0x1a5f0, 0x1d2fc,
1509:                            0x149e0, 0x1a4f8, 0x1d27e, 0x148f0, 0x1a47c,
1510:                            0x14878, 0x1a43e, 0x1483c, 0x1fa68, 0x14df0,
1511:                            0x1a6fc, 0x1fa64, 0x14cf8, 0x1a67e, 0x1fa62,
1512:                            0x14c7c, 0x14c3e, 0x1f4e8, 0x1fa76, 0x14efc,
1513:                            0x1f4e4, 0x14e7e, 0x1f4e2, 0x1e9e8, 0x1f4f6,
1514:                            0x1e9e4, 0x1e9e2, 0x1d3e8, 0x1e9f6, 0x1d3e4,
1515:                            0x1d3e2, 0x1a7e8, 0x1d3f6, 0x1a7e4, 0x1a7e2,
1516:                            0x145e0, 0x1a2f8, 0x1d17e, 0x144f0, 0x1a27c,
1517:                            0x14478, 0x1a23e, 0x1443c, 0x1441e, 0x1fa34,
1518:                            0x146f8, 0x1a37e, 0x1fa32, 0x1467c, 0x1463e,
1519:                            0x1f474, 0x1477e, 0x1f472, 0x1e8f4, 0x1e8f2,
1520:                            0x1d1f4, 0x1d1f2, 0x1a3f4, 0x1a3f2, 0x142f0,
1521:                            0x1a17c, 0x14278, 0x1a13e, 0x1423c, 0x1421e,
1522:                            0x1fa1a, 0x1437c, 0x1433e, 0x1f43a, 0x1e87a,
1523:                            0x1d0fa, 0x14178, 0x1a0be, 0x1413c, 0x1411e,
1524:                            0x141be, 0x140bc, 0x1409e, 0x12bc0, 0x195f0,
1525:                            0x1cafc, 0x129e0, 0x194f8, 0x1ca7e, 0x128f0,
1526:                            0x1947c, 0x12878, 0x1943e, 0x1283c, 0x1f968,
1527:                            0x12df0, 0x196fc, 0x1f964, 0x12cf8, 0x1967e,
1528:                            0x1f962, 0x12c7c, 0x12c3e, 0x1f2e8, 0x1f976,
1529:                            0x12efc, 0x1f2e4, 0x12e7e, 0x1f2e2, 0x1e5e8,
1530:                            0x1f2f6, 0x1e5e4, 0x1e5e2, 0x1cbe8, 0x1e5f6,
1531:                            0x1cbe4, 0x1cbe2, 0x197e8, 0x1cbf6, 0x197e4,
1532:                            0x197e2, 0x1b5e0, 0x1daf8, 0x1ed7e, 0x169c0,
1533:                            0x1b4f0, 0x1da7c, 0x168e0, 0x1b478, 0x1da3e,
1534:                            0x16870, 0x1b43c, 0x16838, 0x1b41e, 0x1681c,
1535:                            0x125e0, 0x192f8, 0x1c97e, 0x16de0, 0x124f0,
1536:                            0x1927c, 0x16cf0, 0x1b67c, 0x1923e, 0x16c78,
1537:                            0x1243c, 0x16c3c, 0x1241e, 0x16c1e, 0x1f934,
1538:                            0x126f8, 0x1937e, 0x1fb74, 0x1f932, 0x16ef8,
1539:                            0x1267c, 0x1fb72, 0x16e7c, 0x1263e, 0x16e3e,
1540:                            0x1f274, 0x1277e, 0x1f6f4, 0x1f272, 0x16f7e,
1541:                            0x1f6f2, 0x1e4f4, 0x1edf4, 0x1e4f2, 0x1edf2,
1542:                            0x1c9f4, 0x1dbf4, 0x1c9f2, 0x1dbf2, 0x193f4,
1543:                            0x193f2, 0x165c0, 0x1b2f0, 0x1d97c, 0x164e0,
1544:                            0x1b278, 0x1d93e, 0x16470, 0x1b23c, 0x16438,
1545:                            0x1b21e, 0x1641c, 0x1640e, 0x122f0, 0x1917c,
1546:                            0x166f0, 0x12278, 0x1913e, 0x16678, 0x1b33e,
1547:                            0x1663c, 0x1221e, 0x1661e, 0x1f91a, 0x1237c,
1548:                            0x1fb3a, 0x1677c, 0x1233e, 0x1673e, 0x1f23a,
1549:                            0x1f67a, 0x1e47a, 0x1ecfa, 0x1c8fa, 0x1d9fa,
1550:                            0x191fa, 0x162e0, 0x1b178, 0x1d8be, 0x16270,
1551:                            0x1b13c, 0x16238, 0x1b11e, 0x1621c, 0x1620e,
1552:                            0x12178, 0x190be, 0x16378, 0x1213c, 0x1633c,
1553:                            0x1211e, 0x1631e, 0x121be, 0x163be, 0x16170,
1554:                            0x1b0bc, 0x16138, 0x1b09e, 0x1611c, 0x1610e,
1555:                            0x120bc, 0x161bc, 0x1209e, 0x1619e, 0x160b8,
1556:                            0x1b05e, 0x1609c, 0x1608e, 0x1205e, 0x160de,
1557:                            0x1605c, 0x1604e, 0x115e0, 0x18af8, 0x1c57e,
1558:                            0x114f0, 0x18a7c, 0x11478, 0x18a3e, 0x1143c,
1559:                            0x1141e, 0x1f8b4, 0x116f8, 0x18b7e, 0x1f8b2,
1560:                            0x1167c, 0x1163e, 0x1f174, 0x1177e, 0x1f172,
1561:                            0x1e2f4, 0x1e2f2, 0x1c5f4, 0x1c5f2, 0x18bf4,
1562:                            0x18bf2, 0x135c0, 0x19af0, 0x1cd7c, 0x134e0,
1563:                            0x19a78, 0x1cd3e, 0x13470, 0x19a3c, 0x13438,
1564:                            0x19a1e, 0x1341c, 0x1340e, 0x112f0, 0x1897c,
1565:                            0x136f0, 0x11278, 0x1893e, 0x13678, 0x19b3e,
1566:                            0x1363c, 0x1121e, 0x1361e, 0x1f89a, 0x1137c,
1567:                            0x1f9ba, 0x1377c, 0x1133e, 0x1373e, 0x1f13a,
1568:                            0x1f37a, 0x1e27a, 0x1e6fa, 0x1c4fa, 0x1cdfa,
1569:                            0x189fa, 0x1bae0, 0x1dd78, 0x1eebe, 0x174c0,
1570:                            0x1ba70, 0x1dd3c, 0x17460, 0x1ba38, 0x1dd1e,
1571:                            0x17430, 0x1ba1c, 0x17418, 0x1ba0e, 0x1740c,
1572:                            0x132e0, 0x19978, 0x1ccbe, 0x176e0, 0x13270,
1573:                            0x1993c, 0x17670, 0x1bb3c, 0x1991e, 0x17638,
1574:                            0x1321c, 0x1761c, 0x1320e, 0x1760e, 0x11178,
1575:                            0x188be, 0x13378, 0x1113c, 0x17778, 0x1333c,
1576:                            0x1111e, 0x1773c, 0x1331e, 0x1771e, 0x111be,
1577:                            0x133be, 0x177be, 0x172c0, 0x1b970, 0x1dcbc,
1578:                            0x17260, 0x1b938, 0x1dc9e, 0x17230, 0x1b91c,
1579:                            0x17218, 0x1b90e, 0x1720c, 0x17206, 0x13170,
1580:                            0x198bc, 0x17370, 0x13138, 0x1989e, 0x17338,
1581:                            0x1b99e, 0x1731c, 0x1310e, 0x1730e, 0x110bc,
1582:                            0x131bc, 0x1109e, 0x173bc, 0x1319e, 0x1739e,
1583:                            0x17160, 0x1b8b8, 0x1dc5e, 0x17130, 0x1b89c,
1584:                            0x17118, 0x1b88e, 0x1710c, 0x17106, 0x130b8,
1585:                            0x1985e, 0x171b8, 0x1309c, 0x1719c, 0x1308e,
1586:                            0x1718e, 0x1105e, 0x130de, 0x171de, 0x170b0,
1587:                            0x1b85c, 0x17098, 0x1b84e, 0x1708c, 0x17086,
1588:                            0x1305c, 0x170dc, 0x1304e, 0x170ce, 0x17058,
1589:                            0x1b82e, 0x1704c, 0x17046, 0x1302e, 0x1706e,
1590:                            0x1702c, 0x17026, 0x10af0, 0x1857c, 0x10a78,
1591:                            0x1853e, 0x10a3c, 0x10a1e, 0x10b7c, 0x10b3e,
1592:                            0x1f0ba, 0x1e17a, 0x1c2fa, 0x185fa, 0x11ae0,
1593:                            0x18d78, 0x1c6be, 0x11a70, 0x18d3c, 0x11a38,
1594:                            0x18d1e, 0x11a1c, 0x11a0e, 0x10978, 0x184be,
1595:                            0x11b78, 0x1093c, 0x11b3c, 0x1091e, 0x11b1e,
1596:                            0x109be, 0x11bbe, 0x13ac0, 0x19d70, 0x1cebc,
1597:                            0x13a60, 0x19d38, 0x1ce9e, 0x13a30, 0x19d1c,
1598:                            0x13a18, 0x19d0e, 0x13a0c, 0x13a06, 0x11970,
1599:                            0x18cbc, 0x13b70, 0x11938, 0x18c9e, 0x13b38,
1600:                            0x1191c, 0x13b1c, 0x1190e, 0x13b0e, 0x108bc,
1601:                            0x119bc, 0x1089e, 0x13bbc, 0x1199e, 0x13b9e,
1602:                            0x1bd60, 0x1deb8, 0x1ef5e, 0x17a40, 0x1bd30,
1603:                            0x1de9c, 0x17a20, 0x1bd18, 0x1de8e, 0x17a10,
1604:                            0x1bd0c, 0x17a08, 0x1bd06, 0x17a04, 0x13960,
1605:                            0x19cb8, 0x1ce5e, 0x17b60, 0x13930, 0x19c9c,
1606:                            0x17b30, 0x1bd9c, 0x19c8e, 0x17b18, 0x1390c,
1607:                            0x17b0c, 0x13906, 0x17b06, 0x118b8, 0x18c5e,
1608:                            0x139b8, 0x1189c, 0x17bb8, 0x1399c, 0x1188e,
1609:                            0x17b9c, 0x1398e, 0x17b8e, 0x1085e, 0x118de,
1610:                            0x139de, 0x17bde, 0x17940, 0x1bcb0, 0x1de5c,
1611:                            0x17920, 0x1bc98, 0x1de4e, 0x17910, 0x1bc8c,
1612:                            0x17908, 0x1bc86, 0x17904, 0x17902, 0x138b0,
1613:                            0x19c5c, 0x179b0, 0x13898, 0x19c4e, 0x17998,
1614:                            0x1bcce, 0x1798c, 0x13886, 0x17986, 0x1185c,
1615:                            0x138dc, 0x1184e, 0x179dc, 0x138ce, 0x179ce,
1616:                            0x178a0, 0x1bc58, 0x1de2e, 0x17890, 0x1bc4c,
1617:                            0x17888, 0x1bc46, 0x17884, 0x17882, 0x13858,
1618:                            0x19c2e, 0x178d8, 0x1384c, 0x178cc, 0x13846,
1619:                            0x178c6, 0x1182e, 0x1386e, 0x178ee, 0x17850,
1620:                            0x1bc2c, 0x17848, 0x1bc26, 0x17844, 0x17842,
1621:                            0x1382c, 0x1786c, 0x13826, 0x17866, 0x17828,
1622:                            0x1bc16, 0x17824, 0x17822, 0x13816, 0x17836,
1623:                            0x10578, 0x182be, 0x1053c, 0x1051e, 0x105be,
1624:                            0x10d70, 0x186bc, 0x10d38, 0x1869e, 0x10d1c,
1625:                            0x10d0e, 0x104bc, 0x10dbc, 0x1049e, 0x10d9e,
1626:                            0x11d60, 0x18eb8, 0x1c75e, 0x11d30, 0x18e9c,
1627:                            0x11d18, 0x18e8e, 0x11d0c, 0x11d06, 0x10cb8,
1628:                            0x1865e, 0x11db8, 0x10c9c, 0x11d9c, 0x10c8e,
1629:                            0x11d8e, 0x1045e, 0x10cde, 0x11dde, 0x13d40,
1630:                            0x19eb0, 0x1cf5c, 0x13d20, 0x19e98, 0x1cf4e,
1631:                            0x13d10, 0x19e8c, 0x13d08, 0x19e86, 0x13d04,
1632:                            0x13d02, 0x11cb0, 0x18e5c, 0x13db0, 0x11c98,
1633:                            0x18e4e, 0x13d98, 0x19ece, 0x13d8c, 0x11c86,
1634:                            0x13d86, 0x10c5c, 0x11cdc, 0x10c4e, 0x13ddc,
1635:                            0x11cce, 0x13dce, 0x1bea0, 0x1df58, 0x1efae,
1636:                            0x1be90, 0x1df4c, 0x1be88, 0x1df46, 0x1be84,
1637:                            0x1be82, 0x13ca0, 0x19e58, 0x1cf2e, 0x17da0,
1638:                            0x13c90, 0x19e4c, 0x17d90, 0x1becc, 0x19e46,
1639:                            0x17d88, 0x13c84, 0x17d84, 0x13c82, 0x17d82,
1640:                            0x11c58, 0x18e2e, 0x13cd8, 0x11c4c, 0x17dd8,
1641:                            0x13ccc, 0x11c46, 0x17dcc, 0x13cc6, 0x17dc6,
1642:                            0x10c2e, 0x11c6e, 0x13cee, 0x17dee, 0x1be50,
1643:                            0x1df2c, 0x1be48, 0x1df26, 0x1be44, 0x1be42,
1644:                            0x13c50, 0x19e2c, 0x17cd0, 0x13c48, 0x19e26,
1645:                            0x17cc8, 0x1be66, 0x17cc4, 0x13c42, 0x17cc2,
1646:                            0x11c2c, 0x13c6c, 0x11c26, 0x17cec, 0x13c66,
1647:                            0x17ce6, 0x1be28, 0x1df16, 0x1be24, 0x1be22,
1648:                            0x13c28, 0x19e16, 0x17c68, 0x13c24, 0x17c64,
1649:                            0x13c22, 0x17c62, 0x11c16, 0x13c36, 0x17c76,
1650:                            0x1be14, 0x1be12, 0x13c14, 0x17c34, 0x13c12,
1651:                            0x17c32, 0x102bc, 0x1029e, 0x106b8, 0x1835e,
1652:                            0x1069c, 0x1068e, 0x1025e, 0x106de, 0x10eb0,
1653:                            0x1875c, 0x10e98, 0x1874e, 0x10e8c, 0x10e86,
1654:                            0x1065c, 0x10edc, 0x1064e, 0x10ece, 0x11ea0,
1655:                            0x18f58, 0x1c7ae, 0x11e90, 0x18f4c, 0x11e88,
1656:                            0x18f46, 0x11e84, 0x11e82, 0x10e58, 0x1872e,
1657:                            0x11ed8, 0x18f6e, 0x11ecc, 0x10e46, 0x11ec6,
1658:                            0x1062e, 0x10e6e, 0x11eee, 0x19f50, 0x1cfac,
1659:                            0x19f48, 0x1cfa6, 0x19f44, 0x19f42, 0x11e50,
1660:                            0x18f2c, 0x13ed0, 0x19f6c, 0x18f26, 0x13ec8,
1661:                            0x11e44, 0x13ec4, 0x11e42, 0x13ec2, 0x10e2c,
1662:                            0x11e6c, 0x10e26, 0x13eec, 0x11e66, 0x13ee6,
1663:                            0x1dfa8, 0x1efd6, 0x1dfa4, 0x1dfa2, 0x19f28,
1664:                            0x1cf96, 0x1bf68, 0x19f24, 0x1bf64, 0x19f22,
1665:                            0x1bf62, 0x11e28, 0x18f16, 0x13e68, 0x11e24,
1666:                            0x17ee8, 0x13e64, 0x11e22, 0x17ee4, 0x13e62,
1667:                            0x17ee2, 0x10e16, 0x11e36, 0x13e76, 0x17ef6,
1668:                            0x1df94, 0x1df92, 0x19f14, 0x1bf34, 0x19f12,
1669:                            0x1bf32, 0x11e14, 0x13e34, 0x11e12, 0x17e74,
1670:                            0x13e32, 0x17e72, 0x1df8a, 0x19f0a, 0x1bf1a,
1671:                            0x11e0a, 0x13e1a, 0x17e3a, 0x1035c, 0x1034e,
1672:                            0x10758, 0x183ae, 0x1074c, 0x10746, 0x1032e,
1673:                            0x1076e, 0x10f50, 0x187ac, 0x10f48, 0x187a6,
1674:                            0x10f44, 0x10f42, 0x1072c, 0x10f6c, 0x10726,
1675:                            0x10f66, 0x18fa8, 0x1c7d6, 0x18fa4, 0x18fa2,
1676:                            0x10f28, 0x18796, 0x11f68, 0x18fb6, 0x11f64,
1677:                            0x10f22, 0x11f62, 0x10716, 0x10f36, 0x11f76,
1678:                            0x1cfd4, 0x1cfd2, 0x18f94, 0x19fb4, 0x18f92,
1679:                            0x19fb2, 0x10f14, 0x11f34, 0x10f12, 0x13f74,
1680:                            0x11f32, 0x13f72, 0x1cfca, 0x18f8a, 0x19f9a,
1681:                            0x10f0a, 0x11f1a, 0x13f3a, 0x103ac, 0x103a6,
1682:                            0x107a8, 0x183d6, 0x107a4, 0x107a2, 0x10396,
1683:                            0x107b6, 0x187d4, 0x187d2, 0x10794, 0x10fb4,
1684:                            0x10792, 0x10fb2, 0x1c7ea } };
1685:
1686:            private static final int ERROR_LEVEL[][] = {
1687:                    { 27, 917 },
1688:                    { 522, 568, 723, 809 },
1689:                    { 237, 308, 436, 284, 646, 653, 428, 379 },
1690:                    { 274, 562, 232, 755, 599, 524, 801, 132, 295, 116, 442,
1691:                            428, 295, 42, 176, 65 },
1692:                    { 361, 575, 922, 525, 176, 586, 640, 321, 536, 742, 677,
1693:                            742, 687, 284, 193, 517, 273, 494, 263, 147, 593,
1694:                            800, 571, 320, 803, 133, 231, 390, 685, 330, 63,
1695:                            410 },
1696:                    { 539, 422, 6, 93, 862, 771, 453, 106, 610, 287, 107, 505,
1697:                            733, 877, 381, 612, 723, 476, 462, 172, 430, 609,
1698:                            858, 822, 543, 376, 511, 400, 672, 762, 283, 184,
1699:                            440, 35, 519, 31, 460, 594, 225, 535, 517, 352,
1700:                            605, 158, 651, 201, 488, 502, 648, 733, 717, 83,
1701:                            404, 97, 280, 771, 840, 629, 4, 381, 843, 623, 264,
1702:                            543 },
1703:                    { 521, 310, 864, 547, 858, 580, 296, 379, 53, 779, 897,
1704:                            444, 400, 925, 749, 415, 822, 93, 217, 208, 928,
1705:                            244, 583, 620, 246, 148, 447, 631, 292, 908, 490,
1706:                            704, 516, 258, 457, 907, 594, 723, 674, 292, 272,
1707:                            96, 684, 432, 686, 606, 860, 569, 193, 219, 129,
1708:                            186, 236, 287, 192, 775, 278, 173, 40, 379, 712,
1709:                            463, 646, 776, 171, 491, 297, 763, 156, 732, 95,
1710:                            270, 447, 90, 507, 48, 228, 821, 808, 898, 784,
1711:                            663, 627, 378, 382, 262, 380, 602, 754, 336, 89,
1712:                            614, 87, 432, 670, 616, 157, 374, 242, 726, 600,
1713:                            269, 375, 898, 845, 454, 354, 130, 814, 587, 804,
1714:                            34, 211, 330, 539, 297, 827, 865, 37, 517, 834,
1715:                            315, 550, 86, 801, 4, 108, 539 },
1716:                    { 524, 894, 75, 766, 882, 857, 74, 204, 82, 586, 708, 250,
1717:                            905, 786, 138, 720, 858, 194, 311, 913, 275, 190,
1718:                            375, 850, 438, 733, 194, 280, 201, 280, 828, 757,
1719:                            710, 814, 919, 89, 68, 569, 11, 204, 796, 605, 540,
1720:                            913, 801, 700, 799, 137, 439, 418, 592, 668, 353,
1721:                            859, 370, 694, 325, 240, 216, 257, 284, 549, 209,
1722:                            884, 315, 70, 329, 793, 490, 274, 877, 162, 749,
1723:                            812, 684, 461, 334, 376, 849, 521, 307, 291, 803,
1724:                            712, 19, 358, 399, 908, 103, 511, 51, 8, 517, 225,
1725:                            289, 470, 637, 731, 66, 255, 917, 269, 463, 830,
1726:                            730, 433, 848, 585, 136, 538, 906, 90, 2, 290, 743,
1727:                            199, 655, 903, 329, 49, 802, 580, 355, 588, 188,
1728:                            462, 10, 134, 628, 320, 479, 130, 739, 71, 263,
1729:                            318, 374, 601, 192, 605, 142, 673, 687, 234, 722,
1730:                            384, 177, 752, 607, 640, 455, 193, 689, 707, 805,
1731:                            641, 48, 60, 732, 621, 895, 544, 261, 852, 655,
1732:                            309, 697, 755, 756, 60, 231, 773, 434, 421, 726,
1733:                            528, 503, 118, 49, 795, 32, 144, 500, 238, 836,
1734:                            394, 280, 566, 319, 9, 647, 550, 73, 914, 342, 126,
1735:                            32, 681, 331, 792, 620, 60, 609, 441, 180, 791,
1736:                            893, 754, 605, 383, 228, 749, 760, 213, 54, 297,
1737:                            134, 54, 834, 299, 922, 191, 910, 532, 609, 829,
1738:                            189, 20, 167, 29, 872, 449, 83, 402, 41, 656, 505,
1739:                            579, 481, 173, 404, 251, 688, 95, 497, 555, 642,
1740:                            543, 307, 159, 924, 558, 648, 55, 497, 10 },
1741:                    { 352, 77, 373, 504, 35, 599, 428, 207, 409, 574, 118, 498,
1742:                            285, 380, 350, 492, 197, 265, 920, 155, 914, 299,
1743:                            229, 643, 294, 871, 306, 88, 87, 193, 352, 781,
1744:                            846, 75, 327, 520, 435, 543, 203, 666, 249, 346,
1745:                            781, 621, 640, 268, 794, 534, 539, 781, 408, 390,
1746:                            644, 102, 476, 499, 290, 632, 545, 37, 858, 916,
1747:                            552, 41, 542, 289, 122, 272, 383, 800, 485, 98,
1748:                            752, 472, 761, 107, 784, 860, 658, 741, 290, 204,
1749:                            681, 407, 855, 85, 99, 62, 482, 180, 20, 297, 451,
1750:                            593, 913, 142, 808, 684, 287, 536, 561, 76, 653,
1751:                            899, 729, 567, 744, 390, 513, 192, 516, 258, 240,
1752:                            518, 794, 395, 768, 848, 51, 610, 384, 168, 190,
1753:                            826, 328, 596, 786, 303, 570, 381, 415, 641, 156,
1754:                            237, 151, 429, 531, 207, 676, 710, 89, 168, 304,
1755:                            402, 40, 708, 575, 162, 864, 229, 65, 861, 841,
1756:                            512, 164, 477, 221, 92, 358, 785, 288, 357, 850,
1757:                            836, 827, 736, 707, 94, 8, 494, 114, 521, 2, 499,
1758:                            851, 543, 152, 729, 771, 95, 248, 361, 578, 323,
1759:                            856, 797, 289, 51, 684, 466, 533, 820, 669, 45,
1760:                            902, 452, 167, 342, 244, 173, 35, 463, 651, 51,
1761:                            699, 591, 452, 578, 37, 124, 298, 332, 552, 43,
1762:                            427, 119, 662, 777, 475, 850, 764, 364, 578, 911,
1763:                            283, 711, 472, 420, 245, 288, 594, 394, 511, 327,
1764:                            589, 777, 699, 688, 43, 408, 842, 383, 721, 521,
1765:                            560, 644, 714, 559, 62, 145, 873, 663, 713, 159,
1766:                            672, 729, 624, 59, 193, 417, 158, 209, 563, 564,
1767:                            343, 693, 109, 608, 563, 365, 181, 772, 677, 310,
1768:                            248, 353, 708, 410, 579, 870, 617, 841, 632, 860,
1769:                            289, 536, 35, 777, 618, 586, 424, 833, 77, 597,
1770:                            346, 269, 757, 632, 695, 751, 331, 247, 184, 45,
1771:                            787, 680, 18, 66, 407, 369, 54, 492, 228, 613, 830,
1772:                            922, 437, 519, 644, 905, 789, 420, 305, 441, 207,
1773:                            300, 892, 827, 141, 537, 381, 662, 513, 56, 252,
1774:                            341, 242, 797, 838, 837, 720, 224, 307, 631, 61,
1775:                            87, 560, 310, 756, 665, 397, 808, 851, 309, 473,
1776:                            795, 378, 31, 647, 915, 459, 806, 590, 731, 425,
1777:                            216, 548, 249, 321, 881, 699, 535, 673, 782, 210,
1778:                            815, 905, 303, 843, 922, 281, 73, 469, 791, 660,
1779:                            162, 498, 308, 155, 422, 907, 817, 187, 62, 16,
1780:                            425, 535, 336, 286, 437, 375, 273, 610, 296, 183,
1781:                            923, 116, 667, 751, 353, 62, 366, 691, 379, 687,
1782:                            842, 37, 357, 720, 742, 330, 5, 39, 923, 311, 424,
1783:                            242, 749, 321, 54, 669, 316, 342, 299, 534, 105,
1784:                            667, 488, 640, 672, 576, 540, 316, 486, 721, 610,
1785:                            46, 656, 447, 171, 616, 464, 190, 531, 297, 321,
1786:                            762, 752, 533, 175, 134, 14, 381, 433, 717, 45,
1787:                            111, 20, 596, 284, 736, 138, 646, 411, 877, 669,
1788:                            141, 919, 45, 780, 407, 164, 332, 899, 165, 726,
1789:                            600, 325, 498, 655, 357, 752, 768, 223, 849, 647,
1790:                            63, 310, 863, 251, 366, 304, 282, 738, 675, 410,
1791:                            389, 244, 31, 121, 303, 263 } };
1792:
1793:            /** Holds value of property outBits. */
1794:            private byte[] outBits;
1795:
1796:            /** Holds value of property bitColumns. */
1797:            private int bitColumns;
1798:
1799:            /** Holds value of property codeRows. */
1800:            private int codeRows;
1801:
1802:            /** Holds value of property codeColumns. */
1803:            private int codeColumns;
1804:
1805:            /** Holds value of property codewords. */
1806:            private int[] codewords = new int[MAX_DATA_CODEWORDS + 2];
1807:
1808:            /** Holds value of property lenCodewords. */
1809:            private int lenCodewords;
1810:
1811:            /** Holds value of property errorLevel. */
1812:            private int errorLevel;
1813:
1814:            /** Holds value of property text. */
1815:            private byte[] text;
1816:
1817:            /** Holds value of property options. */
1818:            private int options;
1819:
1820:            /** Holds value of property aspectRatio. */
1821:            private float aspectRatio;
1822:
1823:            /** Holds value of property yHeight. */
1824:            private float yHeight;
1825:
1826:            protected static class Segment {
1827:                public char type;
1828:                public int start;
1829:                public int end;
1830:
1831:                public Segment(char type, int start, int end) {
1832:                    this .type = type;
1833:                    this .start = start;
1834:                    this .end = end;
1835:                }
1836:            }
1837:
1838:            protected static class SegmentList {
1839:                protected ArrayList list = new ArrayList();
1840:
1841:                public void add(char type, int start, int end) {
1842:                    list.add(new Segment(type, start, end));
1843:                }
1844:
1845:                public Segment get(int idx) {
1846:                    if (idx < 0 || idx >= list.size())
1847:                        return null;
1848:                    return (Segment) list.get(idx);
1849:                }
1850:
1851:                public void remove(int idx) {
1852:                    if (idx < 0 || idx >= list.size())
1853:                        return;
1854:                    list.remove(idx);
1855:                }
1856:
1857:                public int size() {
1858:                    return list.size();
1859:                }
1860:            }
1861:        }
www.java2java.com | Contact Us
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.