git-svn-id: http://zxing.googlecode.com/svn/trunk@6 59b500cc-1b3d-0410-9834-0bbf25fbcc57
[zxing.git] / core / src / com / google / zxing / qrcode / decoder / Version.java
1 /*\r
2  * Copyright 2007 Google Inc.\r
3  *\r
4  * Licensed under the Apache License, Version 2.0 (the "License");\r
5  * you may not use this file except in compliance with the License.\r
6  * You may obtain a copy of the License at\r
7  *\r
8  *      http://www.apache.org/licenses/LICENSE-2.0\r
9  *\r
10  * Unless required by applicable law or agreed to in writing, software\r
11  * distributed under the License is distributed on an "AS IS" BASIS,\r
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
13  * See the License for the specific language governing permissions and\r
14  * limitations under the License.\r
15  */\r
16 \r
17 package com.google.zxing.qrcode.decoder;\r
18 \r
19 import com.google.zxing.ReaderException;\r
20 import com.google.zxing.common.BitMatrix;\r
21 \r
22 /**\r
23  * See ISO 18004:2006 Annex D\r
24  *\r
25  * @author srowen@google.com (Sean Owen)\r
26  */\r
27 public final class Version {\r
28 \r
29   /**\r
30    * See ISO 18004:2006 Annex D.\r
31    * Element i represents the raw version bits that specify version i + 7\r
32    */\r
33   private static final int[] VERSION_DECODE_INFO = new int[]{\r
34       0x07C94, 0x085BC, 0x09A99, 0x0A4D3, 0x0BBF6,\r
35       0x0C762, 0x0D847, 0x0E60D, 0x0F928, 0x10B78,\r
36       0x1145D, 0x12A17, 0x13532, 0x149A6, 0x15683,\r
37       0x168C9, 0x177EC, 0x18EC4, 0x191E1, 0x1AFAB,\r
38       0x1B08E, 0x1CC1A, 0x1D33F, 0x1ED75, 0x1F250,\r
39       0x209D5, 0x216F0, 0x228BA, 0x2379F, 0x24B0B,\r
40       0x2542E, 0x26A64, 0x27541, 0x28C69\r
41   };\r
42 \r
43   private static final Version[] VERSIONS = buildVersions();\r
44 \r
45   private final int versionNumber;\r
46   private final int[] alignmentPatternCenters;\r
47   private final ECBlocks[] ecBlocks;\r
48   private final int totalCodewords;\r
49 \r
50   private Version(int versionNumber,\r
51                   int[] alignmentPatternCenters,\r
52                   ECBlocks ecBlocks1,\r
53                   ECBlocks ecBlocks2,\r
54                   ECBlocks ecBlocks3,\r
55                   ECBlocks ecBlocks4) {\r
56     this.versionNumber = versionNumber;\r
57     this.alignmentPatternCenters = alignmentPatternCenters;\r
58     this.ecBlocks = new ECBlocks[] { ecBlocks1, ecBlocks2, ecBlocks3, ecBlocks4 };\r
59     int total = 0;\r
60     ECBlocks levelLECBlocks = ecBlocks1; // L,M,Q,H -- all the same total\r
61     int ecCodewords = levelLECBlocks.ecCodewords;\r
62     ECB[] ecbArray = levelLECBlocks.ecBlocks;\r
63     for (int i = 0; i < ecbArray.length; i++) {\r
64       ECB ecBlock = ecbArray[i];\r
65       total += ecBlock.count * (ecBlock.dataCodewords + ecCodewords);\r
66     }\r
67     this.totalCodewords = total;\r
68   }\r
69 \r
70   public int getVersionNumber() {\r
71     return versionNumber;\r
72   }\r
73 \r
74   public int[] getAlignmentPatternCenters() {\r
75     return alignmentPatternCenters;\r
76   }\r
77 \r
78   public int getTotalCodewords() {\r
79     return totalCodewords;\r
80   }\r
81 \r
82   public int getDimensionForVersion() {\r
83     return 17 + 4 * versionNumber;\r
84   }\r
85 \r
86   ECBlocks getECBlocksForLevel(ErrorCorrectionLevel ecLevel) {\r
87     return ecBlocks[ecLevel.ordinal()];\r
88   }\r
89 \r
90   public static Version getProvisionalVersionForDimension(int dimension)\r
91       throws ReaderException {\r
92     if (dimension % 4 != 1) {\r
93       throw new ReaderException("Dimension must be 1 mod 4");\r
94     }\r
95     return getVersionForNumber((dimension - 17) >> 2);\r
96   }\r
97 \r
98   public static Version getVersionForNumber(int versionNumber)\r
99       throws ReaderException {\r
100     if (versionNumber < 1 || versionNumber > 40) {\r
101       throw new ReaderException(\r
102           "versionNumber must be between 1 and 40");\r
103     }\r
104     return VERSIONS[versionNumber - 1];\r
105   }\r
106 \r
107   static Version decodeVersionInformation(int versionBits)\r
108       throws ReaderException {\r
109     int bestDifference = Integer.MAX_VALUE;\r
110     int bestVersion = 0;\r
111     for (int i = 0; i < VERSION_DECODE_INFO.length; i++) {\r
112       int targetVersion = VERSION_DECODE_INFO[i];\r
113       if (targetVersion == versionBits) {\r
114         return getVersionForNumber(i + 7);\r
115       }\r
116       int bitsDifference =\r
117           FormatInformation.numBitsDiffering(versionBits, targetVersion);\r
118       if (bitsDifference < bestDifference) {\r
119         bestVersion = i + 7;\r
120       }\r
121     }\r
122     if (bestDifference <= 3) {\r
123       return getVersionForNumber(bestVersion);\r
124     }\r
125     return null;\r
126   }\r
127 \r
128   /**\r
129    * See ISO 18004:2006 Annex E\r
130    */\r
131   BitMatrix buildFunctionPattern() {\r
132     int dimension = getDimensionForVersion();\r
133     BitMatrix bitMatrix = new BitMatrix(dimension);\r
134 \r
135     // Top left finder pattern + separator + format\r
136     bitMatrix.setRegion(0, 0, 9, 9);\r
137     // Top right finder pattern + separator + format\r
138     bitMatrix.setRegion(0, dimension - 8, 9, 8);\r
139     // Bottom left finder pattern + separator + format\r
140     bitMatrix.setRegion(dimension - 8, 0, 8, 9);\r
141 \r
142     // Alignment patterns\r
143     int max = alignmentPatternCenters.length;\r
144     for (int x = 0; x < max; x++) {\r
145       int i = alignmentPatternCenters[x] - 2;\r
146       for (int y = 0; y < max; y++) {\r
147         if ((x == 0 && (y == 0 || y == max - 1)) || (x == max - 1 && y == 0)) {\r
148           // No alignment patterns near the three finder paterns\r
149           continue;\r
150         }\r
151         bitMatrix.setRegion(i, alignmentPatternCenters[y] - 2, 5, 5);\r
152       }\r
153     }\r
154 \r
155     // Vertical timing pattern\r
156     bitMatrix.setRegion(9, 6, dimension - 17, 1);\r
157     // Horizontal timing pattern\r
158     bitMatrix.setRegion(6, 9, 1, dimension - 17);\r
159 \r
160     if (versionNumber > 6) {\r
161       // Version info, top right\r
162       bitMatrix.setRegion(0, dimension - 11, 6, 3);\r
163       // Version info, bottom left\r
164       bitMatrix.setRegion(dimension - 11, 0, 3, 6);\r
165     }\r
166 \r
167     return bitMatrix;\r
168   }\r
169 \r
170   /**\r
171    * <p>Encapsulates a set of error-correction blocks in one symbol version. Most versions will\r
172    * use blocks of differing sizes within one version, so, this encapsulates the parameters for\r
173    * each set of blocks. It also holds the number of error-correction codewords per block since it\r
174    * will be the same across all blocks within one version.</p>\r
175    */\r
176   static final class ECBlocks {\r
177     private int ecCodewords;\r
178     private ECB[] ecBlocks;\r
179 \r
180     private ECBlocks(int ecCodewords, ECB ecBlocks) {\r
181       this.ecCodewords = ecCodewords;\r
182       this.ecBlocks = new ECB[] { ecBlocks };\r
183     }\r
184 \r
185     private ECBlocks(int ecCodewords, ECB ecBlocks1, ECB ecBlocks2) {\r
186       this.ecCodewords = ecCodewords;\r
187       this.ecBlocks = new ECB[] { ecBlocks1, ecBlocks2 };\r
188     }\r
189 \r
190     int getECCodewords() {\r
191       return ecCodewords;\r
192     }\r
193 \r
194     ECB[] getECBlocks() {\r
195       return ecBlocks;\r
196     }\r
197   }\r
198 \r
199   /**\r
200    * <p>Encapsualtes the parameters for one error-correction block in one symbol version.\r
201    * This includes the number of data codewords, and the number of times a block with these\r
202    * parameters is used consecutively in the QR code version's format.</p>\r
203    */\r
204   static final class ECB {\r
205     private int count;\r
206     private int dataCodewords;\r
207 \r
208     private ECB(int count, int dataCodewords) {\r
209       this.count = count;\r
210       this.dataCodewords = dataCodewords;\r
211     }\r
212 \r
213     int getCount() {\r
214       return count;\r
215     }\r
216 \r
217     int getDataCodewords() {\r
218       return dataCodewords;\r
219     }\r
220   }\r
221 \r
222   public String toString() {\r
223     return String.valueOf(versionNumber);\r
224   }\r
225 \r
226   /**\r
227    * See ISO 18004:2006 6.5.1 Table 9\r
228    */\r
229   private static Version[] buildVersions() {\r
230     return new Version[]{\r
231         new Version(1, new int[]{},\r
232             new ECBlocks(7, new ECB(1, 19)),\r
233             new ECBlocks(10, new ECB(1, 16)),\r
234             new ECBlocks(13, new ECB(1, 13)),\r
235             new ECBlocks(17, new ECB(1, 9))),\r
236         new Version(2, new int[]{6, 18},\r
237             new ECBlocks(10, new ECB(1, 34)),\r
238             new ECBlocks(16, new ECB(1, 28)),\r
239             new ECBlocks(22, new ECB(1, 22)),\r
240             new ECBlocks(28, new ECB(1, 16))),\r
241         new Version(3, new int[]{6, 22},\r
242             new ECBlocks(15, new ECB(1, 55)),\r
243             new ECBlocks(26, new ECB(1, 44)),\r
244             new ECBlocks(18, new ECB(2, 17)),\r
245             new ECBlocks(22, new ECB(2, 13))),\r
246         new Version(4, new int[]{6, 26},\r
247             new ECBlocks(20, new ECB(1, 80)),\r
248             new ECBlocks(18, new ECB(2, 32)),\r
249             new ECBlocks(26, new ECB(2, 24)),\r
250             new ECBlocks(16, new ECB(4, 9))),\r
251         new Version(5, new int[]{6, 30},\r
252             new ECBlocks(26, new ECB(1, 108)),\r
253             new ECBlocks(24, new ECB(2, 43)),\r
254             new ECBlocks(18, new ECB(2, 15),\r
255                 new ECB(2, 16)),\r
256             new ECBlocks(22, new ECB(2, 11),\r
257                 new ECB(2, 12))),\r
258         new Version(6, new int[]{6, 34},\r
259             new ECBlocks(18, new ECB(2, 68)),\r
260             new ECBlocks(16, new ECB(4, 27)),\r
261             new ECBlocks(24, new ECB(4, 19)),\r
262             new ECBlocks(28, new ECB(4, 15))),\r
263         new Version(7, new int[]{6, 22, 38},\r
264             new ECBlocks(20, new ECB(2, 78)),\r
265             new ECBlocks(18, new ECB(4, 31)),\r
266             new ECBlocks(18, new ECB(2, 14),\r
267                 new ECB(4, 15)),\r
268             new ECBlocks(26, new ECB(4, 13),\r
269                 new ECB(1, 14))),\r
270         new Version(8, new int[]{6, 24, 42},\r
271             new ECBlocks(24, new ECB(2, 97)),\r
272             new ECBlocks(22, new ECB(2, 38),\r
273                 new ECB(2, 39)),\r
274             new ECBlocks(22, new ECB(4, 18),\r
275                 new ECB(2, 19)),\r
276             new ECBlocks(26, new ECB(4, 14),\r
277                 new ECB(2, 15))),\r
278         new Version(9, new int[]{6, 26, 46},\r
279             new ECBlocks(30, new ECB(2, 116)),\r
280             new ECBlocks(22, new ECB(3, 36),\r
281                 new ECB(2, 37)),\r
282             new ECBlocks(20, new ECB(4, 16),\r
283                 new ECB(4, 17)),\r
284             new ECBlocks(24, new ECB(4, 12),\r
285                 new ECB(4, 13))),\r
286         new Version(10, new int[]{6, 28, 50},\r
287             new ECBlocks(18, new ECB(2, 68),\r
288                 new ECB(2, 69)),\r
289             new ECBlocks(26, new ECB(4, 43),\r
290                 new ECB(1, 44)),\r
291             new ECBlocks(24, new ECB(6, 19),\r
292                 new ECB(2, 20)),\r
293             new ECBlocks(28, new ECB(6, 15),\r
294                 new ECB(2, 16))),\r
295         new Version(11, new int[]{6, 30, 54},\r
296             new ECBlocks(20, new ECB(4, 81)),\r
297             new ECBlocks(30, new ECB(1, 50),\r
298                 new ECB(4, 51)),\r
299             new ECBlocks(28, new ECB(4, 22),\r
300                 new ECB(4, 23)),\r
301             new ECBlocks(24, new ECB(3, 12),\r
302                 new ECB(8, 13))),\r
303         new Version(12, new int[]{6, 32, 58},\r
304             new ECBlocks(24, new ECB(2, 92),\r
305                 new ECB(2, 93)),\r
306             new ECBlocks(22, new ECB(6, 36),\r
307                 new ECB(2, 37)),\r
308             new ECBlocks(26, new ECB(4, 20),\r
309                 new ECB(6, 21)),\r
310             new ECBlocks(28, new ECB(7, 14),\r
311                 new ECB(4, 15))),\r
312         new Version(13, new int[]{6, 34, 62},\r
313             new ECBlocks(26, new ECB(4, 107)),\r
314             new ECBlocks(22, new ECB(8, 37),\r
315                 new ECB(1, 38)),\r
316             new ECBlocks(24, new ECB(8, 20),\r
317                 new ECB(4, 21)),\r
318             new ECBlocks(22, new ECB(12, 11),\r
319                 new ECB(4, 12))),\r
320         new Version(14, new int[]{6, 26, 46, 66},\r
321             new ECBlocks(30, new ECB(3, 115),\r
322                 new ECB(1, 116)),\r
323             new ECBlocks(24, new ECB(4, 40),\r
324                 new ECB(5, 41)),\r
325             new ECBlocks(20, new ECB(11, 16),\r
326                 new ECB(5, 17)),\r
327             new ECBlocks(24, new ECB(11, 12),\r
328                 new ECB(5, 13))),\r
329         new Version(15, new int[]{6, 26, 48, 70},\r
330             new ECBlocks(22, new ECB(5, 87),\r
331                 new ECB(1, 88)),\r
332             new ECBlocks(24, new ECB(5, 41),\r
333                 new ECB(5, 42)),\r
334             new ECBlocks(30, new ECB(5, 24),\r
335                 new ECB(7, 25)),\r
336             new ECBlocks(24, new ECB(11, 12),\r
337                 new ECB(7, 13))),\r
338         new Version(16, new int[]{6, 26, 50, 74},\r
339             new ECBlocks(24, new ECB(5, 98),\r
340                 new ECB(1, 99)),\r
341             new ECBlocks(28, new ECB(7, 45),\r
342                 new ECB(3, 46)),\r
343             new ECBlocks(24, new ECB(15, 19),\r
344                 new ECB(2, 20)),\r
345             new ECBlocks(30, new ECB(3, 15),\r
346                 new ECB(13, 16))),\r
347         new Version(17, new int[]{6, 30, 54, 78},\r
348             new ECBlocks(28, new ECB(1, 107),\r
349                 new ECB(5, 108)),\r
350             new ECBlocks(28, new ECB(10, 46),\r
351                 new ECB(1, 47)),\r
352             new ECBlocks(28, new ECB(1, 22),\r
353                 new ECB(15, 23)),\r
354             new ECBlocks(28, new ECB(2, 14),\r
355                 new ECB(17, 15))),\r
356         new Version(18, new int[]{6, 30, 56, 82},\r
357             new ECBlocks(30, new ECB(5, 120),\r
358                 new ECB(1, 121)),\r
359             new ECBlocks(26, new ECB(9, 43),\r
360                 new ECB(4, 44)),\r
361             new ECBlocks(28, new ECB(17, 22),\r
362                 new ECB(1, 23)),\r
363             new ECBlocks(28, new ECB(2, 14),\r
364                 new ECB(19, 15))),\r
365         new Version(19, new int[]{6, 30, 58, 86},\r
366             new ECBlocks(28, new ECB(3, 113),\r
367                 new ECB(4, 114)),\r
368             new ECBlocks(26, new ECB(3, 44),\r
369                 new ECB(11, 45)),\r
370             new ECBlocks(26, new ECB(17, 21),\r
371                 new ECB(4, 22)),\r
372             new ECBlocks(26, new ECB(9, 13),\r
373                 new ECB(16, 14))),\r
374         new Version(20, new int[]{6, 34, 62, 90},\r
375             new ECBlocks(28, new ECB(3, 107),\r
376                 new ECB(5, 108)),\r
377             new ECBlocks(26, new ECB(3, 41),\r
378                 new ECB(13, 42)),\r
379             new ECBlocks(30, new ECB(15, 24),\r
380                 new ECB(5, 25)),\r
381             new ECBlocks(28, new ECB(15, 15),\r
382                 new ECB(10, 16))),\r
383         new Version(21, new int[]{6, 28, 50, 72, 94},\r
384             new ECBlocks(28, new ECB(4, 116),\r
385                 new ECB(4, 117)),\r
386             new ECBlocks(26, new ECB(17, 42)),\r
387             new ECBlocks(28, new ECB(17, 22),\r
388                 new ECB(6, 23)),\r
389             new ECBlocks(30, new ECB(19, 16),\r
390                 new ECB(6, 17))),\r
391         new Version(22, new int[]{6, 26, 50, 74, 98},\r
392             new ECBlocks(28, new ECB(2, 111),\r
393                 new ECB(7, 112)),\r
394             new ECBlocks(28, new ECB(17, 46)),\r
395             new ECBlocks(30, new ECB(7, 24),\r
396                 new ECB(16, 25)),\r
397             new ECBlocks(24, new ECB(34, 13))),\r
398         new Version(23, new int[]{6, 30, 54, 74, 102},\r
399             new ECBlocks(30, new ECB(4, 121),\r
400                 new ECB(5, 122)),\r
401             new ECBlocks(28, new ECB(4, 47),\r
402                 new ECB(14, 48)),\r
403             new ECBlocks(30, new ECB(11, 24),\r
404                 new ECB(14, 25)),\r
405             new ECBlocks(30, new ECB(16, 15),\r
406                 new ECB(14, 16))),\r
407         new Version(24, new int[]{6, 28, 54, 80, 106},\r
408             new ECBlocks(30, new ECB(6, 117),\r
409                 new ECB(4, 118)),\r
410             new ECBlocks(28, new ECB(6, 45),\r
411                 new ECB(14, 46)),\r
412             new ECBlocks(30, new ECB(11, 24),\r
413                 new ECB(16, 25)),\r
414             new ECBlocks(30, new ECB(30, 16),\r
415                 new ECB(2, 17))),\r
416         new Version(25, new int[]{6, 32, 58, 84, 110},\r
417             new ECBlocks(26, new ECB(8, 1061),\r
418                 new ECB(4, 107)),\r
419             new ECBlocks(28, new ECB(8, 47),\r
420                 new ECB(13, 48)),\r
421             new ECBlocks(30, new ECB(7, 24),\r
422                 new ECB(22, 25)),\r
423             new ECBlocks(30, new ECB(22, 15),\r
424                 new ECB(13, 16))),\r
425         new Version(26, new int[]{6, 30, 58, 86, 114},\r
426             new ECBlocks(28, new ECB(10, 114),\r
427                 new ECB(2, 115)),\r
428             new ECBlocks(28, new ECB(19, 46),\r
429                 new ECB(4, 47)),\r
430             new ECBlocks(28, new ECB(28, 22),\r
431                 new ECB(6, 23)),\r
432             new ECBlocks(30, new ECB(33, 16),\r
433                 new ECB(4, 17))),\r
434         new Version(27, new int[]{6, 34, 62, 90, 118},\r
435             new ECBlocks(30, new ECB(8, 122),\r
436                 new ECB(4, 123)),\r
437             new ECBlocks(28, new ECB(22, 45),\r
438                 new ECB(3, 46)),\r
439             new ECBlocks(30, new ECB(8, 23),\r
440                 new ECB(26, 24)),\r
441             new ECBlocks(30, new ECB(12, 15),\r
442                 new ECB(28, 16))),\r
443         new Version(28, new int[]{6, 26, 50, 74, 98, 122},\r
444             new ECBlocks(30, new ECB(3, 117),\r
445                 new ECB(10, 118)),\r
446             new ECBlocks(28, new ECB(3, 45),\r
447                 new ECB(23, 46)),\r
448             new ECBlocks(30, new ECB(4, 24),\r
449                 new ECB(31, 25)),\r
450             new ECBlocks(30, new ECB(11, 15),\r
451                 new ECB(31, 16))),\r
452         new Version(29, new int[]{6, 30, 54, 78, 102, 126},\r
453             new ECBlocks(30, new ECB(7, 116),\r
454                 new ECB(7, 117)),\r
455             new ECBlocks(28, new ECB(21, 45),\r
456                 new ECB(7, 46)),\r
457             new ECBlocks(30, new ECB(1, 23),\r
458                 new ECB(37, 24)),\r
459             new ECBlocks(30, new ECB(19, 15),\r
460                 new ECB(26, 16))),\r
461         new Version(30, new int[]{6, 26, 52, 78, 104, 130},\r
462             new ECBlocks(30, new ECB(5, 115),\r
463                 new ECB(10, 116)),\r
464             new ECBlocks(28, new ECB(19, 47),\r
465                 new ECB(10, 48)),\r
466             new ECBlocks(30, new ECB(15, 24),\r
467                 new ECB(25, 25)),\r
468             new ECBlocks(30, new ECB(23, 15),\r
469                 new ECB(25, 16))),\r
470         new Version(31, new int[]{6, 30, 56, 82, 108, 134},\r
471             new ECBlocks(30, new ECB(13, 115),\r
472                 new ECB(3, 116)),\r
473             new ECBlocks(28, new ECB(2, 46),\r
474                 new ECB(29, 47)),\r
475             new ECBlocks(30, new ECB(42, 24),\r
476                 new ECB(1, 25)),\r
477             new ECBlocks(30, new ECB(23, 15),\r
478                 new ECB(28, 16))),\r
479         new Version(32, new int[]{6, 34, 60, 86, 112, 138},\r
480             new ECBlocks(30, new ECB(17, 115)),\r
481             new ECBlocks(28, new ECB(10, 46),\r
482                 new ECB(23, 47)),\r
483             new ECBlocks(30, new ECB(10, 24),\r
484                 new ECB(35, 25)),\r
485             new ECBlocks(30, new ECB(19, 15),\r
486                 new ECB(35, 16))),\r
487         new Version(33, new int[]{6, 30, 58, 86, 114, 142},\r
488             new ECBlocks(30, new ECB(17, 115),\r
489                 new ECB(1, 116)),\r
490             new ECBlocks(28, new ECB(14, 46),\r
491                 new ECB(21, 47)),\r
492             new ECBlocks(30, new ECB(29, 24),\r
493                 new ECB(19, 25)),\r
494             new ECBlocks(30, new ECB(11, 15),\r
495                 new ECB(46, 16))),\r
496         new Version(34, new int[]{6, 34, 62, 90, 118, 146},\r
497             new ECBlocks(30, new ECB(13, 115),\r
498                 new ECB(6, 116)),\r
499             new ECBlocks(28, new ECB(14, 46),\r
500                 new ECB(23, 47)),\r
501             new ECBlocks(30, new ECB(44, 24),\r
502                 new ECB(7, 25)),\r
503             new ECBlocks(30, new ECB(59, 16),\r
504                 new ECB(1, 17))),\r
505         new Version(35, new int[]{6, 30, 54, 78, 102, 126, 150},\r
506             new ECBlocks(30, new ECB(12, 121),\r
507                 new ECB(7, 122)),\r
508             new ECBlocks(28, new ECB(12, 47),\r
509                 new ECB(26, 48)),\r
510             new ECBlocks(30, new ECB(39, 24),\r
511                 new ECB(14, 25)),\r
512             new ECBlocks(30, new ECB(22, 15),\r
513                 new ECB(41, 16))),\r
514         new Version(36, new int[]{6, 24, 50, 76, 102, 128, 154},\r
515             new ECBlocks(30, new ECB(6, 121),\r
516                 new ECB(14, 122)),\r
517             new ECBlocks(28, new ECB(6, 47),\r
518                 new ECB(34, 48)),\r
519             new ECBlocks(30, new ECB(46, 24),\r
520                 new ECB(10, 25)),\r
521             new ECBlocks(30, new ECB(2, 15),\r
522                 new ECB(64, 16))),\r
523         new Version(37, new int[]{6, 28, 54, 80, 106, 132, 158},\r
524             new ECBlocks(30, new ECB(17, 122),\r
525                 new ECB(4, 123)),\r
526             new ECBlocks(28, new ECB(29, 46),\r
527                 new ECB(14, 47)),\r
528             new ECBlocks(30, new ECB(49, 24),\r
529                 new ECB(10, 25)),\r
530             new ECBlocks(30, new ECB(24, 15),\r
531                 new ECB(46, 16))),\r
532         new Version(38, new int[]{6, 32, 58, 84, 110, 136, 162},\r
533             new ECBlocks(30, new ECB(4, 122),\r
534                 new ECB(18, 123)),\r
535             new ECBlocks(28, new ECB(13, 46),\r
536                 new ECB(32, 47)),\r
537             new ECBlocks(30, new ECB(48, 24),\r
538                 new ECB(14, 25)),\r
539             new ECBlocks(30, new ECB(42, 15),\r
540                 new ECB(32, 16))),\r
541         new Version(39, new int[]{6, 26, 54, 82, 110, 138, 166},\r
542             new ECBlocks(30, new ECB(20, 117),\r
543                 new ECB(4, 118)),\r
544             new ECBlocks(28, new ECB(40, 47),\r
545                 new ECB(7, 48)),\r
546             new ECBlocks(30, new ECB(43, 24),\r
547                 new ECB(22, 25)),\r
548             new ECBlocks(30, new ECB(10, 15),\r
549                 new ECB(67, 16))),\r
550         new Version(40, new int[]{6, 30, 58, 86, 114, 142, 170},\r
551             new ECBlocks(30, new ECB(19, 118),\r
552                 new ECB(6, 119)),\r
553             new ECBlocks(28, new ECB(18, 47),\r
554                 new ECB(31, 48)),\r
555             new ECBlocks(30, new ECB(34, 24),\r
556                 new ECB(34, 25)),\r
557             new ECBlocks(30, new ECB(20, 15),\r
558                 new ECB(61, 16)))\r
559     };\r
560   }\r
561 \r
562 }\r