sruly commited on
Commit
8932cec
·
verified ·
1 Parent(s): ce79d7b

Upload folder using huggingface_hub

Browse files
Files changed (12) hide show
  1. LICENSE +663 -0
  2. NOTICE +29 -0
  3. README.md +55 -0
  4. chess_model.py +256 -0
  5. config.json +17 -0
  6. legal_inference.py +66 -0
  7. metrics.json +12 -0
  8. model.safetensors +3 -0
  9. requirements.txt +2 -0
  10. special_tokens_map.json +5 -0
  11. tokenizer_config.json +7 -0
  12. vocab.json +2084 -0
LICENSE ADDED
@@ -0,0 +1,663 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ GNU AFFERO GENERAL PUBLIC LICENSE
2
+ Version 3, 19 November 2007
3
+
4
+ Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
5
+ Everyone is permitted to copy and distribute verbatim copies
6
+ of this license document, but changing it is not allowed.
7
+
8
+ Preamble
9
+
10
+ The GNU Affero General Public License is a free, copyleft license for
11
+ software and other kinds of works, specifically designed to ensure
12
+ cooperation with the community in the case of network server software.
13
+
14
+ The licenses for most software and other practical works are designed
15
+ to take away your freedom to share and change the works. By contrast,
16
+ our General Public Licenses are intended to guarantee your freedom to
17
+ share and change all versions of a program--to make sure it remains free
18
+ software for all its users.
19
+
20
+ When we speak of free software, we are referring to freedom, not
21
+ price. Our General Public Licenses are designed to make sure that you
22
+ have the freedom to distribute copies of free software (and charge for
23
+ them if you wish), that you receive source code or can get it if you
24
+ want it, that you can change the software or use pieces of it in new
25
+ free programs, and that you know you can do these things.
26
+
27
+ Developers that use our General Public Licenses protect your rights
28
+ with two steps: (1) assert copyright on the software, and (2) offer
29
+ you this License which gives you legal permission to copy, distribute
30
+ and/or modify the software.
31
+
32
+ A secondary benefit of defending all users' freedom is that
33
+ improvements made in alternate versions of the program, if they
34
+ receive widespread use, become available for other developers to
35
+ incorporate. Many developers of free software are heartened and
36
+ encouraged by the resulting cooperation. However, in the case of
37
+ software used on network servers, this result may fail to come about.
38
+ The GNU General Public License permits making a modified version and
39
+ letting the public access it on a server without ever releasing its
40
+ source code to the public.
41
+
42
+ The GNU Affero General Public License is designed specifically to
43
+ ensure that, in such cases, the modified source code becomes available
44
+ to the community. It requires the operator of a network server to
45
+ provide the source code of the modified version running there to the
46
+ users of that server. Therefore, public use of a modified version, on
47
+ a publicly accessible server, gives the public access to the source
48
+ code of the modified version.
49
+
50
+ An older license, called the Affero General Public License and
51
+ published by Affero, was designed to accomplish similar goals. This is
52
+ a different license, not a version of the Affero GPL, but Affero has
53
+ released a new version of the Affero GPL which permits relicensing under
54
+ this license.
55
+
56
+ The precise terms and conditions for copying, distribution and
57
+ modification follow.
58
+
59
+ TERMS AND CONDITIONS
60
+
61
+ 0. Definitions.
62
+
63
+ "This License" refers to version 3 of the GNU Affero General Public License.
64
+
65
+ "Copyright" also means copyright-like laws that apply to other kinds of
66
+ works, such as semiconductor masks.
67
+
68
+ "The Program" refers to any copyrightable work licensed under this
69
+ License. Each licensee is addressed as "you". "Licensees" and
70
+ "recipients" may be individuals or organizations.
71
+
72
+ To "modify" a work means to copy from or adapt all or part of the work
73
+ in a fashion requiring copyright permission, other than the making of an
74
+ exact copy. The resulting work is called a "modified version" of the
75
+ earlier work or a work "based on" the earlier work.
76
+
77
+ A "covered work" means either the unmodified Program or a work based
78
+ on the Program.
79
+
80
+ To "propagate" a work means to do anything with it that, without
81
+ permission, would make you directly or secondarily liable for
82
+ infringement under applicable copyright law, except executing it on a
83
+ computer or modifying a private copy. Propagation includes copying,
84
+ distribution (with or without modification), making available to the
85
+ public, and in some countries other activities as well.
86
+
87
+ To "convey" a work means any kind of propagation that enables other
88
+ parties to make or receive copies. Mere interaction with a user through
89
+ a computer network, with no transfer of a copy, is not conveying.
90
+
91
+ An interactive user interface displays "Appropriate Legal Notices"
92
+ to the extent that it includes a convenient and prominently visible
93
+ feature that (1) displays an appropriate copyright notice, and (2)
94
+ tells the user that there is no warranty for the work (except to the
95
+ extent that warranties are provided), that licensees may convey the
96
+ work under this License, and how to view a copy of this License. If
97
+ the interface presents a list of user commands or options, such as a
98
+ menu, a prominent item in the list meets this criterion.
99
+
100
+ 1. Source Code.
101
+
102
+ The "source code" for a work means the preferred form of the work
103
+ for making modifications to it. "Object code" means any non-source
104
+ form of a work.
105
+
106
+ A "Standard Interface" means an interface that either is an official
107
+ standard defined by a recognized standards body, or, in the case of
108
+ interfaces specified for a particular programming language, one that
109
+ is widely used among developers working in that language.
110
+
111
+ The "System Libraries" of an executable work include anything, other
112
+ than the work as a whole, that (a) is included in the normal form of
113
+ packaging a Major Component, but which is not part of that Major
114
+ Component, and (b) serves only to enable use of the work with that
115
+ Major Component, or to implement a Standard Interface for which an
116
+ implementation is available to the public in source code form. A
117
+ "Major Component", in this context, means a major essential component
118
+ (kernel, window system, and so on) of the specific operating system
119
+ (if any) on which the executable work runs, or a compiler used to
120
+ produce the work, or an object code interpreter used to run it.
121
+
122
+ The "Corresponding Source" for a work in object code form means all
123
+ the source code needed to generate, install, and (for an executable
124
+ work) run the object code and to modify the work, including scripts to
125
+ control those activities. However, it does not include the work's
126
+ System Libraries, or general-purpose tools or generally available free
127
+ programs which are used unmodified in performing those activities but
128
+ which are not part of the work. For example, Corresponding Source
129
+ includes interface definition files associated with source files for
130
+ the work, and the source code for shared libraries and dynamically
131
+ linked subprograms that the work is specifically designed to require,
132
+ such as by intimate data communication or control flow between those
133
+ subprograms and other parts of the work.
134
+
135
+ The Corresponding Source need not include anything that users
136
+ can regenerate automatically from other parts of the Corresponding
137
+ Source.
138
+
139
+ The Corresponding Source for a work in source code form is that
140
+ same work.
141
+
142
+ 2. Basic Permissions.
143
+
144
+ All rights granted under this License are granted for the term of
145
+ copyright on the Program, and are irrevocable provided the stated
146
+ conditions are met. This License explicitly affirms your unlimited
147
+ permission to run the unmodified Program. The output from running a
148
+ covered work is covered by this License only if the output, given its
149
+ content, constitutes a covered work. This License acknowledges your
150
+ rights of fair use or other equivalent, as provided by copyright law.
151
+
152
+ You may make, run and propagate covered works that you do not
153
+ convey, without conditions so long as your license otherwise remains
154
+ in force. You may convey covered works to others for the sole purpose
155
+ of having them make modifications exclusively for you, or provide you
156
+ with facilities for running those works, provided that you comply with
157
+ the terms of this License in conveying all material for which you do
158
+ not control copyright. Those thus making or running the covered works
159
+ for you must do so exclusively on your behalf, under your direction
160
+ and control, on terms that prohibit them from making any copies of
161
+ your copyrighted material outside their relationship with you.
162
+
163
+ Conveying under any other circumstances is permitted solely under
164
+ the conditions stated below. Sublicensing is not allowed; section 10
165
+ makes it unnecessary.
166
+
167
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
168
+
169
+ No covered work shall be deemed part of an effective technological
170
+ measure under any applicable law fulfilling obligations under article
171
+ 11 of the WIPO copyright treaty adopted on 20 December 1996, or
172
+ similar laws prohibiting or restricting circumvention of such
173
+ measures.
174
+
175
+ When you convey a covered work, you waive any legal power to forbid
176
+ circumvention of technological measures to the extent such circumvention
177
+ is effected by exercising rights under this License with respect to
178
+ the covered work, and you disclaim any intention to limit operation or
179
+ modification of the work as a means of enforcing, against the work's
180
+ users, your or third parties' legal rights to forbid circumvention of
181
+ technological measures.
182
+
183
+ 4. Conveying Verbatim Copies.
184
+
185
+ You may convey verbatim copies of the Program's source code as you
186
+ receive it, in any medium, provided that you conspicuously and
187
+ appropriately publish on each copy an appropriate copyright notice;
188
+ keep intact all notices stating that this License and any
189
+ non-permissive terms added in accord with section 7 apply to the code;
190
+ keep intact all notices of the absence of any warranty; and give all
191
+ recipients a copy of this License along with the Program.
192
+
193
+ You may charge any price or no price for each copy that you convey,
194
+ and you may offer support or warranty protection for a fee.
195
+
196
+ 5. Conveying Modified Source Versions.
197
+
198
+ You may convey a work based on the Program, or the modifications to
199
+ produce it from the Program, in the form of source code under the
200
+ terms of section 4, provided that you also meet all of these conditions:
201
+
202
+ a) The work must carry prominent notices stating that you modified
203
+ it, and giving a relevant date.
204
+
205
+ b) The work must carry prominent notices stating that it is
206
+ released under this License and any conditions added under section
207
+ 7. This requirement modifies the requirement in section 4 to
208
+ "keep intact all notices".
209
+
210
+ c) You must license the entire work, as a whole, under this
211
+ License to anyone who comes into possession of a copy. This
212
+ License will therefore apply, along with any applicable section 7
213
+ additional terms, to the whole of the work, and all its parts,
214
+ regardless of how they are packaged. This License gives no
215
+ permission to license the work in any other way, but it does not
216
+ invalidate such permission if you have separately received it.
217
+
218
+ d) If the work has interactive user interfaces, each must display
219
+ Appropriate Legal Notices; however, if the Program has interactive
220
+ interfaces that do not display Appropriate Legal Notices, your
221
+ work need not make them do so.
222
+
223
+ A compilation of a covered work with other separate and independent
224
+ works, which are not by their nature extensions of the covered work,
225
+ and which are not combined with it such as to form a larger program,
226
+ in or on a volume of a storage or distribution medium, is called an
227
+ "aggregate" if the compilation and its resulting copyright are not
228
+ used to limit the access or legal rights of the compilation's users
229
+ beyond what the individual works permit. Inclusion of a covered work
230
+ in an aggregate does not cause this License to apply to the other
231
+ parts of the aggregate.
232
+
233
+ 6. Conveying Non-Source Forms.
234
+
235
+ You may convey a covered work in object code form under the terms
236
+ of sections 4 and 5, provided that you also convey the
237
+ machine-readable Corresponding Source under the terms of this License,
238
+ in one of these ways:
239
+
240
+ a) Convey the object code in, or embodied in, a physical product
241
+ (including a physical distribution medium), accompanied by the
242
+ Corresponding Source fixed on a durable physical medium
243
+ customarily used for software interchange.
244
+
245
+ b) Convey the object code in, or embodied in, a physical product
246
+ (including a physical distribution medium), accompanied by a
247
+ written offer, valid for at least three years and valid for as
248
+ long as you offer spare parts or customer support for that product
249
+ model, to give anyone who possesses the object code either (1) a
250
+ copy of the Corresponding Source for all the software in the
251
+ product that is covered by this License, on a durable physical
252
+ medium customarily used for software interchange, for a price no
253
+ more than your reasonable cost of physically performing this
254
+ conveying of source, or (2) access to copy the
255
+ Corresponding Source from a network server at no charge.
256
+
257
+ c) Convey individual copies of the object code with a copy of the
258
+ written offer to provide the Corresponding Source. This
259
+ alternative is allowed only occasionally and noncommercially, and
260
+ only if you received the object code with such an offer, in accord
261
+ with subsection 6b.
262
+
263
+ d) Convey the object code by offering access from a designated
264
+ place (gratis or for a charge), and offer equivalent access to the
265
+ Corresponding Source in the same way through the same place at no
266
+ further charge. You need not require recipients to copy the
267
+ Corresponding Source along with the object code. If the place to
268
+ copy the object code is a network server, the Corresponding Source
269
+ may be on a different server (operated by you or a third party)
270
+ that supports equivalent copying facilities, provided you maintain
271
+ clear directions next to the object code saying where to find the
272
+ Corresponding Source. Regardless of what server hosts the
273
+ Corresponding Source, you remain obligated to ensure that it is
274
+ available for as long as needed to satisfy these requirements.
275
+
276
+ e) Convey the object code using peer-to-peer transmission, provided
277
+ you inform other peers where the object code and Corresponding
278
+ Source of the work are being offered to the general public at no
279
+ charge under subsection 6d.
280
+
281
+ A separable portion of the object code, whose source code is excluded
282
+ from the Corresponding Source as a System Library, need not be
283
+ included in conveying the object code work.
284
+
285
+ A "User Product" is either (1) a "consumer product", which means any
286
+ tangible personal property which is normally used for personal, family,
287
+ or household purposes, or (2) anything designed or sold for incorporation
288
+ into a dwelling. In determining whether a product is a consumer product,
289
+ doubtful cases shall be resolved in favor of coverage. For a particular
290
+ product received by a particular user, "normally used" refers to a
291
+ typical or common use of that class of product, regardless of the status
292
+ of the particular user or of the way in which the particular user
293
+ actually uses, or expects or is expected to use, the product. A product
294
+ is a consumer product regardless of whether the product has substantial
295
+ commercial, industrial or non-consumer uses, unless such uses represent
296
+ the only significant mode of use of the product.
297
+
298
+ "Installation Information" for a User Product means any methods,
299
+ procedures, authorization keys, or other information required to install
300
+ and execute modified versions of a covered work in that User Product from
301
+ a modified version of its Corresponding Source. The information must
302
+ suffice to ensure that the continued functioning of the modified object
303
+ code is in no case prevented or interfered with solely because
304
+ modification has been made.
305
+
306
+ If you convey an object code work under this section in, or with, or
307
+ specifically for use in, a User Product, and the conveying occurs as
308
+ part of a transaction in which the right of possession and use of the
309
+ User Product is transferred to the recipient in perpetuity or for a
310
+ fixed term (regardless of how the transaction is characterized), the
311
+ Corresponding Source conveyed under this section must be accompanied
312
+ by the Installation Information. But this requirement does not apply
313
+ if neither you nor any third party retains the ability to install
314
+ modified object code on the User Product (for example, the work has
315
+ been installed in ROM).
316
+
317
+ The requirement to provide Installation Information does not include a
318
+ requirement to continue to provide support service, warranty, or updates
319
+ for a work that has been modified or installed by the recipient, or for
320
+ the User Product in which it has been modified or installed. Access to a
321
+ network may be denied when the modification itself materially and
322
+ adversely affects the operation of the network or violates the rules and
323
+ protocols for communication across the network.
324
+
325
+ Corresponding Source conveyed, and Installation Information provided,
326
+ in accord with this section must be in a format that is publicly
327
+ documented (and with an implementation available to the public in
328
+ source code form), and must require no special password or key for
329
+ unpacking, reading or copying.
330
+
331
+ 7. Additional Terms.
332
+
333
+ "Additional permissions" are terms that supplement the terms of this
334
+ License by making exceptions from one or more of its conditions.
335
+ Additional permissions that are applicable to the entire Program shall
336
+ be treated as though they were included in this License, to the extent
337
+ that they are valid under applicable law. If additional permissions
338
+ apply only to part of the Program, that part may be used separately
339
+ under those permissions, but the entire Program remains governed by
340
+ this License without regard to the additional permissions.
341
+
342
+ When you convey a copy of a covered work, you may at your option
343
+ remove any additional permissions from that copy, or from any part of
344
+ it. (Additional permissions may be written to require their own
345
+ removal in certain cases when you modify the work.) You may place
346
+ additional permissions on material, added by you to a covered work,
347
+ for which you have or can give appropriate copyright permission.
348
+
349
+ Notwithstanding any other provision of this License, for material you
350
+ add to a covered work, you may (if authorized by the copyright holders of
351
+ that material) supplement the terms of this License with terms:
352
+
353
+ a) Disclaiming warranty or limiting liability differently from the
354
+ terms of sections 15 and 16 of this License; or
355
+
356
+ b) Requiring preservation of specified reasonable legal notices or
357
+ author attributions in that material or in the Appropriate Legal
358
+ Notices displayed by works containing it; or
359
+
360
+ c) Prohibiting misrepresentation of the origin of that material, or
361
+ requiring that modified versions of such material be marked in
362
+ reasonable ways as different from the original version; or
363
+
364
+ d) Limiting the use for publicity purposes of names of licensors or
365
+ authors of the material; or
366
+
367
+ e) Declining to grant rights under trademark law for use of some
368
+ trade names, trademarks, or service marks; or
369
+
370
+ f) Requiring indemnification of licensors and authors of that
371
+ material by anyone who conveys the material (or modified versions of
372
+ it) with contractual assumptions of liability to the recipient, for
373
+ any liability that these contractual assumptions directly impose on
374
+ those licensors and authors.
375
+
376
+ All other non-permissive additional terms are considered "further
377
+ restrictions" within the meaning of section 10. If the Program as you
378
+ received it, or any part of it, contains a notice stating that it is
379
+ governed by this License along with a term that is a further
380
+ restriction, you may remove that term. If a license document contains
381
+ a further restriction but permits relicensing or conveying under this
382
+ License, you may add to a covered work material governed by the terms
383
+ of that license document, provided that the further restriction does
384
+ not survive such relicensing or conveying.
385
+
386
+ If you add terms to a covered work in accord with this section, you
387
+ must place, in the relevant source files, a statement of the
388
+ additional terms that apply to those files, or a notice indicating
389
+ where to find the applicable terms.
390
+
391
+ Additional terms, permissive or non-permissive, may be stated in the
392
+ form of a separately written license, or stated as exceptions;
393
+ the above requirements apply either way.
394
+
395
+ 8. Termination.
396
+
397
+ You may not propagate or modify a covered work except as expressly
398
+ provided under this License. Any attempt otherwise to propagate or
399
+ modify it is void, and will automatically terminate your rights under
400
+ this License (including any patent licenses granted under the third
401
+ paragraph of section 11).
402
+
403
+ However, if you cease all violation of this License, then your
404
+ license from a particular copyright holder is reinstated (a)
405
+ provisionally, unless and until the copyright holder explicitly and
406
+ finally terminates your license, and (b) permanently, if the copyright
407
+ holder fails to notify you of the violation by some reasonable means
408
+ prior to 60 days after the cessation.
409
+
410
+ Moreover, your license from a particular copyright holder is
411
+ reinstated permanently if the copyright holder notifies you of the
412
+ violation by some reasonable means, this is the first time you have
413
+ received notice of violation of this License (for any work) from that
414
+ copyright holder, and you cure the violation prior to 30 days after
415
+ your receipt of the notice.
416
+
417
+ Termination of your rights under this section does not terminate the
418
+ licenses of parties who have received copies or rights from you under
419
+ this License. If your rights have been terminated and not permanently
420
+ reinstated, you do not qualify to receive new licenses for the same
421
+ material under section 10.
422
+
423
+ 9. Acceptance Not Required for Having Copies.
424
+
425
+ You are not required to accept this License in order to receive or
426
+ run a copy of the Program. Ancillary propagation of a covered work
427
+ occurring solely as a consequence of using peer-to-peer transmission
428
+ to receive a copy likewise does not require acceptance. However,
429
+ nothing other than this License grants you permission to propagate or
430
+ modify any covered work. These actions infringe copyright if you do
431
+ not accept this License. Therefore, by modifying or propagating a
432
+ covered work, you indicate your acceptance of this License to do so.
433
+
434
+ 10. Automatic Licensing of Downstream Recipients.
435
+
436
+ Each time you convey a covered work, the recipient automatically
437
+ receives a license from the original licensors, to run, modify and
438
+ propagate that work, subject to this License. You are not responsible
439
+ for enforcing compliance by third parties with this License.
440
+
441
+ An "entity transaction" is a transaction transferring control of an
442
+ organization, or substantially all assets of one, or subdividing an
443
+ organization, or merging organizations. If propagation of a covered
444
+ work results from an entity transaction, each party to that
445
+ transaction who receives a copy of the work also receives whatever
446
+ licenses to the work the party's predecessor in interest had or could
447
+ give under the previous paragraph, plus a right to possession of the
448
+ Corresponding Source of the work from the predecessor in interest, if
449
+ the predecessor has it or can get it with reasonable efforts.
450
+
451
+ You may not impose any further restrictions on the exercise of the
452
+ rights granted or affirmed under this License. For example, you may
453
+ not impose a license fee, royalty, or other charge for exercise of
454
+ rights granted under this License, and you may not initiate litigation
455
+ (including a cross-claim or counterclaim in a lawsuit) alleging that
456
+ any patent claim is infringed by making, using, selling, offering for
457
+ sale, or importing the Program or any portion of it.
458
+
459
+ 11. Patents.
460
+
461
+ A "contributor" is a copyright holder who authorizes use under this
462
+ License of the Program or a work on which the Program is based. The
463
+ work thus licensed is called the contributor's "contributor version".
464
+
465
+ A contributor's "essential patent claims" are all patent claims
466
+ owned or controlled by the contributor, whether already acquired or
467
+ hereafter acquired, that would be infringed by some manner, permitted
468
+ by this License, of making, using, or selling its contributor version,
469
+ but do not include claims that would be infringed only as a
470
+ consequence of further modification of the contributor version. For
471
+ purposes of this definition, "control" includes the right to grant
472
+ patent sublicenses in a manner consistent with the requirements of
473
+ this License.
474
+
475
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
476
+ patent license under the contributor's essential patent claims, to
477
+ make, use, sell, offer for sale, import and otherwise run, modify and
478
+ propagate the contents of its contributor version.
479
+
480
+ In the following three paragraphs, a "patent license" is any express
481
+ agreement or commitment, however denominated, not to enforce a patent
482
+ (such as an express permission to practice a patent or covenant not to
483
+ sue for patent infringement). To "grant" such a patent license to a
484
+ party means to make such an agreement or commitment not to enforce a
485
+ patent against the party.
486
+
487
+ If you convey a covered work, knowingly relying on a patent license,
488
+ and the Corresponding Source of the work is not available for anyone
489
+ to copy, free of charge and under the terms of this License, through a
490
+ publicly available network server or other readily accessible means,
491
+ then you must either (1) cause the Corresponding Source to be so
492
+ available, or (2) arrange to deprive yourself of the benefit of the
493
+ patent license for this particular work, or (3) arrange, in a manner
494
+ consistent with the requirements of this License, to extend the patent
495
+ license to downstream recipients. "Knowingly relying" means you have
496
+ actual knowledge that, but for the patent license, your conveying the
497
+ covered work in a country, or your recipient's use of the covered work
498
+ in a country, would infringe one or more identifiable patents in that
499
+ country that you have reason to believe are valid.
500
+
501
+ If, pursuant to or in connection with a single transaction or
502
+ arrangement, you convey, or propagate by procuring conveyance of, a
503
+ covered work, and grant a patent license to some of the parties
504
+ receiving the covered work authorizing them to use, propagate, modify
505
+ or convey a specific copy of the covered work, then the patent license
506
+ you grant is automatically extended to all recipients of the covered
507
+ work and works based on it.
508
+
509
+ A patent license is "discriminatory" if it does not include within
510
+ the scope of its coverage, prohibits the exercise of, or is
511
+ conditioned on the non-exercise of one or more of the rights that are
512
+ specifically granted under this License. You may not convey a covered
513
+ work if you are a party to an arrangement with a third party that is
514
+ in the business of distributing software, under which you make payment
515
+ to the third party based on the extent of your activity of conveying
516
+ the work, and under which the third party grants, to any of the
517
+ parties who would receive the covered work from you, a discriminatory
518
+ patent license (a) in connection with copies of the covered work
519
+ conveyed by you (or copies made from those copies), or (b) primarily
520
+ for and in connection with specific products or compilations that
521
+ contain the covered work, unless you entered into that arrangement,
522
+ or that patent license was granted, prior to 28 March 2007.
523
+
524
+ Nothing in this License shall be construed as excluding or limiting
525
+ any implied license or other defenses to infringement that may
526
+ otherwise be available to you under applicable patent law.
527
+
528
+ 12. No Surrender of Others' Freedom.
529
+
530
+ If conditions are imposed on you (whether by court order, agreement or
531
+ otherwise) that contradict the conditions of this License, they do not
532
+ excuse you from the conditions of this License. If you cannot convey a
533
+ covered work so as to satisfy simultaneously your obligations under this
534
+ License and any other pertinent obligations, then as a consequence you may
535
+ not convey it at all. For example, if you agree to terms that obligate you
536
+ to collect a royalty for further conveying from those to whom you convey
537
+ the Program, the only way you could satisfy both those terms and this
538
+ License would be to refrain entirely from conveying the Program.
539
+
540
+ 13. Remote Network Interaction; Use with the GNU General Public License.
541
+
542
+ Notwithstanding any other provision of this License, if you modify the
543
+ Program, your modified version must prominently offer all users
544
+ interacting with it remotely through a computer network (if your version
545
+ supports such interaction) an opportunity to receive the Corresponding
546
+ Source of your version by providing access to the Corresponding Source
547
+ from a network server at no charge, through some standard or customary
548
+ means of facilitating copying of software. This Corresponding Source
549
+ shall include the Corresponding Source for any work covered by version 3
550
+ of the GNU General Public License that is incorporated pursuant to the
551
+ following paragraph.
552
+
553
+ Notwithstanding any other provision of this License, you have
554
+ permission to link or combine any covered work with a work licensed
555
+ under version 3 of the GNU General Public License into a single
556
+ combined work, and to convey the resulting work. The terms of this
557
+ License will continue to apply to the part which is the covered work,
558
+ but the work with which it is combined will remain governed by version
559
+ 3 of the GNU General Public License.
560
+
561
+ 14. Revised Versions of this License.
562
+
563
+ The Free Software Foundation may publish revised and/or new versions of
564
+ the GNU Affero General Public License from time to time. Such new versions
565
+ will be similar in spirit to the present version, but may differ in detail to
566
+ address new problems or concerns.
567
+
568
+ Each version is given a distinguishing version number. If the
569
+ Program specifies that a certain numbered version of the GNU Affero General
570
+ Public License "or any later version" applies to it, you have the
571
+ option of following the terms and conditions either of that numbered
572
+ version or of any later version published by the Free Software
573
+ Foundation. If the Program does not specify a version number of the
574
+ GNU Affero General Public License, you may choose any version ever published
575
+ by the Free Software Foundation.
576
+
577
+ If the Program specifies that a proxy can decide which future
578
+ versions of the GNU Affero General Public License can be used, that proxy's
579
+ public statement of acceptance of a version permanently authorizes you
580
+ to choose that version for the Program.
581
+
582
+ Later license versions may give you additional or different
583
+ permissions. However, no additional obligations are imposed on any
584
+ author or copyright holder as a result of your choosing to follow a
585
+ later version.
586
+
587
+ 15. Disclaimer of Warranty.
588
+
589
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
590
+ APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
591
+ HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
592
+ OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
593
+ THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
594
+ PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
595
+ IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
596
+ ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
597
+
598
+ 16. Limitation of Liability.
599
+
600
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
601
+ WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
602
+ THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
603
+ GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
604
+ USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
605
+ DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
606
+ PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
607
+ EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
608
+ SUCH DAMAGES.
609
+
610
+ 17. Interpretation of Sections 15 and 16.
611
+
612
+ If the disclaimer of warranty and limitation of liability provided
613
+ above cannot be given local legal effect according to their terms,
614
+ reviewing courts shall apply local law that most closely approximates
615
+ an absolute waiver of all civil liability in connection with the
616
+ Program, unless a warranty or assumption of liability accompanies a
617
+ copy of the Program in return for a fee.
618
+
619
+ END OF TERMS AND CONDITIONS
620
+
621
+ How to Apply These Terms to Your New Programs
622
+
623
+ If you develop a new program, and you want it to be of the greatest
624
+ possible use to the public, the best way to achieve this is to make it
625
+ free software which everyone can redistribute and change under these terms.
626
+
627
+ To do so, attach the following notices to the program. It is safest
628
+ to attach them to the start of each source file to most effectively
629
+ state the exclusion of warranty; and each file should have at least
630
+ the "copyright" line and a pointer to where the full notice is found.
631
+
632
+ <one line to give the program's name and a brief idea of what it does.>
633
+ Copyright (C) <year> <name of author>
634
+
635
+ This program is free software: you can redistribute it and/or modify
636
+ it under the terms of the GNU Affero General Public License as published by
637
+ the Free Software Foundation, either version 3 of the License, or
638
+ (at your option) any later version.
639
+
640
+ This program is distributed in the hope that it will be useful,
641
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
642
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
643
+ GNU Affero General Public License for more details.
644
+
645
+ You should have received a copy of the GNU Affero General Public License
646
+ along with this program. If not, see <https://www.gnu.org/licenses/>.
647
+
648
+ Also add information on how to contact you by electronic and paper mail.
649
+
650
+ If your software can interact with users remotely through a computer
651
+ network, you should also make sure that it provides a way for users to
652
+ get its source. For example, if your program is a web application, its
653
+ interface could display a "Source" link that leads users to an archive
654
+ of the code. There are many ways you could offer source, and different
655
+ solutions will be better for different programs; see section 13 for the
656
+ specific requirements.
657
+
658
+ You should also get your employer (if you work as a programmer) or school,
659
+ if any, to sign a "copyright disclaimer" for the program, if necessary.
660
+ For more information on this, and how to apply and follow the GNU AGPL, see
661
+ <https://www.gnu.org/licenses/>.
662
+
663
+
NOTICE ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Human Chess MLX
2
+ Copyright (c) 2026 Sruly Rosenblat
3
+
4
+ This project includes software derived from autoresearch and autoresearch-mlx.
5
+ The original software is provided under the following notice:
6
+
7
+ MIT License
8
+
9
+ Copyright (c) 2026 Andrej Karpathy
10
+ Copyright (c) 2026 Trevin Peterson
11
+
12
+ Permission is hereby granted, free of charge, to any person obtaining a copy
13
+ of this software and associated documentation files (the "Software"), to deal
14
+ in the Software without restriction, including without limitation the rights
15
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
16
+ copies of the Software, and to permit persons to whom the Software is
17
+ furnished to do so, subject to the following conditions:
18
+
19
+ The above copyright notice and this permission notice shall be included in all
20
+ copies or substantial portions of the Software.
21
+
22
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
23
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
25
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
26
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
27
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
28
+ SOFTWARE.
29
+
README.md ADDED
@@ -0,0 +1,55 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ license: agpl-3.0
3
+ library_name: mlx
4
+ pipeline_tag: text-generation
5
+ tags:
6
+ - chess
7
+ - mlx
8
+ - autoregressive
9
+ - custom-code
10
+ datasets:
11
+ - Lichess/chess-games
12
+ ---
13
+
14
+ # Human Chess MLX
15
+
16
+ An autoregressive MLX model trained on complete human chess-game histories. Moves are atomic UCI tokens. Metadata and padding may be input context, but training and validation loss are calculated only for human move targets.
17
+
18
+ The checkpoint was trained on 27,971,437 chronological January 2025 Lichess games (45.6% of one shuffled epoch). Lichess database exports are CC0.
19
+
20
+ ## Configuration
21
+
22
+ - Context length: `256` tokens
23
+ - Vocabulary size: `2075`
24
+ - Transformer layers: `6`
25
+ - Embedding width: `384`
26
+ - Validation bits per human move: `4.098970`
27
+ - Out-of-time test bits per human move: `4.114732`
28
+ - Raw exact next-move accuracy: `27.68%`
29
+ - Raw top-1 legal-move rate: `87.29%`
30
+ - Legal-masked top-1 accuracy: `30.97%`
31
+ - Legal-masked top-5 accuracy: `66.82%`
32
+
33
+ Metrics use fixed 8,192-game chronological holdouts. The test split was evaluated only after training stopped.
34
+
35
+ ## Loading
36
+
37
+ ```python
38
+ import mlx.core as mx
39
+ from chess_model import ChessTokenizer, load_model
40
+
41
+ model = load_model(".")
42
+ tokenizer = ChessTokenizer.from_pretrained(".")
43
+ tokens = mx.array([tokenizer.encode_tokens(["BOS"])])
44
+ logits = model(tokens)
45
+ ```
46
+
47
+ This is a custom MLX architecture, not a Transformers `AutoModelForCausalLM` checkpoint. The repository includes `chess_model.py` for loading.
48
+
49
+ Legal-move-masked inference is available through `legal_inference.py`; it reconstructs the board from the full supplied move history before scoring only legal continuations.
50
+
51
+ Source code: https://github.com/SrulyRosenblat/human-chess-mlx
52
+
53
+ ## License
54
+
55
+ AGPL-3.0. See `LICENSE`.
chess_model.py ADDED
@@ -0,0 +1,256 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Standalone MLX model definition shipped with checkpoints."""
2
+
3
+ import math
4
+ from dataclasses import dataclass
5
+
6
+ import mlx.core as mx
7
+ import mlx.nn as nn
8
+ from mlx.utils import tree_flatten
9
+
10
+
11
+ @dataclass
12
+ class GPTConfig:
13
+ sequence_len: int = 256
14
+ vocab_size: int = 2075
15
+ n_layer: int = 4
16
+ n_head: int = 2
17
+ n_kv_head: int = 2
18
+ n_embd: int = 256
19
+ window_pattern: str = "SSSL"
20
+
21
+
22
+ class ChessTokenizer:
23
+ """Minimal exact-token tokenizer for metadata and atomic UCI move tokens."""
24
+
25
+ def __init__(self, vocabulary):
26
+ self.id_to_token = vocabulary["id_to_token"]
27
+ self.token_to_id = {token: index for index, token in enumerate(self.id_to_token)}
28
+ self.pad_token_id = self.token_to_id["PAD"]
29
+ self.bos_token_id = self.token_to_id["BOS"]
30
+ self.eos_token_id = self.token_to_id["EOS"]
31
+
32
+ @classmethod
33
+ def from_pretrained(cls, checkpoint_dir):
34
+ import json
35
+ from pathlib import Path
36
+
37
+ vocabulary = json.loads((Path(checkpoint_dir) / "vocab.json").read_text())
38
+ return cls(vocabulary)
39
+
40
+ def encode_tokens(self, tokens):
41
+ return [self.token_to_id[token] for token in tokens]
42
+
43
+ def decode_ids(self, token_ids):
44
+ return [self.id_to_token[int(token_id)] for token_id in token_ids]
45
+
46
+
47
+ def norm(x):
48
+ return x * mx.rsqrt(mx.mean(x * x, axis=-1, keepdims=True) + 1e-5)
49
+
50
+
51
+ def has_ve(layer_idx, n_layer):
52
+ return layer_idx % 2 == (n_layer - 1) % 2
53
+
54
+
55
+ def create_additive_causal_mask(seq_len, dtype=mx.float32):
56
+ indices = mx.arange(seq_len)
57
+ blocked = indices[None, :] > indices[:, None]
58
+ return mx.where(blocked, mx.array(float("-inf"), dtype=dtype), mx.array(0.0, dtype=dtype))
59
+
60
+
61
+ def create_sliding_window_mask(seq_len, window_size, dtype=mx.float32):
62
+ indices = mx.arange(seq_len)
63
+ causal = indices[None, :] > indices[:, None]
64
+ too_far = (indices[:, None] - indices[None, :]) >= window_size
65
+ blocked = causal | too_far
66
+ return mx.where(blocked, mx.array(float("-inf"), dtype=dtype), mx.array(0.0, dtype=dtype))
67
+
68
+
69
+ class CausalSelfAttention(nn.Module):
70
+ def __init__(self, config, layer_idx):
71
+ super().__init__()
72
+ self.n_head = config.n_head
73
+ self.n_kv_head = config.n_kv_head
74
+ self.n_embd = config.n_embd
75
+ self.head_dim = self.n_embd // self.n_head
76
+ assert self.n_embd % self.n_head == 0
77
+ assert self.n_kv_head <= self.n_head and self.n_head % self.n_kv_head == 0
78
+ self.c_q = nn.Linear(self.n_embd, self.n_head * self.head_dim, bias=False)
79
+ self.c_k = nn.Linear(self.n_embd, self.n_kv_head * self.head_dim, bias=False)
80
+ self.c_v = nn.Linear(self.n_embd, self.n_kv_head * self.head_dim, bias=False)
81
+ self.c_proj = nn.Linear(self.n_embd, self.n_embd, bias=False)
82
+ self.ve_gate_channels = 32
83
+ self.ve_gate = (
84
+ nn.Linear(self.ve_gate_channels, self.n_kv_head, bias=False)
85
+ if has_ve(layer_idx, config.n_layer)
86
+ else None
87
+ )
88
+ self.rope = nn.RoPE(self.head_dim, traditional=True, base=10000)
89
+
90
+ def __call__(self, x, ve, mask):
91
+ batch_size, seq_len, _ = x.shape
92
+ q = self.c_q(x).reshape(batch_size, seq_len, self.n_head, self.head_dim)
93
+ k = self.c_k(x).reshape(batch_size, seq_len, self.n_kv_head, self.head_dim)
94
+ v = self.c_v(x).reshape(batch_size, seq_len, self.n_kv_head, self.head_dim)
95
+
96
+ if ve is not None and self.ve_gate is not None:
97
+ ve = ve.reshape(batch_size, seq_len, self.n_kv_head, self.head_dim)
98
+ gate = 2 * mx.sigmoid(self.ve_gate(x[..., : self.ve_gate_channels]))
99
+ v = v + mx.expand_dims(gate, axis=-1) * ve
100
+
101
+ q = q.transpose(0, 2, 1, 3)
102
+ k = k.transpose(0, 2, 1, 3)
103
+ v = v.transpose(0, 2, 1, 3)
104
+ q = norm(self.rope(q))
105
+ k = norm(self.rope(k))
106
+ scale = 1.0 / math.sqrt(self.head_dim)
107
+ y = mx.fast.scaled_dot_product_attention(q, k, v, scale=scale, mask=mask)
108
+ y = y.transpose(0, 2, 1, 3).reshape(batch_size, seq_len, -1)
109
+ return self.c_proj(y)
110
+
111
+
112
+ class MLP(nn.Module):
113
+ def __init__(self, config):
114
+ super().__init__()
115
+ self.c_fc = nn.Linear(config.n_embd, 4 * config.n_embd, bias=False)
116
+ self.c_proj = nn.Linear(4 * config.n_embd, config.n_embd, bias=False)
117
+
118
+ def __call__(self, x):
119
+ x = self.c_fc(x)
120
+ x = mx.maximum(x, 0) ** 2
121
+ return self.c_proj(x)
122
+
123
+
124
+ class Block(nn.Module):
125
+ def __init__(self, config, layer_idx):
126
+ super().__init__()
127
+ self.attn = CausalSelfAttention(config, layer_idx)
128
+ self.mlp = MLP(config)
129
+
130
+ def __call__(self, x, ve, mask):
131
+ x = x + self.attn(norm(x), ve, mask)
132
+ x = x + self.mlp(norm(x))
133
+ return x
134
+
135
+
136
+ class GPT(nn.Module):
137
+ def __init__(self, config):
138
+ super().__init__()
139
+ self.config = config
140
+ self.window_sizes = self._compute_window_sizes(config)
141
+ self.wte = nn.Embedding(config.vocab_size, config.n_embd)
142
+ self.blocks = [Block(config, i) for i in range(config.n_layer)]
143
+ self.lm_head = nn.Linear(config.n_embd, config.vocab_size, bias=False)
144
+ self.resid_lambdas = mx.ones((config.n_layer,), dtype=mx.float32)
145
+ self.x0_lambdas = mx.zeros((config.n_layer,), dtype=mx.float32)
146
+ head_dim = config.n_embd // config.n_head
147
+ kv_dim = config.n_kv_head * head_dim
148
+ self.value_embeds = {
149
+ str(i): nn.Embedding(config.vocab_size, kv_dim)
150
+ for i in range(config.n_layer)
151
+ if has_ve(i, config.n_layer)
152
+ }
153
+ self._mask_cache = {}
154
+
155
+ def init_weights(self):
156
+ n_embd = self.config.n_embd
157
+ scale = 3**0.5 * n_embd**-0.5
158
+ self.wte.weight = mx.random.normal(self.wte.weight.shape).astype(mx.bfloat16)
159
+ self.lm_head.weight = (mx.random.normal(self.lm_head.weight.shape) * 0.001).astype(mx.bfloat16)
160
+ for block in self.blocks:
161
+ block.attn.c_q.weight = mx.random.uniform(-scale, scale, block.attn.c_q.weight.shape).astype(mx.bfloat16)
162
+ block.attn.c_k.weight = mx.random.uniform(-scale, scale, block.attn.c_k.weight.shape).astype(mx.bfloat16)
163
+ block.attn.c_v.weight = mx.random.uniform(-scale, scale, block.attn.c_v.weight.shape).astype(mx.bfloat16)
164
+ block.attn.c_proj.weight = mx.zeros_like(block.attn.c_proj.weight).astype(mx.bfloat16)
165
+ block.mlp.c_fc.weight = mx.random.uniform(-scale, scale, block.mlp.c_fc.weight.shape).astype(mx.bfloat16)
166
+ block.mlp.c_proj.weight = mx.zeros_like(block.mlp.c_proj.weight).astype(mx.bfloat16)
167
+ if block.attn.ve_gate is not None:
168
+ block.attn.ve_gate.weight = mx.zeros_like(block.attn.ve_gate.weight).astype(mx.bfloat16)
169
+ self.resid_lambdas = mx.ones((self.config.n_layer,), dtype=mx.float32)
170
+ self.x0_lambdas = mx.full((self.config.n_layer,), 0.1, dtype=mx.float32)
171
+ for ve in self.value_embeds.values():
172
+ ve.weight = mx.random.uniform(-scale, scale, ve.weight.shape).astype(mx.bfloat16)
173
+
174
+ def _compute_window_sizes(self, config):
175
+ pattern = config.window_pattern.upper()
176
+ assert all(char in "SL" for char in pattern)
177
+ mapping = {"L": config.sequence_len, "S": config.sequence_len // 2}
178
+ windows = [mapping[pattern[i % len(pattern)]] for i in range(config.n_layer)]
179
+ windows[-1] = config.sequence_len
180
+ return windows
181
+
182
+ def _get_masks(self, seq_len):
183
+ dtype = self.wte.weight.dtype
184
+ for window_size in set(self.window_sizes):
185
+ key = (seq_len, window_size, dtype)
186
+ if key not in self._mask_cache:
187
+ self._mask_cache[key] = (
188
+ create_additive_causal_mask(seq_len, dtype)
189
+ if window_size >= seq_len
190
+ else create_sliding_window_mask(seq_len, window_size, dtype)
191
+ )
192
+ return [self._mask_cache[(seq_len, size, dtype)] for size in self.window_sizes]
193
+
194
+ def __call__(self, idx, targets=None, reduction="mean"):
195
+ _, seq_len = idx.shape
196
+ masks = self._get_masks(seq_len)
197
+ x = norm(self.wte(idx))
198
+ x0 = x
199
+ for i, block in enumerate(self.blocks):
200
+ x = self.resid_lambdas[i].astype(x.dtype) * x + self.x0_lambdas[i].astype(x.dtype) * x0
201
+ ve = self.value_embeds[str(i)](idx) if str(i) in self.value_embeds else None
202
+ x = block(x, ve, masks[i])
203
+ logits = self.lm_head(norm(x)).astype(mx.float32)
204
+ logits = 15.0 * mx.tanh(logits / 15.0)
205
+ if targets is None:
206
+ return logits
207
+ valid = targets != -1
208
+ safe_targets = mx.where(valid, targets, mx.zeros_like(targets))
209
+ ce = nn.losses.cross_entropy(logits, safe_targets, reduction="none") * valid
210
+ if reduction == "none":
211
+ return ce
212
+ return mx.sum(ce) / mx.maximum(mx.sum(valid), 1)
213
+
214
+
215
+ def load_model(checkpoint_dir):
216
+ """Load a published MLX checkpoint and its configuration."""
217
+ import json
218
+ from pathlib import Path
219
+
220
+ checkpoint_dir = Path(checkpoint_dir)
221
+ raw = json.loads((checkpoint_dir / "config.json").read_text())
222
+ config = GPTConfig(**raw["model_config"])
223
+ model = GPT(config)
224
+ load_weights(model, checkpoint_dir / "model.safetensors")
225
+ mx.eval(model.parameters())
226
+ return model
227
+
228
+
229
+ def load_weights(model, weights_path):
230
+ """Load flattened weights without MLX confusing numeric dict keys for list indices."""
231
+ current = dict(tree_flatten(model.parameters()))
232
+ loaded = mx.load(str(weights_path))
233
+ if current.keys() != loaded.keys():
234
+ missing = sorted(current.keys() - loaded.keys())
235
+ extra = sorted(loaded.keys() - current.keys())
236
+ raise ValueError(f"Checkpoint key mismatch; missing={missing}, extra={extra}")
237
+ for path, value in loaded.items():
238
+ if current[path].shape != value.shape:
239
+ raise ValueError(f"Shape mismatch for {path}: {value.shape} != {current[path].shape}")
240
+ parts = path.split(".")
241
+ target = model
242
+ for part in parts[:-1]:
243
+ if isinstance(target, list):
244
+ target = target[int(part)]
245
+ elif isinstance(target, dict):
246
+ target = target[part]
247
+ else:
248
+ target = getattr(target, part)
249
+ final = parts[-1]
250
+ if isinstance(target, list):
251
+ target[int(final)] = value
252
+ elif isinstance(target, dict):
253
+ target[final] = value
254
+ else:
255
+ setattr(target, final, value)
256
+ return model
config.json ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "architectures": [
3
+ "GPT"
4
+ ],
5
+ "library_name": "mlx",
6
+ "model_config": {
7
+ "n_embd": 384,
8
+ "n_head": 3,
9
+ "n_kv_head": 3,
10
+ "n_layer": 6,
11
+ "sequence_len": 256,
12
+ "vocab_size": 2075,
13
+ "window_pattern": "SSSL"
14
+ },
15
+ "model_type": "human-chess-mlx",
16
+ "torch_dtype": "bfloat16"
17
+ }
legal_inference.py ADDED
@@ -0,0 +1,66 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Legal-move-masked inference for the published human-chess MLX model."""
2
+
3
+ import argparse
4
+ from pathlib import Path
5
+
6
+ import chess
7
+ import mlx.core as mx
8
+
9
+ from chess_model import ChessTokenizer, load_model
10
+
11
+
12
+ MOVE_VOCAB_SIZE = 1968
13
+
14
+
15
+ def board_from_history(tokenizer, token_ids):
16
+ """Reconstruct the exact board while ignoring metadata tokens."""
17
+ board = chess.Board()
18
+ move_start = len(tokenizer.id_to_token) - MOVE_VOCAB_SIZE
19
+ for token_id in token_ids:
20
+ if int(token_id) < move_start:
21
+ continue
22
+ move = chess.Move.from_uci(tokenizer.id_to_token[int(token_id)])
23
+ if move not in board.legal_moves:
24
+ raise ValueError(f"Illegal move in supplied history: {move.uci()}")
25
+ board.push(move)
26
+ return board
27
+
28
+
29
+ def predict_legal_moves(model, tokenizer, token_ids, top_k=10):
30
+ """Return `(uci, logit)` pairs after masking every illegal move."""
31
+ if not token_ids:
32
+ raise ValueError("At least one context token is required")
33
+ board = board_from_history(tokenizer, token_ids)
34
+ context = token_ids[-model.config.sequence_len :]
35
+ logits = model(mx.array([context]))[0, -1]
36
+ mx.eval(logits)
37
+
38
+ candidates = []
39
+ for move in board.legal_moves:
40
+ token_id = tokenizer.token_to_id.get(move.uci())
41
+ if token_id is not None:
42
+ candidates.append((move.uci(), float(logits[token_id].item())))
43
+ candidates.sort(key=lambda item: item[1], reverse=True)
44
+ return candidates[:top_k]
45
+
46
+
47
+ def main():
48
+ parser = argparse.ArgumentParser(description=__doc__)
49
+ parser.add_argument("checkpoint", type=Path)
50
+ parser.add_argument(
51
+ "tokens",
52
+ nargs="+",
53
+ help="Full token history, including metadata and UCI moves.",
54
+ )
55
+ parser.add_argument("--top-k", type=int, default=10)
56
+ args = parser.parse_args()
57
+
58
+ tokenizer = ChessTokenizer.from_pretrained(args.checkpoint)
59
+ token_ids = tokenizer.encode_tokens(args.tokens)
60
+ model = load_model(args.checkpoint)
61
+ for move, score in predict_legal_moves(model, tokenizer, token_ids, args.top_k):
62
+ print(f"{move}\t{score:.6f}")
63
+
64
+
65
+ if __name__ == "__main__":
66
+ main()
metrics.json ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "legal_masked_top1_accuracy": 0.30970463160285916,
3
+ "legal_masked_top5_accuracy": 0.6682182988643823,
4
+ "raw_top1_accuracy": 0.27678346260393144,
5
+ "raw_top1_legal_rate": 0.8729143926399501,
6
+ "test_legal_masked_top1_accuracy": 0.307254982970034,
7
+ "test_legal_masked_top5_accuracy": 0.6651906703856502,
8
+ "test_move_bits": 4.1147322227098035,
9
+ "test_raw_top1_accuracy": 0.27385924925821303,
10
+ "test_raw_top1_legal_rate": 0.8720350759973353,
11
+ "val_move_bits": 4.098970468943424
12
+ }
model.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:4b9becf48b847389a2df10caeb485ee5b9b79366c049e48687b34e0f819ba4b3
3
+ size 29206716
requirements.txt ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ mlx>=0.30.0
2
+ python-chess>=1.999
special_tokens_map.json ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ {
2
+ "bos_token": "BOS",
3
+ "eos_token": "EOS",
4
+ "pad_token": "PAD"
5
+ }
tokenizer_config.json ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ {
2
+ "bos_token": "BOS",
3
+ "eos_token": "EOS",
4
+ "model_max_length": 256,
5
+ "pad_token": "PAD",
6
+ "tokenizer_class": "ChessTokenizer"
7
+ }
vocab.json ADDED
@@ -0,0 +1,2084 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "dtype": "uint16_le",
3
+ "size": 2075,
4
+ "rating_bucket_width": 50,
5
+ "rating_min": 600,
6
+ "rating_max_exclusive": 2800,
7
+ "id_to_token": [
8
+ "PAD",
9
+ "BOS",
10
+ "EOS",
11
+ "RESULT_WHITE",
12
+ "RESULT_DRAW",
13
+ "RESULT_BLACK",
14
+ "RESULT_UNKNOWN",
15
+ "WHITE_ELO_625",
16
+ "WHITE_ELO_675",
17
+ "WHITE_ELO_725",
18
+ "WHITE_ELO_775",
19
+ "WHITE_ELO_825",
20
+ "WHITE_ELO_875",
21
+ "WHITE_ELO_925",
22
+ "WHITE_ELO_975",
23
+ "WHITE_ELO_1025",
24
+ "WHITE_ELO_1075",
25
+ "WHITE_ELO_1125",
26
+ "WHITE_ELO_1175",
27
+ "WHITE_ELO_1225",
28
+ "WHITE_ELO_1275",
29
+ "WHITE_ELO_1325",
30
+ "WHITE_ELO_1375",
31
+ "WHITE_ELO_1425",
32
+ "WHITE_ELO_1475",
33
+ "WHITE_ELO_1525",
34
+ "WHITE_ELO_1575",
35
+ "WHITE_ELO_1625",
36
+ "WHITE_ELO_1675",
37
+ "WHITE_ELO_1725",
38
+ "WHITE_ELO_1775",
39
+ "WHITE_ELO_1825",
40
+ "WHITE_ELO_1875",
41
+ "WHITE_ELO_1925",
42
+ "WHITE_ELO_1975",
43
+ "WHITE_ELO_2025",
44
+ "WHITE_ELO_2075",
45
+ "WHITE_ELO_2125",
46
+ "WHITE_ELO_2175",
47
+ "WHITE_ELO_2225",
48
+ "WHITE_ELO_2275",
49
+ "WHITE_ELO_2325",
50
+ "WHITE_ELO_2375",
51
+ "WHITE_ELO_2425",
52
+ "WHITE_ELO_2475",
53
+ "WHITE_ELO_2525",
54
+ "WHITE_ELO_2575",
55
+ "WHITE_ELO_2625",
56
+ "WHITE_ELO_2675",
57
+ "WHITE_ELO_2725",
58
+ "WHITE_ELO_2775",
59
+ "WHITE_ELO_LOW",
60
+ "WHITE_ELO_HIGH",
61
+ "WHITE_ELO_UNKNOWN",
62
+ "BLACK_ELO_625",
63
+ "BLACK_ELO_675",
64
+ "BLACK_ELO_725",
65
+ "BLACK_ELO_775",
66
+ "BLACK_ELO_825",
67
+ "BLACK_ELO_875",
68
+ "BLACK_ELO_925",
69
+ "BLACK_ELO_975",
70
+ "BLACK_ELO_1025",
71
+ "BLACK_ELO_1075",
72
+ "BLACK_ELO_1125",
73
+ "BLACK_ELO_1175",
74
+ "BLACK_ELO_1225",
75
+ "BLACK_ELO_1275",
76
+ "BLACK_ELO_1325",
77
+ "BLACK_ELO_1375",
78
+ "BLACK_ELO_1425",
79
+ "BLACK_ELO_1475",
80
+ "BLACK_ELO_1525",
81
+ "BLACK_ELO_1575",
82
+ "BLACK_ELO_1625",
83
+ "BLACK_ELO_1675",
84
+ "BLACK_ELO_1725",
85
+ "BLACK_ELO_1775",
86
+ "BLACK_ELO_1825",
87
+ "BLACK_ELO_1875",
88
+ "BLACK_ELO_1925",
89
+ "BLACK_ELO_1975",
90
+ "BLACK_ELO_2025",
91
+ "BLACK_ELO_2075",
92
+ "BLACK_ELO_2125",
93
+ "BLACK_ELO_2175",
94
+ "BLACK_ELO_2225",
95
+ "BLACK_ELO_2275",
96
+ "BLACK_ELO_2325",
97
+ "BLACK_ELO_2375",
98
+ "BLACK_ELO_2425",
99
+ "BLACK_ELO_2475",
100
+ "BLACK_ELO_2525",
101
+ "BLACK_ELO_2575",
102
+ "BLACK_ELO_2625",
103
+ "BLACK_ELO_2675",
104
+ "BLACK_ELO_2725",
105
+ "BLACK_ELO_2775",
106
+ "BLACK_ELO_LOW",
107
+ "BLACK_ELO_HIGH",
108
+ "BLACK_ELO_UNKNOWN",
109
+ "TC_BULLET",
110
+ "TC_BLITZ",
111
+ "TC_RAPID",
112
+ "TC_CLASSICAL",
113
+ "TC_CORRESPONDENCE",
114
+ "TC_UNKNOWN",
115
+ "a1a2",
116
+ "a1a3",
117
+ "a1a4",
118
+ "a1a5",
119
+ "a1a6",
120
+ "a1a7",
121
+ "a1a8",
122
+ "a1b1",
123
+ "a1b2",
124
+ "a1b3",
125
+ "a1c1",
126
+ "a1c2",
127
+ "a1c3",
128
+ "a1d1",
129
+ "a1d4",
130
+ "a1e1",
131
+ "a1e5",
132
+ "a1f1",
133
+ "a1f6",
134
+ "a1g1",
135
+ "a1g7",
136
+ "a1h1",
137
+ "a1h8",
138
+ "a2a1",
139
+ "a2a1b",
140
+ "a2a1n",
141
+ "a2a1q",
142
+ "a2a1r",
143
+ "a2a3",
144
+ "a2a4",
145
+ "a2a5",
146
+ "a2a6",
147
+ "a2a7",
148
+ "a2a8",
149
+ "a2b1",
150
+ "a2b1b",
151
+ "a2b1n",
152
+ "a2b1q",
153
+ "a2b1r",
154
+ "a2b2",
155
+ "a2b3",
156
+ "a2b4",
157
+ "a2c1",
158
+ "a2c2",
159
+ "a2c3",
160
+ "a2c4",
161
+ "a2d2",
162
+ "a2d5",
163
+ "a2e2",
164
+ "a2e6",
165
+ "a2f2",
166
+ "a2f7",
167
+ "a2g2",
168
+ "a2g8",
169
+ "a2h2",
170
+ "a3a1",
171
+ "a3a2",
172
+ "a3a4",
173
+ "a3a5",
174
+ "a3a6",
175
+ "a3a7",
176
+ "a3a8",
177
+ "a3b1",
178
+ "a3b2",
179
+ "a3b3",
180
+ "a3b4",
181
+ "a3b5",
182
+ "a3c1",
183
+ "a3c2",
184
+ "a3c3",
185
+ "a3c4",
186
+ "a3c5",
187
+ "a3d3",
188
+ "a3d6",
189
+ "a3e3",
190
+ "a3e7",
191
+ "a3f3",
192
+ "a3f8",
193
+ "a3g3",
194
+ "a3h3",
195
+ "a4a1",
196
+ "a4a2",
197
+ "a4a3",
198
+ "a4a5",
199
+ "a4a6",
200
+ "a4a7",
201
+ "a4a8",
202
+ "a4b2",
203
+ "a4b3",
204
+ "a4b4",
205
+ "a4b5",
206
+ "a4b6",
207
+ "a4c2",
208
+ "a4c3",
209
+ "a4c4",
210
+ "a4c5",
211
+ "a4c6",
212
+ "a4d1",
213
+ "a4d4",
214
+ "a4d7",
215
+ "a4e4",
216
+ "a4e8",
217
+ "a4f4",
218
+ "a4g4",
219
+ "a4h4",
220
+ "a5a1",
221
+ "a5a2",
222
+ "a5a3",
223
+ "a5a4",
224
+ "a5a6",
225
+ "a5a7",
226
+ "a5a8",
227
+ "a5b3",
228
+ "a5b4",
229
+ "a5b5",
230
+ "a5b6",
231
+ "a5b7",
232
+ "a5c3",
233
+ "a5c4",
234
+ "a5c5",
235
+ "a5c6",
236
+ "a5c7",
237
+ "a5d2",
238
+ "a5d5",
239
+ "a5d8",
240
+ "a5e1",
241
+ "a5e5",
242
+ "a5f5",
243
+ "a5g5",
244
+ "a5h5",
245
+ "a6a1",
246
+ "a6a2",
247
+ "a6a3",
248
+ "a6a4",
249
+ "a6a5",
250
+ "a6a7",
251
+ "a6a8",
252
+ "a6b4",
253
+ "a6b5",
254
+ "a6b6",
255
+ "a6b7",
256
+ "a6b8",
257
+ "a6c4",
258
+ "a6c5",
259
+ "a6c6",
260
+ "a6c7",
261
+ "a6c8",
262
+ "a6d3",
263
+ "a6d6",
264
+ "a6e2",
265
+ "a6e6",
266
+ "a6f1",
267
+ "a6f6",
268
+ "a6g6",
269
+ "a6h6",
270
+ "a7a1",
271
+ "a7a2",
272
+ "a7a3",
273
+ "a7a4",
274
+ "a7a5",
275
+ "a7a6",
276
+ "a7a8",
277
+ "a7a8b",
278
+ "a7a8n",
279
+ "a7a8q",
280
+ "a7a8r",
281
+ "a7b5",
282
+ "a7b6",
283
+ "a7b7",
284
+ "a7b8",
285
+ "a7b8b",
286
+ "a7b8n",
287
+ "a7b8q",
288
+ "a7b8r",
289
+ "a7c5",
290
+ "a7c6",
291
+ "a7c7",
292
+ "a7c8",
293
+ "a7d4",
294
+ "a7d7",
295
+ "a7e3",
296
+ "a7e7",
297
+ "a7f2",
298
+ "a7f7",
299
+ "a7g1",
300
+ "a7g7",
301
+ "a7h7",
302
+ "a8a1",
303
+ "a8a2",
304
+ "a8a3",
305
+ "a8a4",
306
+ "a8a5",
307
+ "a8a6",
308
+ "a8a7",
309
+ "a8b6",
310
+ "a8b7",
311
+ "a8b8",
312
+ "a8c6",
313
+ "a8c7",
314
+ "a8c8",
315
+ "a8d5",
316
+ "a8d8",
317
+ "a8e4",
318
+ "a8e8",
319
+ "a8f3",
320
+ "a8f8",
321
+ "a8g2",
322
+ "a8g8",
323
+ "a8h1",
324
+ "a8h8",
325
+ "b1a1",
326
+ "b1a2",
327
+ "b1a3",
328
+ "b1b2",
329
+ "b1b3",
330
+ "b1b4",
331
+ "b1b5",
332
+ "b1b6",
333
+ "b1b7",
334
+ "b1b8",
335
+ "b1c1",
336
+ "b1c2",
337
+ "b1c3",
338
+ "b1d1",
339
+ "b1d2",
340
+ "b1d3",
341
+ "b1e1",
342
+ "b1e4",
343
+ "b1f1",
344
+ "b1f5",
345
+ "b1g1",
346
+ "b1g6",
347
+ "b1h1",
348
+ "b1h7",
349
+ "b2a1",
350
+ "b2a1b",
351
+ "b2a1n",
352
+ "b2a1q",
353
+ "b2a1r",
354
+ "b2a2",
355
+ "b2a3",
356
+ "b2a4",
357
+ "b2b1",
358
+ "b2b1b",
359
+ "b2b1n",
360
+ "b2b1q",
361
+ "b2b1r",
362
+ "b2b3",
363
+ "b2b4",
364
+ "b2b5",
365
+ "b2b6",
366
+ "b2b7",
367
+ "b2b8",
368
+ "b2c1",
369
+ "b2c1b",
370
+ "b2c1n",
371
+ "b2c1q",
372
+ "b2c1r",
373
+ "b2c2",
374
+ "b2c3",
375
+ "b2c4",
376
+ "b2d1",
377
+ "b2d2",
378
+ "b2d3",
379
+ "b2d4",
380
+ "b2e2",
381
+ "b2e5",
382
+ "b2f2",
383
+ "b2f6",
384
+ "b2g2",
385
+ "b2g7",
386
+ "b2h2",
387
+ "b2h8",
388
+ "b3a1",
389
+ "b3a2",
390
+ "b3a3",
391
+ "b3a4",
392
+ "b3a5",
393
+ "b3b1",
394
+ "b3b2",
395
+ "b3b4",
396
+ "b3b5",
397
+ "b3b6",
398
+ "b3b7",
399
+ "b3b8",
400
+ "b3c1",
401
+ "b3c2",
402
+ "b3c3",
403
+ "b3c4",
404
+ "b3c5",
405
+ "b3d1",
406
+ "b3d2",
407
+ "b3d3",
408
+ "b3d4",
409
+ "b3d5",
410
+ "b3e3",
411
+ "b3e6",
412
+ "b3f3",
413
+ "b3f7",
414
+ "b3g3",
415
+ "b3g8",
416
+ "b3h3",
417
+ "b4a2",
418
+ "b4a3",
419
+ "b4a4",
420
+ "b4a5",
421
+ "b4a6",
422
+ "b4b1",
423
+ "b4b2",
424
+ "b4b3",
425
+ "b4b5",
426
+ "b4b6",
427
+ "b4b7",
428
+ "b4b8",
429
+ "b4c2",
430
+ "b4c3",
431
+ "b4c4",
432
+ "b4c5",
433
+ "b4c6",
434
+ "b4d2",
435
+ "b4d3",
436
+ "b4d4",
437
+ "b4d5",
438
+ "b4d6",
439
+ "b4e1",
440
+ "b4e4",
441
+ "b4e7",
442
+ "b4f4",
443
+ "b4f8",
444
+ "b4g4",
445
+ "b4h4",
446
+ "b5a3",
447
+ "b5a4",
448
+ "b5a5",
449
+ "b5a6",
450
+ "b5a7",
451
+ "b5b1",
452
+ "b5b2",
453
+ "b5b3",
454
+ "b5b4",
455
+ "b5b6",
456
+ "b5b7",
457
+ "b5b8",
458
+ "b5c3",
459
+ "b5c4",
460
+ "b5c5",
461
+ "b5c6",
462
+ "b5c7",
463
+ "b5d3",
464
+ "b5d4",
465
+ "b5d5",
466
+ "b5d6",
467
+ "b5d7",
468
+ "b5e2",
469
+ "b5e5",
470
+ "b5e8",
471
+ "b5f1",
472
+ "b5f5",
473
+ "b5g5",
474
+ "b5h5",
475
+ "b6a4",
476
+ "b6a5",
477
+ "b6a6",
478
+ "b6a7",
479
+ "b6a8",
480
+ "b6b1",
481
+ "b6b2",
482
+ "b6b3",
483
+ "b6b4",
484
+ "b6b5",
485
+ "b6b7",
486
+ "b6b8",
487
+ "b6c4",
488
+ "b6c5",
489
+ "b6c6",
490
+ "b6c7",
491
+ "b6c8",
492
+ "b6d4",
493
+ "b6d5",
494
+ "b6d6",
495
+ "b6d7",
496
+ "b6d8",
497
+ "b6e3",
498
+ "b6e6",
499
+ "b6f2",
500
+ "b6f6",
501
+ "b6g1",
502
+ "b6g6",
503
+ "b6h6",
504
+ "b7a5",
505
+ "b7a6",
506
+ "b7a7",
507
+ "b7a8",
508
+ "b7a8b",
509
+ "b7a8n",
510
+ "b7a8q",
511
+ "b7a8r",
512
+ "b7b1",
513
+ "b7b2",
514
+ "b7b3",
515
+ "b7b4",
516
+ "b7b5",
517
+ "b7b6",
518
+ "b7b8",
519
+ "b7b8b",
520
+ "b7b8n",
521
+ "b7b8q",
522
+ "b7b8r",
523
+ "b7c5",
524
+ "b7c6",
525
+ "b7c7",
526
+ "b7c8",
527
+ "b7c8b",
528
+ "b7c8n",
529
+ "b7c8q",
530
+ "b7c8r",
531
+ "b7d5",
532
+ "b7d6",
533
+ "b7d7",
534
+ "b7d8",
535
+ "b7e4",
536
+ "b7e7",
537
+ "b7f3",
538
+ "b7f7",
539
+ "b7g2",
540
+ "b7g7",
541
+ "b7h1",
542
+ "b7h7",
543
+ "b8a6",
544
+ "b8a7",
545
+ "b8a8",
546
+ "b8b1",
547
+ "b8b2",
548
+ "b8b3",
549
+ "b8b4",
550
+ "b8b5",
551
+ "b8b6",
552
+ "b8b7",
553
+ "b8c6",
554
+ "b8c7",
555
+ "b8c8",
556
+ "b8d6",
557
+ "b8d7",
558
+ "b8d8",
559
+ "b8e5",
560
+ "b8e8",
561
+ "b8f4",
562
+ "b8f8",
563
+ "b8g3",
564
+ "b8g8",
565
+ "b8h2",
566
+ "b8h8",
567
+ "c1a1",
568
+ "c1a2",
569
+ "c1a3",
570
+ "c1b1",
571
+ "c1b2",
572
+ "c1b3",
573
+ "c1c2",
574
+ "c1c3",
575
+ "c1c4",
576
+ "c1c5",
577
+ "c1c6",
578
+ "c1c7",
579
+ "c1c8",
580
+ "c1d1",
581
+ "c1d2",
582
+ "c1d3",
583
+ "c1e1",
584
+ "c1e2",
585
+ "c1e3",
586
+ "c1f1",
587
+ "c1f4",
588
+ "c1g1",
589
+ "c1g5",
590
+ "c1h1",
591
+ "c1h6",
592
+ "c2a1",
593
+ "c2a2",
594
+ "c2a3",
595
+ "c2a4",
596
+ "c2b1",
597
+ "c2b1b",
598
+ "c2b1n",
599
+ "c2b1q",
600
+ "c2b1r",
601
+ "c2b2",
602
+ "c2b3",
603
+ "c2b4",
604
+ "c2c1",
605
+ "c2c1b",
606
+ "c2c1n",
607
+ "c2c1q",
608
+ "c2c1r",
609
+ "c2c3",
610
+ "c2c4",
611
+ "c2c5",
612
+ "c2c6",
613
+ "c2c7",
614
+ "c2c8",
615
+ "c2d1",
616
+ "c2d1b",
617
+ "c2d1n",
618
+ "c2d1q",
619
+ "c2d1r",
620
+ "c2d2",
621
+ "c2d3",
622
+ "c2d4",
623
+ "c2e1",
624
+ "c2e2",
625
+ "c2e3",
626
+ "c2e4",
627
+ "c2f2",
628
+ "c2f5",
629
+ "c2g2",
630
+ "c2g6",
631
+ "c2h2",
632
+ "c2h7",
633
+ "c3a1",
634
+ "c3a2",
635
+ "c3a3",
636
+ "c3a4",
637
+ "c3a5",
638
+ "c3b1",
639
+ "c3b2",
640
+ "c3b3",
641
+ "c3b4",
642
+ "c3b5",
643
+ "c3c1",
644
+ "c3c2",
645
+ "c3c4",
646
+ "c3c5",
647
+ "c3c6",
648
+ "c3c7",
649
+ "c3c8",
650
+ "c3d1",
651
+ "c3d2",
652
+ "c3d3",
653
+ "c3d4",
654
+ "c3d5",
655
+ "c3e1",
656
+ "c3e2",
657
+ "c3e3",
658
+ "c3e4",
659
+ "c3e5",
660
+ "c3f3",
661
+ "c3f6",
662
+ "c3g3",
663
+ "c3g7",
664
+ "c3h3",
665
+ "c3h8",
666
+ "c4a2",
667
+ "c4a3",
668
+ "c4a4",
669
+ "c4a5",
670
+ "c4a6",
671
+ "c4b2",
672
+ "c4b3",
673
+ "c4b4",
674
+ "c4b5",
675
+ "c4b6",
676
+ "c4c1",
677
+ "c4c2",
678
+ "c4c3",
679
+ "c4c5",
680
+ "c4c6",
681
+ "c4c7",
682
+ "c4c8",
683
+ "c4d2",
684
+ "c4d3",
685
+ "c4d4",
686
+ "c4d5",
687
+ "c4d6",
688
+ "c4e2",
689
+ "c4e3",
690
+ "c4e4",
691
+ "c4e5",
692
+ "c4e6",
693
+ "c4f1",
694
+ "c4f4",
695
+ "c4f7",
696
+ "c4g4",
697
+ "c4g8",
698
+ "c4h4",
699
+ "c5a3",
700
+ "c5a4",
701
+ "c5a5",
702
+ "c5a6",
703
+ "c5a7",
704
+ "c5b3",
705
+ "c5b4",
706
+ "c5b5",
707
+ "c5b6",
708
+ "c5b7",
709
+ "c5c1",
710
+ "c5c2",
711
+ "c5c3",
712
+ "c5c4",
713
+ "c5c6",
714
+ "c5c7",
715
+ "c5c8",
716
+ "c5d3",
717
+ "c5d4",
718
+ "c5d5",
719
+ "c5d6",
720
+ "c5d7",
721
+ "c5e3",
722
+ "c5e4",
723
+ "c5e5",
724
+ "c5e6",
725
+ "c5e7",
726
+ "c5f2",
727
+ "c5f5",
728
+ "c5f8",
729
+ "c5g1",
730
+ "c5g5",
731
+ "c5h5",
732
+ "c6a4",
733
+ "c6a5",
734
+ "c6a6",
735
+ "c6a7",
736
+ "c6a8",
737
+ "c6b4",
738
+ "c6b5",
739
+ "c6b6",
740
+ "c6b7",
741
+ "c6b8",
742
+ "c6c1",
743
+ "c6c2",
744
+ "c6c3",
745
+ "c6c4",
746
+ "c6c5",
747
+ "c6c7",
748
+ "c6c8",
749
+ "c6d4",
750
+ "c6d5",
751
+ "c6d6",
752
+ "c6d7",
753
+ "c6d8",
754
+ "c6e4",
755
+ "c6e5",
756
+ "c6e6",
757
+ "c6e7",
758
+ "c6e8",
759
+ "c6f3",
760
+ "c6f6",
761
+ "c6g2",
762
+ "c6g6",
763
+ "c6h1",
764
+ "c6h6",
765
+ "c7a5",
766
+ "c7a6",
767
+ "c7a7",
768
+ "c7a8",
769
+ "c7b5",
770
+ "c7b6",
771
+ "c7b7",
772
+ "c7b8",
773
+ "c7b8b",
774
+ "c7b8n",
775
+ "c7b8q",
776
+ "c7b8r",
777
+ "c7c1",
778
+ "c7c2",
779
+ "c7c3",
780
+ "c7c4",
781
+ "c7c5",
782
+ "c7c6",
783
+ "c7c8",
784
+ "c7c8b",
785
+ "c7c8n",
786
+ "c7c8q",
787
+ "c7c8r",
788
+ "c7d5",
789
+ "c7d6",
790
+ "c7d7",
791
+ "c7d8",
792
+ "c7d8b",
793
+ "c7d8n",
794
+ "c7d8q",
795
+ "c7d8r",
796
+ "c7e5",
797
+ "c7e6",
798
+ "c7e7",
799
+ "c7e8",
800
+ "c7f4",
801
+ "c7f7",
802
+ "c7g3",
803
+ "c7g7",
804
+ "c7h2",
805
+ "c7h7",
806
+ "c8a6",
807
+ "c8a7",
808
+ "c8a8",
809
+ "c8b6",
810
+ "c8b7",
811
+ "c8b8",
812
+ "c8c1",
813
+ "c8c2",
814
+ "c8c3",
815
+ "c8c4",
816
+ "c8c5",
817
+ "c8c6",
818
+ "c8c7",
819
+ "c8d6",
820
+ "c8d7",
821
+ "c8d8",
822
+ "c8e6",
823
+ "c8e7",
824
+ "c8e8",
825
+ "c8f5",
826
+ "c8f8",
827
+ "c8g4",
828
+ "c8g8",
829
+ "c8h3",
830
+ "c8h8",
831
+ "d1a1",
832
+ "d1a4",
833
+ "d1b1",
834
+ "d1b2",
835
+ "d1b3",
836
+ "d1c1",
837
+ "d1c2",
838
+ "d1c3",
839
+ "d1d2",
840
+ "d1d3",
841
+ "d1d4",
842
+ "d1d5",
843
+ "d1d6",
844
+ "d1d7",
845
+ "d1d8",
846
+ "d1e1",
847
+ "d1e2",
848
+ "d1e3",
849
+ "d1f1",
850
+ "d1f2",
851
+ "d1f3",
852
+ "d1g1",
853
+ "d1g4",
854
+ "d1h1",
855
+ "d1h5",
856
+ "d2a2",
857
+ "d2a5",
858
+ "d2b1",
859
+ "d2b2",
860
+ "d2b3",
861
+ "d2b4",
862
+ "d2c1",
863
+ "d2c1b",
864
+ "d2c1n",
865
+ "d2c1q",
866
+ "d2c1r",
867
+ "d2c2",
868
+ "d2c3",
869
+ "d2c4",
870
+ "d2d1",
871
+ "d2d1b",
872
+ "d2d1n",
873
+ "d2d1q",
874
+ "d2d1r",
875
+ "d2d3",
876
+ "d2d4",
877
+ "d2d5",
878
+ "d2d6",
879
+ "d2d7",
880
+ "d2d8",
881
+ "d2e1",
882
+ "d2e1b",
883
+ "d2e1n",
884
+ "d2e1q",
885
+ "d2e1r",
886
+ "d2e2",
887
+ "d2e3",
888
+ "d2e4",
889
+ "d2f1",
890
+ "d2f2",
891
+ "d2f3",
892
+ "d2f4",
893
+ "d2g2",
894
+ "d2g5",
895
+ "d2h2",
896
+ "d2h6",
897
+ "d3a3",
898
+ "d3a6",
899
+ "d3b1",
900
+ "d3b2",
901
+ "d3b3",
902
+ "d3b4",
903
+ "d3b5",
904
+ "d3c1",
905
+ "d3c2",
906
+ "d3c3",
907
+ "d3c4",
908
+ "d3c5",
909
+ "d3d1",
910
+ "d3d2",
911
+ "d3d4",
912
+ "d3d5",
913
+ "d3d6",
914
+ "d3d7",
915
+ "d3d8",
916
+ "d3e1",
917
+ "d3e2",
918
+ "d3e3",
919
+ "d3e4",
920
+ "d3e5",
921
+ "d3f1",
922
+ "d3f2",
923
+ "d3f3",
924
+ "d3f4",
925
+ "d3f5",
926
+ "d3g3",
927
+ "d3g6",
928
+ "d3h3",
929
+ "d3h7",
930
+ "d4a1",
931
+ "d4a4",
932
+ "d4a7",
933
+ "d4b2",
934
+ "d4b3",
935
+ "d4b4",
936
+ "d4b5",
937
+ "d4b6",
938
+ "d4c2",
939
+ "d4c3",
940
+ "d4c4",
941
+ "d4c5",
942
+ "d4c6",
943
+ "d4d1",
944
+ "d4d2",
945
+ "d4d3",
946
+ "d4d5",
947
+ "d4d6",
948
+ "d4d7",
949
+ "d4d8",
950
+ "d4e2",
951
+ "d4e3",
952
+ "d4e4",
953
+ "d4e5",
954
+ "d4e6",
955
+ "d4f2",
956
+ "d4f3",
957
+ "d4f4",
958
+ "d4f5",
959
+ "d4f6",
960
+ "d4g1",
961
+ "d4g4",
962
+ "d4g7",
963
+ "d4h4",
964
+ "d4h8",
965
+ "d5a2",
966
+ "d5a5",
967
+ "d5a8",
968
+ "d5b3",
969
+ "d5b4",
970
+ "d5b5",
971
+ "d5b6",
972
+ "d5b7",
973
+ "d5c3",
974
+ "d5c4",
975
+ "d5c5",
976
+ "d5c6",
977
+ "d5c7",
978
+ "d5d1",
979
+ "d5d2",
980
+ "d5d3",
981
+ "d5d4",
982
+ "d5d6",
983
+ "d5d7",
984
+ "d5d8",
985
+ "d5e3",
986
+ "d5e4",
987
+ "d5e5",
988
+ "d5e6",
989
+ "d5e7",
990
+ "d5f3",
991
+ "d5f4",
992
+ "d5f5",
993
+ "d5f6",
994
+ "d5f7",
995
+ "d5g2",
996
+ "d5g5",
997
+ "d5g8",
998
+ "d5h1",
999
+ "d5h5",
1000
+ "d6a3",
1001
+ "d6a6",
1002
+ "d6b4",
1003
+ "d6b5",
1004
+ "d6b6",
1005
+ "d6b7",
1006
+ "d6b8",
1007
+ "d6c4",
1008
+ "d6c5",
1009
+ "d6c6",
1010
+ "d6c7",
1011
+ "d6c8",
1012
+ "d6d1",
1013
+ "d6d2",
1014
+ "d6d3",
1015
+ "d6d4",
1016
+ "d6d5",
1017
+ "d6d7",
1018
+ "d6d8",
1019
+ "d6e4",
1020
+ "d6e5",
1021
+ "d6e6",
1022
+ "d6e7",
1023
+ "d6e8",
1024
+ "d6f4",
1025
+ "d6f5",
1026
+ "d6f6",
1027
+ "d6f7",
1028
+ "d6f8",
1029
+ "d6g3",
1030
+ "d6g6",
1031
+ "d6h2",
1032
+ "d6h6",
1033
+ "d7a4",
1034
+ "d7a7",
1035
+ "d7b5",
1036
+ "d7b6",
1037
+ "d7b7",
1038
+ "d7b8",
1039
+ "d7c5",
1040
+ "d7c6",
1041
+ "d7c7",
1042
+ "d7c8",
1043
+ "d7c8b",
1044
+ "d7c8n",
1045
+ "d7c8q",
1046
+ "d7c8r",
1047
+ "d7d1",
1048
+ "d7d2",
1049
+ "d7d3",
1050
+ "d7d4",
1051
+ "d7d5",
1052
+ "d7d6",
1053
+ "d7d8",
1054
+ "d7d8b",
1055
+ "d7d8n",
1056
+ "d7d8q",
1057
+ "d7d8r",
1058
+ "d7e5",
1059
+ "d7e6",
1060
+ "d7e7",
1061
+ "d7e8",
1062
+ "d7e8b",
1063
+ "d7e8n",
1064
+ "d7e8q",
1065
+ "d7e8r",
1066
+ "d7f5",
1067
+ "d7f6",
1068
+ "d7f7",
1069
+ "d7f8",
1070
+ "d7g4",
1071
+ "d7g7",
1072
+ "d7h3",
1073
+ "d7h7",
1074
+ "d8a5",
1075
+ "d8a8",
1076
+ "d8b6",
1077
+ "d8b7",
1078
+ "d8b8",
1079
+ "d8c6",
1080
+ "d8c7",
1081
+ "d8c8",
1082
+ "d8d1",
1083
+ "d8d2",
1084
+ "d8d3",
1085
+ "d8d4",
1086
+ "d8d5",
1087
+ "d8d6",
1088
+ "d8d7",
1089
+ "d8e6",
1090
+ "d8e7",
1091
+ "d8e8",
1092
+ "d8f6",
1093
+ "d8f7",
1094
+ "d8f8",
1095
+ "d8g5",
1096
+ "d8g8",
1097
+ "d8h4",
1098
+ "d8h8",
1099
+ "e1a1",
1100
+ "e1a5",
1101
+ "e1b1",
1102
+ "e1b4",
1103
+ "e1c1",
1104
+ "e1c2",
1105
+ "e1c3",
1106
+ "e1d1",
1107
+ "e1d2",
1108
+ "e1d3",
1109
+ "e1e2",
1110
+ "e1e3",
1111
+ "e1e4",
1112
+ "e1e5",
1113
+ "e1e6",
1114
+ "e1e7",
1115
+ "e1e8",
1116
+ "e1f1",
1117
+ "e1f2",
1118
+ "e1f3",
1119
+ "e1g1",
1120
+ "e1g2",
1121
+ "e1g3",
1122
+ "e1h1",
1123
+ "e1h4",
1124
+ "e2a2",
1125
+ "e2a6",
1126
+ "e2b2",
1127
+ "e2b5",
1128
+ "e2c1",
1129
+ "e2c2",
1130
+ "e2c3",
1131
+ "e2c4",
1132
+ "e2d1",
1133
+ "e2d1b",
1134
+ "e2d1n",
1135
+ "e2d1q",
1136
+ "e2d1r",
1137
+ "e2d2",
1138
+ "e2d3",
1139
+ "e2d4",
1140
+ "e2e1",
1141
+ "e2e1b",
1142
+ "e2e1n",
1143
+ "e2e1q",
1144
+ "e2e1r",
1145
+ "e2e3",
1146
+ "e2e4",
1147
+ "e2e5",
1148
+ "e2e6",
1149
+ "e2e7",
1150
+ "e2e8",
1151
+ "e2f1",
1152
+ "e2f1b",
1153
+ "e2f1n",
1154
+ "e2f1q",
1155
+ "e2f1r",
1156
+ "e2f2",
1157
+ "e2f3",
1158
+ "e2f4",
1159
+ "e2g1",
1160
+ "e2g2",
1161
+ "e2g3",
1162
+ "e2g4",
1163
+ "e2h2",
1164
+ "e2h5",
1165
+ "e3a3",
1166
+ "e3a7",
1167
+ "e3b3",
1168
+ "e3b6",
1169
+ "e3c1",
1170
+ "e3c2",
1171
+ "e3c3",
1172
+ "e3c4",
1173
+ "e3c5",
1174
+ "e3d1",
1175
+ "e3d2",
1176
+ "e3d3",
1177
+ "e3d4",
1178
+ "e3d5",
1179
+ "e3e1",
1180
+ "e3e2",
1181
+ "e3e4",
1182
+ "e3e5",
1183
+ "e3e6",
1184
+ "e3e7",
1185
+ "e3e8",
1186
+ "e3f1",
1187
+ "e3f2",
1188
+ "e3f3",
1189
+ "e3f4",
1190
+ "e3f5",
1191
+ "e3g1",
1192
+ "e3g2",
1193
+ "e3g3",
1194
+ "e3g4",
1195
+ "e3g5",
1196
+ "e3h3",
1197
+ "e3h6",
1198
+ "e4a4",
1199
+ "e4a8",
1200
+ "e4b1",
1201
+ "e4b4",
1202
+ "e4b7",
1203
+ "e4c2",
1204
+ "e4c3",
1205
+ "e4c4",
1206
+ "e4c5",
1207
+ "e4c6",
1208
+ "e4d2",
1209
+ "e4d3",
1210
+ "e4d4",
1211
+ "e4d5",
1212
+ "e4d6",
1213
+ "e4e1",
1214
+ "e4e2",
1215
+ "e4e3",
1216
+ "e4e5",
1217
+ "e4e6",
1218
+ "e4e7",
1219
+ "e4e8",
1220
+ "e4f2",
1221
+ "e4f3",
1222
+ "e4f4",
1223
+ "e4f5",
1224
+ "e4f6",
1225
+ "e4g2",
1226
+ "e4g3",
1227
+ "e4g4",
1228
+ "e4g5",
1229
+ "e4g6",
1230
+ "e4h1",
1231
+ "e4h4",
1232
+ "e4h7",
1233
+ "e5a1",
1234
+ "e5a5",
1235
+ "e5b2",
1236
+ "e5b5",
1237
+ "e5b8",
1238
+ "e5c3",
1239
+ "e5c4",
1240
+ "e5c5",
1241
+ "e5c6",
1242
+ "e5c7",
1243
+ "e5d3",
1244
+ "e5d4",
1245
+ "e5d5",
1246
+ "e5d6",
1247
+ "e5d7",
1248
+ "e5e1",
1249
+ "e5e2",
1250
+ "e5e3",
1251
+ "e5e4",
1252
+ "e5e6",
1253
+ "e5e7",
1254
+ "e5e8",
1255
+ "e5f3",
1256
+ "e5f4",
1257
+ "e5f5",
1258
+ "e5f6",
1259
+ "e5f7",
1260
+ "e5g3",
1261
+ "e5g4",
1262
+ "e5g5",
1263
+ "e5g6",
1264
+ "e5g7",
1265
+ "e5h2",
1266
+ "e5h5",
1267
+ "e5h8",
1268
+ "e6a2",
1269
+ "e6a6",
1270
+ "e6b3",
1271
+ "e6b6",
1272
+ "e6c4",
1273
+ "e6c5",
1274
+ "e6c6",
1275
+ "e6c7",
1276
+ "e6c8",
1277
+ "e6d4",
1278
+ "e6d5",
1279
+ "e6d6",
1280
+ "e6d7",
1281
+ "e6d8",
1282
+ "e6e1",
1283
+ "e6e2",
1284
+ "e6e3",
1285
+ "e6e4",
1286
+ "e6e5",
1287
+ "e6e7",
1288
+ "e6e8",
1289
+ "e6f4",
1290
+ "e6f5",
1291
+ "e6f6",
1292
+ "e6f7",
1293
+ "e6f8",
1294
+ "e6g4",
1295
+ "e6g5",
1296
+ "e6g6",
1297
+ "e6g7",
1298
+ "e6g8",
1299
+ "e6h3",
1300
+ "e6h6",
1301
+ "e7a3",
1302
+ "e7a7",
1303
+ "e7b4",
1304
+ "e7b7",
1305
+ "e7c5",
1306
+ "e7c6",
1307
+ "e7c7",
1308
+ "e7c8",
1309
+ "e7d5",
1310
+ "e7d6",
1311
+ "e7d7",
1312
+ "e7d8",
1313
+ "e7d8b",
1314
+ "e7d8n",
1315
+ "e7d8q",
1316
+ "e7d8r",
1317
+ "e7e1",
1318
+ "e7e2",
1319
+ "e7e3",
1320
+ "e7e4",
1321
+ "e7e5",
1322
+ "e7e6",
1323
+ "e7e8",
1324
+ "e7e8b",
1325
+ "e7e8n",
1326
+ "e7e8q",
1327
+ "e7e8r",
1328
+ "e7f5",
1329
+ "e7f6",
1330
+ "e7f7",
1331
+ "e7f8",
1332
+ "e7f8b",
1333
+ "e7f8n",
1334
+ "e7f8q",
1335
+ "e7f8r",
1336
+ "e7g5",
1337
+ "e7g6",
1338
+ "e7g7",
1339
+ "e7g8",
1340
+ "e7h4",
1341
+ "e7h7",
1342
+ "e8a4",
1343
+ "e8a8",
1344
+ "e8b5",
1345
+ "e8b8",
1346
+ "e8c6",
1347
+ "e8c7",
1348
+ "e8c8",
1349
+ "e8d6",
1350
+ "e8d7",
1351
+ "e8d8",
1352
+ "e8e1",
1353
+ "e8e2",
1354
+ "e8e3",
1355
+ "e8e4",
1356
+ "e8e5",
1357
+ "e8e6",
1358
+ "e8e7",
1359
+ "e8f6",
1360
+ "e8f7",
1361
+ "e8f8",
1362
+ "e8g6",
1363
+ "e8g7",
1364
+ "e8g8",
1365
+ "e8h5",
1366
+ "e8h8",
1367
+ "f1a1",
1368
+ "f1a6",
1369
+ "f1b1",
1370
+ "f1b5",
1371
+ "f1c1",
1372
+ "f1c4",
1373
+ "f1d1",
1374
+ "f1d2",
1375
+ "f1d3",
1376
+ "f1e1",
1377
+ "f1e2",
1378
+ "f1e3",
1379
+ "f1f2",
1380
+ "f1f3",
1381
+ "f1f4",
1382
+ "f1f5",
1383
+ "f1f6",
1384
+ "f1f7",
1385
+ "f1f8",
1386
+ "f1g1",
1387
+ "f1g2",
1388
+ "f1g3",
1389
+ "f1h1",
1390
+ "f1h2",
1391
+ "f1h3",
1392
+ "f2a2",
1393
+ "f2a7",
1394
+ "f2b2",
1395
+ "f2b6",
1396
+ "f2c2",
1397
+ "f2c5",
1398
+ "f2d1",
1399
+ "f2d2",
1400
+ "f2d3",
1401
+ "f2d4",
1402
+ "f2e1",
1403
+ "f2e1b",
1404
+ "f2e1n",
1405
+ "f2e1q",
1406
+ "f2e1r",
1407
+ "f2e2",
1408
+ "f2e3",
1409
+ "f2e4",
1410
+ "f2f1",
1411
+ "f2f1b",
1412
+ "f2f1n",
1413
+ "f2f1q",
1414
+ "f2f1r",
1415
+ "f2f3",
1416
+ "f2f4",
1417
+ "f2f5",
1418
+ "f2f6",
1419
+ "f2f7",
1420
+ "f2f8",
1421
+ "f2g1",
1422
+ "f2g1b",
1423
+ "f2g1n",
1424
+ "f2g1q",
1425
+ "f2g1r",
1426
+ "f2g2",
1427
+ "f2g3",
1428
+ "f2g4",
1429
+ "f2h1",
1430
+ "f2h2",
1431
+ "f2h3",
1432
+ "f2h4",
1433
+ "f3a3",
1434
+ "f3a8",
1435
+ "f3b3",
1436
+ "f3b7",
1437
+ "f3c3",
1438
+ "f3c6",
1439
+ "f3d1",
1440
+ "f3d2",
1441
+ "f3d3",
1442
+ "f3d4",
1443
+ "f3d5",
1444
+ "f3e1",
1445
+ "f3e2",
1446
+ "f3e3",
1447
+ "f3e4",
1448
+ "f3e5",
1449
+ "f3f1",
1450
+ "f3f2",
1451
+ "f3f4",
1452
+ "f3f5",
1453
+ "f3f6",
1454
+ "f3f7",
1455
+ "f3f8",
1456
+ "f3g1",
1457
+ "f3g2",
1458
+ "f3g3",
1459
+ "f3g4",
1460
+ "f3g5",
1461
+ "f3h1",
1462
+ "f3h2",
1463
+ "f3h3",
1464
+ "f3h4",
1465
+ "f3h5",
1466
+ "f4a4",
1467
+ "f4b4",
1468
+ "f4b8",
1469
+ "f4c1",
1470
+ "f4c4",
1471
+ "f4c7",
1472
+ "f4d2",
1473
+ "f4d3",
1474
+ "f4d4",
1475
+ "f4d5",
1476
+ "f4d6",
1477
+ "f4e2",
1478
+ "f4e3",
1479
+ "f4e4",
1480
+ "f4e5",
1481
+ "f4e6",
1482
+ "f4f1",
1483
+ "f4f2",
1484
+ "f4f3",
1485
+ "f4f5",
1486
+ "f4f6",
1487
+ "f4f7",
1488
+ "f4f8",
1489
+ "f4g2",
1490
+ "f4g3",
1491
+ "f4g4",
1492
+ "f4g5",
1493
+ "f4g6",
1494
+ "f4h2",
1495
+ "f4h3",
1496
+ "f4h4",
1497
+ "f4h5",
1498
+ "f4h6",
1499
+ "f5a5",
1500
+ "f5b1",
1501
+ "f5b5",
1502
+ "f5c2",
1503
+ "f5c5",
1504
+ "f5c8",
1505
+ "f5d3",
1506
+ "f5d4",
1507
+ "f5d5",
1508
+ "f5d6",
1509
+ "f5d7",
1510
+ "f5e3",
1511
+ "f5e4",
1512
+ "f5e5",
1513
+ "f5e6",
1514
+ "f5e7",
1515
+ "f5f1",
1516
+ "f5f2",
1517
+ "f5f3",
1518
+ "f5f4",
1519
+ "f5f6",
1520
+ "f5f7",
1521
+ "f5f8",
1522
+ "f5g3",
1523
+ "f5g4",
1524
+ "f5g5",
1525
+ "f5g6",
1526
+ "f5g7",
1527
+ "f5h3",
1528
+ "f5h4",
1529
+ "f5h5",
1530
+ "f5h6",
1531
+ "f5h7",
1532
+ "f6a1",
1533
+ "f6a6",
1534
+ "f6b2",
1535
+ "f6b6",
1536
+ "f6c3",
1537
+ "f6c6",
1538
+ "f6d4",
1539
+ "f6d5",
1540
+ "f6d6",
1541
+ "f6d7",
1542
+ "f6d8",
1543
+ "f6e4",
1544
+ "f6e5",
1545
+ "f6e6",
1546
+ "f6e7",
1547
+ "f6e8",
1548
+ "f6f1",
1549
+ "f6f2",
1550
+ "f6f3",
1551
+ "f6f4",
1552
+ "f6f5",
1553
+ "f6f7",
1554
+ "f6f8",
1555
+ "f6g4",
1556
+ "f6g5",
1557
+ "f6g6",
1558
+ "f6g7",
1559
+ "f6g8",
1560
+ "f6h4",
1561
+ "f6h5",
1562
+ "f6h6",
1563
+ "f6h7",
1564
+ "f6h8",
1565
+ "f7a2",
1566
+ "f7a7",
1567
+ "f7b3",
1568
+ "f7b7",
1569
+ "f7c4",
1570
+ "f7c7",
1571
+ "f7d5",
1572
+ "f7d6",
1573
+ "f7d7",
1574
+ "f7d8",
1575
+ "f7e5",
1576
+ "f7e6",
1577
+ "f7e7",
1578
+ "f7e8",
1579
+ "f7e8b",
1580
+ "f7e8n",
1581
+ "f7e8q",
1582
+ "f7e8r",
1583
+ "f7f1",
1584
+ "f7f2",
1585
+ "f7f3",
1586
+ "f7f4",
1587
+ "f7f5",
1588
+ "f7f6",
1589
+ "f7f8",
1590
+ "f7f8b",
1591
+ "f7f8n",
1592
+ "f7f8q",
1593
+ "f7f8r",
1594
+ "f7g5",
1595
+ "f7g6",
1596
+ "f7g7",
1597
+ "f7g8",
1598
+ "f7g8b",
1599
+ "f7g8n",
1600
+ "f7g8q",
1601
+ "f7g8r",
1602
+ "f7h5",
1603
+ "f7h6",
1604
+ "f7h7",
1605
+ "f7h8",
1606
+ "f8a3",
1607
+ "f8a8",
1608
+ "f8b4",
1609
+ "f8b8",
1610
+ "f8c5",
1611
+ "f8c8",
1612
+ "f8d6",
1613
+ "f8d7",
1614
+ "f8d8",
1615
+ "f8e6",
1616
+ "f8e7",
1617
+ "f8e8",
1618
+ "f8f1",
1619
+ "f8f2",
1620
+ "f8f3",
1621
+ "f8f4",
1622
+ "f8f5",
1623
+ "f8f6",
1624
+ "f8f7",
1625
+ "f8g6",
1626
+ "f8g7",
1627
+ "f8g8",
1628
+ "f8h6",
1629
+ "f8h7",
1630
+ "f8h8",
1631
+ "g1a1",
1632
+ "g1a7",
1633
+ "g1b1",
1634
+ "g1b6",
1635
+ "g1c1",
1636
+ "g1c5",
1637
+ "g1d1",
1638
+ "g1d4",
1639
+ "g1e1",
1640
+ "g1e2",
1641
+ "g1e3",
1642
+ "g1f1",
1643
+ "g1f2",
1644
+ "g1f3",
1645
+ "g1g2",
1646
+ "g1g3",
1647
+ "g1g4",
1648
+ "g1g5",
1649
+ "g1g6",
1650
+ "g1g7",
1651
+ "g1g8",
1652
+ "g1h1",
1653
+ "g1h2",
1654
+ "g1h3",
1655
+ "g2a2",
1656
+ "g2a8",
1657
+ "g2b2",
1658
+ "g2b7",
1659
+ "g2c2",
1660
+ "g2c6",
1661
+ "g2d2",
1662
+ "g2d5",
1663
+ "g2e1",
1664
+ "g2e2",
1665
+ "g2e3",
1666
+ "g2e4",
1667
+ "g2f1",
1668
+ "g2f1b",
1669
+ "g2f1n",
1670
+ "g2f1q",
1671
+ "g2f1r",
1672
+ "g2f2",
1673
+ "g2f3",
1674
+ "g2f4",
1675
+ "g2g1",
1676
+ "g2g1b",
1677
+ "g2g1n",
1678
+ "g2g1q",
1679
+ "g2g1r",
1680
+ "g2g3",
1681
+ "g2g4",
1682
+ "g2g5",
1683
+ "g2g6",
1684
+ "g2g7",
1685
+ "g2g8",
1686
+ "g2h1",
1687
+ "g2h1b",
1688
+ "g2h1n",
1689
+ "g2h1q",
1690
+ "g2h1r",
1691
+ "g2h2",
1692
+ "g2h3",
1693
+ "g2h4",
1694
+ "g3a3",
1695
+ "g3b3",
1696
+ "g3b8",
1697
+ "g3c3",
1698
+ "g3c7",
1699
+ "g3d3",
1700
+ "g3d6",
1701
+ "g3e1",
1702
+ "g3e2",
1703
+ "g3e3",
1704
+ "g3e4",
1705
+ "g3e5",
1706
+ "g3f1",
1707
+ "g3f2",
1708
+ "g3f3",
1709
+ "g3f4",
1710
+ "g3f5",
1711
+ "g3g1",
1712
+ "g3g2",
1713
+ "g3g4",
1714
+ "g3g5",
1715
+ "g3g6",
1716
+ "g3g7",
1717
+ "g3g8",
1718
+ "g3h1",
1719
+ "g3h2",
1720
+ "g3h3",
1721
+ "g3h4",
1722
+ "g3h5",
1723
+ "g4a4",
1724
+ "g4b4",
1725
+ "g4c4",
1726
+ "g4c8",
1727
+ "g4d1",
1728
+ "g4d4",
1729
+ "g4d7",
1730
+ "g4e2",
1731
+ "g4e3",
1732
+ "g4e4",
1733
+ "g4e5",
1734
+ "g4e6",
1735
+ "g4f2",
1736
+ "g4f3",
1737
+ "g4f4",
1738
+ "g4f5",
1739
+ "g4f6",
1740
+ "g4g1",
1741
+ "g4g2",
1742
+ "g4g3",
1743
+ "g4g5",
1744
+ "g4g6",
1745
+ "g4g7",
1746
+ "g4g8",
1747
+ "g4h2",
1748
+ "g4h3",
1749
+ "g4h4",
1750
+ "g4h5",
1751
+ "g4h6",
1752
+ "g5a5",
1753
+ "g5b5",
1754
+ "g5c1",
1755
+ "g5c5",
1756
+ "g5d2",
1757
+ "g5d5",
1758
+ "g5d8",
1759
+ "g5e3",
1760
+ "g5e4",
1761
+ "g5e5",
1762
+ "g5e6",
1763
+ "g5e7",
1764
+ "g5f3",
1765
+ "g5f4",
1766
+ "g5f5",
1767
+ "g5f6",
1768
+ "g5f7",
1769
+ "g5g1",
1770
+ "g5g2",
1771
+ "g5g3",
1772
+ "g5g4",
1773
+ "g5g6",
1774
+ "g5g7",
1775
+ "g5g8",
1776
+ "g5h3",
1777
+ "g5h4",
1778
+ "g5h5",
1779
+ "g5h6",
1780
+ "g5h7",
1781
+ "g6a6",
1782
+ "g6b1",
1783
+ "g6b6",
1784
+ "g6c2",
1785
+ "g6c6",
1786
+ "g6d3",
1787
+ "g6d6",
1788
+ "g6e4",
1789
+ "g6e5",
1790
+ "g6e6",
1791
+ "g6e7",
1792
+ "g6e8",
1793
+ "g6f4",
1794
+ "g6f5",
1795
+ "g6f6",
1796
+ "g6f7",
1797
+ "g6f8",
1798
+ "g6g1",
1799
+ "g6g2",
1800
+ "g6g3",
1801
+ "g6g4",
1802
+ "g6g5",
1803
+ "g6g7",
1804
+ "g6g8",
1805
+ "g6h4",
1806
+ "g6h5",
1807
+ "g6h6",
1808
+ "g6h7",
1809
+ "g6h8",
1810
+ "g7a1",
1811
+ "g7a7",
1812
+ "g7b2",
1813
+ "g7b7",
1814
+ "g7c3",
1815
+ "g7c7",
1816
+ "g7d4",
1817
+ "g7d7",
1818
+ "g7e5",
1819
+ "g7e6",
1820
+ "g7e7",
1821
+ "g7e8",
1822
+ "g7f5",
1823
+ "g7f6",
1824
+ "g7f7",
1825
+ "g7f8",
1826
+ "g7f8b",
1827
+ "g7f8n",
1828
+ "g7f8q",
1829
+ "g7f8r",
1830
+ "g7g1",
1831
+ "g7g2",
1832
+ "g7g3",
1833
+ "g7g4",
1834
+ "g7g5",
1835
+ "g7g6",
1836
+ "g7g8",
1837
+ "g7g8b",
1838
+ "g7g8n",
1839
+ "g7g8q",
1840
+ "g7g8r",
1841
+ "g7h5",
1842
+ "g7h6",
1843
+ "g7h7",
1844
+ "g7h8",
1845
+ "g7h8b",
1846
+ "g7h8n",
1847
+ "g7h8q",
1848
+ "g7h8r",
1849
+ "g8a2",
1850
+ "g8a8",
1851
+ "g8b3",
1852
+ "g8b8",
1853
+ "g8c4",
1854
+ "g8c8",
1855
+ "g8d5",
1856
+ "g8d8",
1857
+ "g8e6",
1858
+ "g8e7",
1859
+ "g8e8",
1860
+ "g8f6",
1861
+ "g8f7",
1862
+ "g8f8",
1863
+ "g8g1",
1864
+ "g8g2",
1865
+ "g8g3",
1866
+ "g8g4",
1867
+ "g8g5",
1868
+ "g8g6",
1869
+ "g8g7",
1870
+ "g8h6",
1871
+ "g8h7",
1872
+ "g8h8",
1873
+ "h1a1",
1874
+ "h1a8",
1875
+ "h1b1",
1876
+ "h1b7",
1877
+ "h1c1",
1878
+ "h1c6",
1879
+ "h1d1",
1880
+ "h1d5",
1881
+ "h1e1",
1882
+ "h1e4",
1883
+ "h1f1",
1884
+ "h1f2",
1885
+ "h1f3",
1886
+ "h1g1",
1887
+ "h1g2",
1888
+ "h1g3",
1889
+ "h1h2",
1890
+ "h1h3",
1891
+ "h1h4",
1892
+ "h1h5",
1893
+ "h1h6",
1894
+ "h1h7",
1895
+ "h1h8",
1896
+ "h2a2",
1897
+ "h2b2",
1898
+ "h2b8",
1899
+ "h2c2",
1900
+ "h2c7",
1901
+ "h2d2",
1902
+ "h2d6",
1903
+ "h2e2",
1904
+ "h2e5",
1905
+ "h2f1",
1906
+ "h2f2",
1907
+ "h2f3",
1908
+ "h2f4",
1909
+ "h2g1",
1910
+ "h2g1b",
1911
+ "h2g1n",
1912
+ "h2g1q",
1913
+ "h2g1r",
1914
+ "h2g2",
1915
+ "h2g3",
1916
+ "h2g4",
1917
+ "h2h1",
1918
+ "h2h1b",
1919
+ "h2h1n",
1920
+ "h2h1q",
1921
+ "h2h1r",
1922
+ "h2h3",
1923
+ "h2h4",
1924
+ "h2h5",
1925
+ "h2h6",
1926
+ "h2h7",
1927
+ "h2h8",
1928
+ "h3a3",
1929
+ "h3b3",
1930
+ "h3c3",
1931
+ "h3c8",
1932
+ "h3d3",
1933
+ "h3d7",
1934
+ "h3e3",
1935
+ "h3e6",
1936
+ "h3f1",
1937
+ "h3f2",
1938
+ "h3f3",
1939
+ "h3f4",
1940
+ "h3f5",
1941
+ "h3g1",
1942
+ "h3g2",
1943
+ "h3g3",
1944
+ "h3g4",
1945
+ "h3g5",
1946
+ "h3h1",
1947
+ "h3h2",
1948
+ "h3h4",
1949
+ "h3h5",
1950
+ "h3h6",
1951
+ "h3h7",
1952
+ "h3h8",
1953
+ "h4a4",
1954
+ "h4b4",
1955
+ "h4c4",
1956
+ "h4d4",
1957
+ "h4d8",
1958
+ "h4e1",
1959
+ "h4e4",
1960
+ "h4e7",
1961
+ "h4f2",
1962
+ "h4f3",
1963
+ "h4f4",
1964
+ "h4f5",
1965
+ "h4f6",
1966
+ "h4g2",
1967
+ "h4g3",
1968
+ "h4g4",
1969
+ "h4g5",
1970
+ "h4g6",
1971
+ "h4h1",
1972
+ "h4h2",
1973
+ "h4h3",
1974
+ "h4h5",
1975
+ "h4h6",
1976
+ "h4h7",
1977
+ "h4h8",
1978
+ "h5a5",
1979
+ "h5b5",
1980
+ "h5c5",
1981
+ "h5d1",
1982
+ "h5d5",
1983
+ "h5e2",
1984
+ "h5e5",
1985
+ "h5e8",
1986
+ "h5f3",
1987
+ "h5f4",
1988
+ "h5f5",
1989
+ "h5f6",
1990
+ "h5f7",
1991
+ "h5g3",
1992
+ "h5g4",
1993
+ "h5g5",
1994
+ "h5g6",
1995
+ "h5g7",
1996
+ "h5h1",
1997
+ "h5h2",
1998
+ "h5h3",
1999
+ "h5h4",
2000
+ "h5h6",
2001
+ "h5h7",
2002
+ "h5h8",
2003
+ "h6a6",
2004
+ "h6b6",
2005
+ "h6c1",
2006
+ "h6c6",
2007
+ "h6d2",
2008
+ "h6d6",
2009
+ "h6e3",
2010
+ "h6e6",
2011
+ "h6f4",
2012
+ "h6f5",
2013
+ "h6f6",
2014
+ "h6f7",
2015
+ "h6f8",
2016
+ "h6g4",
2017
+ "h6g5",
2018
+ "h6g6",
2019
+ "h6g7",
2020
+ "h6g8",
2021
+ "h6h1",
2022
+ "h6h2",
2023
+ "h6h3",
2024
+ "h6h4",
2025
+ "h6h5",
2026
+ "h6h7",
2027
+ "h6h8",
2028
+ "h7a7",
2029
+ "h7b1",
2030
+ "h7b7",
2031
+ "h7c2",
2032
+ "h7c7",
2033
+ "h7d3",
2034
+ "h7d7",
2035
+ "h7e4",
2036
+ "h7e7",
2037
+ "h7f5",
2038
+ "h7f6",
2039
+ "h7f7",
2040
+ "h7f8",
2041
+ "h7g5",
2042
+ "h7g6",
2043
+ "h7g7",
2044
+ "h7g8",
2045
+ "h7g8b",
2046
+ "h7g8n",
2047
+ "h7g8q",
2048
+ "h7g8r",
2049
+ "h7h1",
2050
+ "h7h2",
2051
+ "h7h3",
2052
+ "h7h4",
2053
+ "h7h5",
2054
+ "h7h6",
2055
+ "h7h8",
2056
+ "h7h8b",
2057
+ "h7h8n",
2058
+ "h7h8q",
2059
+ "h7h8r",
2060
+ "h8a1",
2061
+ "h8a8",
2062
+ "h8b2",
2063
+ "h8b8",
2064
+ "h8c3",
2065
+ "h8c8",
2066
+ "h8d4",
2067
+ "h8d8",
2068
+ "h8e5",
2069
+ "h8e8",
2070
+ "h8f6",
2071
+ "h8f7",
2072
+ "h8f8",
2073
+ "h8g6",
2074
+ "h8g7",
2075
+ "h8g8",
2076
+ "h8h1",
2077
+ "h8h2",
2078
+ "h8h3",
2079
+ "h8h4",
2080
+ "h8h5",
2081
+ "h8h6",
2082
+ "h8h7"
2083
+ ]
2084
+ }