From 38191db932984bf97ff8ad078b616b94fde702b2 Mon Sep 17 00:00:00 2001 From: Dnomd343 Date: Sat, 25 Jan 2025 18:03:14 +0800 Subject: [PATCH] feat: verify classic klotski serial number --- verify/classic.json | 1359 +++++++++++++++++++++++++++++++++++++++++++ verify/classic.py | 26 +- verify/verify.py | 198 +++++++ 3 files changed, 1571 insertions(+), 12 deletions(-) create mode 100644 verify/classic.json create mode 100755 verify/verify.py diff --git a/verify/classic.json b/verify/classic.json new file mode 100644 index 0000000..ceea528 --- /dev/null +++ b/verify/classic.json @@ -0,0 +1,1359 @@ +{ + "DFEAB20": "0-00M-000X", + "DBFAB80": "0-00M-000Y", + "DABB0EC": "0-00M-000ZL", + "DEA83BC": "0-00M-000ZR", + "DAAFF20": "0-00M-001X", + "DAAFF80": "0-00M-001Y", + "DAAC3BC": "0-00M-001ZL", + "DAAC3EC": "0-00M-001ZR", + "DAEBF20": "0-00M-002X", + "DBABF80": "0-00M-002Y", + "DAA83FC": "0-00M-002ZL", + "DAAC2FC": "0-00M-002ZR", + "DEABF20": "0-00M-003X", + "DABBF80": "0-00M-003Y", + "DABA0FC": "0-00M-003ZL", + "DEA82FC": "0-00M-003ZR", + "DFFAA20": "0-00M-004X", + "DFFAA80": "0-00M-004Y", + "DAEE0BC": "0-00M-004ZL", + "DBAE0BC": "0-00M-004ZR", + "DAAFE0C": "0-00M-005X", + "DAABF30": "0-00M-005Y", + "DEBA0BC": "0-00M-005ZL", + "DEBA0EC": "0-00M-005ZR", + "DABBF20": "0-00M-006X", + "DEABF80": "0-00M-006Y", + "DABE0BC": "0-00M-006ZL", + "DEAE0BC": "0-00M-006ZR", + "DBEAF20": "0-00M-007X", + "DBEAF80": "0-00M-007Y", + "DABB0BC": "0-00M-007ZL", + "DEA83EC": "0-00M-007ZR", + "DFAAF20": "0-00M-008X", + "DAFAF80": "0-00M-008Y", + "DAEF0AC": "0-00M-008ZL", + "DBAE0EC": "0-00M-008ZR", + "DBABF20": "0-00M-009X", + "DAEBF80": "0-00M-009Y", + "DBBE82C": "0-00M-009ZL", + "DEEB0AC": "0-00M-009ZR", + "DEBAF20": "0-00M-010X", + "DEBAF80": "0-00M-010Y", + "DABF0AC": "0-00M-010ZL", + "DEAE0EC": "0-00M-010ZR", + "DEEAF20": "0-00M-011X", + "DBBAF80": "0-00M-011Y", + "DEBB0AC": "0-00M-011ZL", + "DEBE82C": "0-00M-011ZR", + "DAEBE0C": "0-00M-012X", + "DBAAF30": "0-00M-012Y", + "DABE0EC": "0-00M-012ZL", + "DEAF0AC": "0-00M-012ZR", + "DFEAA0C": "0-00M-013X", + "DBFAA30": "0-00M-013Y", + "DAEE0EC": "0-00M-013ZL", + "DBAF0AC": "0-00M-013ZR", + "DBFAB20": "0-00M-014X", + "DFEAB80": "0-00M-014Y", + "DAFE82C": "0-00M-014ZL", + "DFAB0AC": "0-00M-014ZR", + "DAFAF20": "0-00M-015X", + "DFAAF80": "0-00M-015Y", + "DABF0E8": "0-00M-015ZL", + "DEAF0E8": "0-00M-015ZR", + "DFAAE0C": "0-00M-016X", + "DAFAB30": "0-00M-016Y", + "DAEF0E8": "0-00M-016ZL", + "DBAF0E8": "0-00M-016ZR", + "DFBAB20": "0-00M-017X", + "DEFAB80": "0-00M-017Y", + "DAFEC28": "0-00M-017ZL", + "DFAB0E8": "0-00M-017ZR", + "DEABE0C": "0-00M-018X", + "DABAF30": "0-00M-018Y", + "DBBEC28": "0-00M-018ZL", + "DEEB0E8": "0-00M-018ZR", + "DBEAE0C": "0-00M-019X", + "DBEAB30": "0-00M-019Y", + "DEBB0E8": "0-00M-019ZL", + "DEBEC28": "0-00M-019ZR", + "DEEAE0C": "0-00M-020X", + "DBBAB30": "0-00M-020Y", + "DEFB828": "0-00M-020ZL", + "DFBB828": "0-00M-020ZR", + "DBBAF20": "0-00M-021X", + "DEEAF80": "0-00M-021Y", + "DEFAB20": "0-00M-022X", + "DFBAB80": "0-00M-022Y", + "DBABE0C": "0-00M-023X", + "DAEAF30": "0-00M-023Y", + "DAAF4CC": "1-00M-000X", + "DAA7F30": "1-00M-000Y", + "DBE60EC": "1-00M-000ZL", + "DBE70AC": "1-00M-000ZR", + "DBAB4CC": "1-00M-001X", + "DAE9F30": "1-00M-001Y", + "DBF682C": "1-00M-001ZL", + "DFE90AC": "1-00M-001ZR", + "DAFED20": "1-00M-002X", + "DFAB780": "1-00M-002Y", + "DAF60EC": "1-00M-002ZL", + "DFA70AC": "1-00M-002ZR", + "DAEF720": "1-00M-003X", + "DBAF780": "1-00M-003Y", + "DFAA4CC": "1-00M-004X", + "DAFA730": "1-00M-004Y", + "DEAB4CC": "1-00M-005X", + "DAB9F30": "1-00M-005Y", + "DEEB60C": "1-00M-006X", + "DBBE930": "1-00M-006Y", + "DABFD20": "1-00M-007X", + "DEADF80": "1-00M-007Y", + "DAEFD20": "1-00M-008X", + "DBADF80": "1-00M-008Y", + "DBAFD20": "1-00M-009X", + "DAEDF80": "1-00M-009Y", + "DEAFD20": "1-00M-010X", + "DABDF80": "1-00M-010Y", + "DFAED20": "1-00M-011X", + "DAFB780": "1-00M-011Y", + "DEADE0C": "1-01M-000X", + "DABED30": "1-01M-000Y", + "D9BE0BC": "1-01M-000Z", + "DEEE720": "1-01M-001X", + "DBBBD80": "1-01M-001Y", + "D6EE0BC": "1-01M-001ZL", + "DE6E0EC": "1-01M-001ZR", + "DBEE720": "1-01M-002X", + "DBEBD80": "1-01M-002Y", + "DBE60BC": "1-01M-002Z", + "DBADF20": "1-01M-003X", + "DAEFD80": "1-01M-003Y", + "D6AC3BC": "1-01M-003ZL", + "DA7B0EC": "1-01M-003ZR", + "D6AFF20": "1-01M-004X", + "DA7BF80": "1-01M-004Y", + "D6AC2FC": "1-01M-004ZL", + "DA7A0FC": "1-01M-004ZR", + "D6EEF20": "1-01M-005X", + "DE6EF80": "1-01M-005Y", + "D6BE0BC": "1-01M-005ZL", + "DA7E0BC": "1-01M-005ZR", + "DBBE720": "1-01M-006X", + "DEEBD80": "1-01M-006Y", + "D6AC3EC": "1-01M-006ZL", + "DA7B0BC": "1-01M-006ZR", + "DEADF20": "1-01M-007X", + "DABFD80": "1-01M-007Y", + "D6EE0EC": "1-01M-007ZL", + "DE6E0BC": "1-01M-007ZR", + "DF6AE0C": "1-01M-008X", + "D7FAA30": "1-01M-008Y", + "D7AF0AC": "1-01M-008ZL", + "DB7E82C": "1-01M-008ZR", + "D6EBF20": "1-01M-009X", + "DE7AF80": "1-01M-009Y", + "D9BE0EC": "1-01M-009ZL", + "D9BF0AC": "1-01M-009ZR", + "D7AACCC": "1-01M-010X", + "DB6AF30": "1-01M-010Y", + "D9FE82C": "1-01M-010ZL", + "DDAF0AC": "1-01M-010ZR", + "DF6AF20": "1-01M-011X", + "D7FAB80": "1-01M-011Y", + "D6BE0EC": "1-01M-011ZL", + "DA7F0AC": "1-01M-011ZR", + "DBAF720": "1-01M-012X", + "DAEF780": "1-01M-012Y", + "D6EF0AC": "1-01M-012ZL", + "DE7E82C": "1-01M-012ZR", + "D9EACCC": "1-01M-013X", + "DDAAF30": "1-01M-013Y", + "D6FE82C": "1-01M-013ZL", + "DE6F0AC": "1-01M-013ZR", + "DABDF20": "1-01M-014X", + "DEAFD80": "1-01M-014Y", + "D6BF0AC": "1-01M-014ZL", + "DA7E0EC": "1-01M-014ZR", + "D6AFE0C": "1-01M-015X", + "DA7AF30": "1-01M-015Y", + "DAF70AC": "1-01M-015ZL", + "DFA60EC": "1-01M-015ZR", + "DDEA8CC": "1-01M-016X", + "DDEAB30": "1-01M-016Y", + "D6BF0E8": "1-01M-016ZL", + "DA7F0E8": "1-01M-016ZR", + "DDEAE0C": "1-01M-017X", + "DDFAA30": "1-01M-017Y", + "D6EF0E8": "1-01M-017ZL", + "DE7EC28": "1-01M-017ZR", + "DDBAF20": "1-01M-018X", + "D9EBF80": "1-01M-018Y", + "D6FEC28": "1-01M-018ZL", + "DE6F0E8": "1-01M-018ZR", + "D7BAF20": "1-01M-019X", + "DB6BF80": "1-01M-019Y", + "D7AF0E8": "1-01M-019ZL", + "DB7EC28": "1-01M-019ZR", + "D9AFE0C": "1-01M-020X", + "D9BAF30": "1-01M-020Y", + "D7EF828": "1-01M-020ZL", + "DF6F828": "1-01M-020ZR", + "DAEDF20": "1-01M-021X", + "DBAFD80": "1-01M-021Y", + "D9BF0E8": "1-01M-021Z", + "DDEEB20": "1-01M-022X", + "DDEBB80": "1-01M-022Y", + "D9FEC28": "1-01M-022ZL", + "DDAF0E8": "1-01M-022ZR", + "DDAEE0C": "1-01M-023X", + "D9EEB30": "1-01M-023Y", + "DAF70E8": "1-01M-023ZL", + "DFA70E8": "1-01M-023ZR", + "D6EACCC": "1-01M-024X", + "DE6AF30": "1-01M-024Y", + "DBE70E8": "1-01M-024Z", + "DEBE720": "1-01M-025X", + "DEBBD80": "1-01M-025Y", + "DBF6C28": "1-01M-025ZL", + "DFE90E8": "1-01M-025ZR", + "DAE9CCC": "1-01M-026X", + "DBAB730": "1-01M-026Y", + "DDEF828": "1-01M-026Z", + "DF6A8CC": "1-01M-027X", + "D7EAB30": "1-01M-027Y", + "DEF90E8": "1-01M-027ZL", + "DFB6C28": "1-01M-027ZR", + "D9EBE0C": "1-01M-028X", + "DDBAB30": "1-01M-028Y", + "DFF9828": "1-01M-028Z", + "DDAACCC": "1-01M-029X", + "D9EAF30": "1-01M-029Y", + "DBFE920": "1-01M-030X", + "DFEAD80": "1-01M-030Y", + "D7EA8CC": "1-01M-031X", + "DF6AB30": "1-01M-031Y", + "D7FAB20": "1-01M-032X", + "DF6AF80": "1-01M-032Y", + "DB6BE0C": "1-01M-033X", + "D7BAB30": "1-01M-033Y", + "DDFAB20": "1-01M-034X", + "DDEAF80": "1-01M-034Y", + "D7AEF20": "1-01M-035X", + "DB6EF80": "1-01M-035Y", + "D9AFF20": "1-01M-036X", + "D9BBF80": "1-01M-036Y", + "D9EEF20": "1-01M-037X", + "DDAEF80": "1-01M-037Y", + "D6EBE0C": "1-01M-038X", + "DE7AB30": "1-01M-038Y", + "DB6EF20": "1-01M-039X", + "D7AEF80": "1-01M-039Y", + "D6BBF20": "1-01M-040X", + "DA6FF80": "1-01M-040Y", + "D6FAF20": "1-01M-041X", + "DE6BF80": "1-01M-041Y", + "DAA7CCC": "1-01M-042X", + "DAAF730": "1-01M-042Y", + "DA6FE0C": "1-01M-043X", + "D6BAF30": "1-01M-043Y", + "DDAEF20": "1-01M-044X", + "D9EEF80": "1-01M-044Y", + "DDEAF20": "1-01M-045X", + "DDFAB80": "1-01M-045Y", + "D9ABCCC": "1-01M-046X", + "D9ABF30": "1-01M-046Y", + "DF6BB20": "1-01M-047X", + "D7EEB80": "1-01M-047Y", + "DB6BF20": "1-01M-048X", + "D7BAF80": "1-01M-048Y", + "DDEBB20": "1-01M-049X", + "DDEEB80": "1-01M-049Y", + "DBEE60C": "1-01M-050X", + "DBEB930": "1-01M-050Y", + "DEBB720": "1-01M-051X", + "DEBED80": "1-01M-051Y", + "DBBED20": "1-01M-052X", + "DEEB780": "1-01M-052Y", + "D6ABCCC": "1-01M-053X", + "DA6BF30": "1-01M-053Y", + "D7BAE0C": "1-01M-054X", + "DB6BB30": "1-01M-054Y", + "D7EAE0C": "1-01M-055X", + "DF7AA30": "1-01M-055Y", + "DE6BE0C": "1-01M-056X", + "D6FAB30": "1-01M-056Y", + "DAFB720": "1-01M-057X", + "DFAED80": "1-01M-057Y", + "DEFE920": "1-01M-058X", + "DFBAD80": "1-01M-058Y", + "DDABF20": "1-01M-059X", + "D9FAF80": "1-01M-059Y", + "DB6ACCC": "1-01M-060X", + "D7AAF30": "1-01M-060Y", + "D7ABF20": "1-01M-061X", + "DB7AF80": "1-01M-061Y", + "DAFA4CC": "1-01M-062X", + "DFAA730": "1-01M-062Y", + "D9BBF20": "1-01M-063X", + "D9AFF80": "1-01M-063Y", + "DAFB60C": "1-01M-064X", + "DFAE930": "1-01M-064Y", + "D7EBB20": "1-01M-065X", + "DF6EB80": "1-01M-065Y", + "DDABE0C": "1-01M-066X", + "D9FAB30": "1-01M-066Y", + "D7EEB20": "1-01M-067X", + "DF6BB80": "1-01M-067Y", + "D9EBF20": "1-01M-068X", + "DDBAF80": "1-01M-068Y", + "DF7AB20": "1-01M-069X", + "D7EAF80": "1-01M-069Y", + "DBADE0C": "1-01M-070X", + "DAEED30": "1-01M-070Y", + "DEEE60C": "1-01M-071X", + "DBBB930": "1-01M-071Y", + "D9BBE0C": "1-01M-072X", + "D9AEF30": "1-01M-072Y", + "D7EAF20": "1-01M-073X", + "DF7AB80": "1-01M-073Y", + "DAB9CCC": "1-01M-074X", + "DEAB730": "1-01M-074Y", + "DA6FF20": "1-01M-075X", + "D6BBF80": "1-01M-075Y", + "DABDE0C": "1-01M-076X", + "DEAED30": "1-01M-076Y", + "DEFB920": "1-01M-077X", + "DFBB980": "1-01M-077Y", + "D9FAF20": "1-01M-078X", + "DDABF80": "1-01M-078Y", + "DA6BCCC": "1-01M-079X", + "D6ABF30": "1-01M-079Y", + "DE7AF20": "1-01M-080X", + "D6EBF80": "1-01M-080Y", + "D7AEE0C": "1-01M-081X", + "DB6EB30": "1-01M-081Y", + "DA7BF20": "1-01M-082X", + "D6AFF80": "1-01M-082Y", + "D7ABE0C": "1-01M-083X", + "DB7AB30": "1-01M-083Y", + "DE6BF20": "1-01M-084X", + "D6FAF80": "1-01M-084Y", + "DAEDE0C": "1-01M-085X", + "DBAED30": "1-01M-085Y", + "DFBB920": "1-01M-086X", + "DEFB980": "1-01M-086Y", + "D6BBE0C": "1-01M-087X", + "DA6EF30": "1-01M-087Y", + "DE6ACCC": "1-01M-088X", + "D6EAF30": "1-01M-088Y", + "DAFE720": "1-01M-089X", + "DFABD80": "1-01M-089Y", + "DEEB720": "1-01M-090X", + "DBBED80": "1-01M-090Y", + "DB7AF20": "1-01M-091X", + "D7ABF80": "1-01M-091Y", + "DFAB720": "1-01M-092X", + "DAFED80": "1-01M-092Y", + "DF6EB20": "1-01M-093X", + "D7EBB80": "1-01M-093Y", + "DE6EF20": "1-01M-094X", + "D6EEF80": "1-01M-094Y", + "DAEF60C": "1-01M-095X", + "DBAE730": "1-01M-095Y", + "DEBB60C": "1-01M-096X", + "DEBE930": "1-01M-096Y", + "DBEBD20": "1-01M-097X", + "DBEE780": "1-01M-097Y", + "DEBBD20": "1-01M-098X", + "DEBE780": "1-01M-098Y", + "DEEBD20": "1-01M-099X", + "DBBE780": "1-01M-099Y", + "DFABD20": "1-01M-100X", + "DAFE780": "1-01M-100Y", + "DFBAD20": "1-01M-101X", + "DEFE980": "1-01M-101Y", + "DFEAD20": "1-01M-102X", + "DBFE980": "1-01M-102Y", + "DEAF720": "1-02L-000X", + "DABB730": "1-02L-000Y", + "DEBA730": "1-02L-001Y", + "DEA9CCC": "1-02R-000X", + "DABF780": "1-02R-000Y", + "DEBA4CC": "1-02R-001X", + "DAADCCC": "1-03L-000X", + "DABE730": "1-03L-000Y", + "DABB4CC": "1-03L-001X", + "DEAF60C": "1-03R-000X", + "DAADF30": "1-03R-000Y", + "DEA9F30": "1-03R-001Y", + "DABF720": "1-04L-000X", + "DAEE730": "1-04L-000Y", + "DABF60C": "1-04L-001X", + "DAFE930": "1-04L-001Y", + "DBAF60C": "1-04R-000X", + "DEAF780": "1-04R-000Y", + "DFAB60C": "1-04R-001X", + "DEAE730": "1-04R-001Y", + "D9EBB30": "1-05L-000Y", + "DDBAE0C": "1-05R-000X", + "DEBB780": "1-06L-000Y", + "DEBED20": "1-06R-000X", + "DAF60BC": "1-07L-000Z", + "DFA60BC": "1-07R-000Z", + "DEF90AC": "1-08L-000Z", + "DFB682C": "1-08R-000Z", + "DBBBD20": "1-09L-000X", + "DEEE780": "1-09R-000Y", + "D9AF4CC": "2-00M-000X", + "D9B9F30": "2-00M-000Y", + "D5BE0BC": "2-00M-000ZL", + "D5BE0EC": "2-00M-000ZR", + "D6AF4CC": "2-00M-001X", + "DA79F30": "2-00M-001Y", + "D69C3EC": "2-00M-001ZL", + "DA5C3BC": "2-00M-001ZR", + "D6BDE0C": "2-00M-002X", + "DA7ED30": "2-00M-002Y", + "D6DB0EC": "2-00M-002ZL", + "DE643BC": "2-00M-002ZR", + "D6BDF20": "2-00M-003X", + "DA7FD80": "2-00M-003Y", + "D9DB0EC": "2-00M-003ZL", + "DDA43BC": "2-00M-003ZR", + "D7A7F20": "2-00M-004X", + "DB5BF80": "2-00M-004Y", + "D69C2FC": "2-00M-004ZL", + "DA583FC": "2-00M-004ZR", + "D6DBF20": "2-00M-005X", + "DE67F80": "2-00M-005Y", + "D9983FC": "2-00M-005ZL", + "D99C2FC": "2-00M-005ZR", + "D9BF720": "2-00M-006X", + "D9BF780": "2-00M-006Y", + "D7A43BC": "2-00M-006ZL", + "DB5B0EC": "2-00M-006ZR", + "D5BBE0C": "2-00M-007X", + "D5EEB30": "2-00M-007Y", + "D6983FC": "2-00M-007ZL", + "DA5C2FC": "2-00M-007ZR", + "DDA7F20": "2-00M-008X", + "D9DBF80": "2-00M-008Y", + "D99C3BC": "2-00M-008ZL", + "D99C3EC": "2-00M-008ZR", + "D6FE720": "2-00M-009X", + "DE6FD80": "2-00M-009Y", + "D9DA0FC": "2-00M-009ZL", + "DDA42FC": "2-00M-009ZR", + "DFA5F20": "2-00M-010X", + "DAF7D80": "2-00M-010Y", + "D7A42FC": "2-00M-010ZL", + "DB5A0FC": "2-00M-010ZR", + "D99FF20": "2-00M-011X", + "D99FF80": "2-00M-011Y", + "D69C3BC": "2-00M-011ZL", + "DA5C3EC": "2-00M-011ZR", + "D7BE720": "2-00M-012X", + "DB6FD80": "2-00M-012Y", + "D9DE0BC": "2-00M-012ZL", + "DDB60BC": "2-00M-012ZR", + "DFE6720": "2-00M-013X", + "DBF9D80": "2-00M-013Y", + "D7B60BC": "2-00M-013ZL", + "DB5E0BC": "2-00M-013ZR", + "D69FF20": "2-00M-014X", + "DA5FF80": "2-00M-014Y", + "D7E60BC": "2-00M-014ZL", + "DF660EC": "2-00M-014ZR", + "D9B9CCC": "2-00M-015X", + "D9AF730": "2-00M-015Y", + "D6DA0FC": "2-00M-015ZL", + "DE642FC": "2-00M-015ZR", + "D99FE0C": "2-00M-016X", + "D99BF30": "2-00M-016Y", + "DDE60BC": "2-00M-016ZL", + "DDE60EC": "2-00M-016ZR", + "DFF6920": "2-00M-017X", + "DFFA580": "2-00M-017Y", + "D9DB0BC": "2-00M-017ZL", + "DDA43EC": "2-00M-017ZR", + "D9FB60C": "2-00M-018X", + "DDBB930": "2-00M-018Y", + "D79E0BC": "2-00M-018ZL", + "DB760BC": "2-00M-018ZR", + "D5EEF20": "2-00M-019X", + "D5BBF80": "2-00M-019Y", + "D7A43EC": "2-00M-019ZL", + "DB5B0BC": "2-00M-019ZR", + "D9FA4CC": "2-00M-020X", + "DDAB730": "2-00M-020Y", + "D7E60EC": "2-00M-020ZL", + "DF660BC": "2-00M-020ZR", + "DBF6D20": "2-00M-021X", + "DFE9780": "2-00M-021Y", + "D6DB0BC": "2-00M-021ZL", + "DE643EC": "2-00M-021ZR", + "D9DBF20": "2-00M-022X", + "DDA7F80": "2-00M-022Y", + "D7B60EC": "2-00M-022ZL", + "DB5F0AC": "2-00M-022ZR", + "DBE5F20": "2-00M-023X", + "DBE7D80": "2-00M-023Y", + "D9DF0AC": "2-00M-023ZL", + "DDB60EC": "2-00M-023ZR", + "D5EBE0C": "2-00M-024X", + "D5EBB30": "2-00M-024Y", + "D5BF0AC": "2-00M-024ZL", + "D5FE82C": "2-00M-024ZR", + "DFF9920": "2-00M-025X", + "DFF9980": "2-00M-025Y", + "D79F0AC": "2-00M-025ZL", + "DB760EC": "2-00M-025ZR", + "D69FE0C": "2-00M-026X", + "DA5BF30": "2-00M-026Y", + "D9F60EC": "2-00M-026ZL", + "DD9F0AC": "2-00M-026ZR", + "DDBE720": "2-00M-027X", + "D9EFD80": "2-00M-027Y", + "D7E70AC": "2-00M-027ZL", + "DF7682C": "2-00M-027ZR", + "D9BDF20": "2-00M-028X", + "D9BFD80": "2-00M-028Y", + "DDE70AC": "2-00M-028ZL", + "DDF682C": "2-00M-028ZR", + "D7FE920": "2-00M-029X", + "DF6BD80": "2-00M-029Y", + "D7B70AC": "2-00M-029ZL", + "DB5E0EC": "2-00M-029ZR", + "D79BF20": "2-00M-030X", + "DB67F80": "2-00M-030Y", + "D7F682C": "2-00M-030ZL", + "DF670AC": "2-00M-030ZR", + "DB7B60C": "2-00M-031X", + "D7BB930": "2-00M-031Y", + "D9DE0EC": "2-00M-031ZL", + "DDB70AC": "2-00M-031ZR", + "DB5BF20": "2-00M-032X", + "D7A7F80": "2-00M-032Y", + "D6DE0EC": "2-00M-032ZL", + "DE770AC": "2-00M-032ZR", + "DA5FF20": "2-00M-033X", + "D69FF80": "2-00M-033Y", + "D79E0EC": "2-00M-033ZL", + "DB770AC": "2-00M-033ZR", + "DD9BE0C": "2-00M-034X", + "D9E6F30": "2-00M-034Y", + "D7DE82C": "2-00M-034ZL", + "DF6D0AC": "2-00M-034ZR", + "DD9BF20": "2-00M-035X", + "D9E7F80": "2-00M-035Y", + "D7ED0AC": "2-00M-035ZL", + "DF5E82C": "2-00M-035ZR", + "D7A7E0C": "2-00M-036X", + "DB5AF30": "2-00M-036Y", + "D9F70AC": "2-00M-036ZL", + "DD9E0EC": "2-00M-036ZR", + "D5EBF20": "2-00M-037X", + "D5EBF80": "2-00M-037Y", + "DDDE82C": "2-00M-037ZL", + "DDED0AC": "2-00M-037ZR", + "D7E6F20": "2-00M-038X", + "DF66F80": "2-00M-038Y", + "D5BF0E8": "2-00M-038ZL", + "D5FEC28": "2-00M-038ZR", + "D79BE0C": "2-00M-039X", + "DB66F30": "2-00M-039Y", + "D6DF0E8": "2-00M-039ZL", + "DE770E8": "2-00M-039ZR", + "DB7A4CC": "2-00M-040X", + "D7AB730": "2-00M-040Y", + "D79F0E8": "2-00M-040ZL", + "DB770E8": "2-00M-040ZR", + "DE67F20": "2-00M-041X", + "D6DBF80": "2-00M-041Y", + "D7B70E8": "2-00M-041ZL", + "DB5F0E8": "2-00M-041ZR", + "DFB6720": "2-00M-042X", + "DEF9D80": "2-00M-042Y", + "D7DEC28": "2-00M-042ZL", + "DF6D0E8": "2-00M-042ZR", + "DFE9720": "2-00M-043X", + "DBF6D80": "2-00M-043Y", + "D7E70E8": "2-00M-043ZL", + "DF76C28": "2-00M-043ZR", + "DF66F20": "2-00M-044X", + "D7E6F80": "2-00M-044Y", + "D7ED0E8": "2-00M-044ZL", + "DF5EC28": "2-00M-044ZR", + "DDE6F20": "2-00M-045X", + "DDE6F80": "2-00M-045Y", + "D7F6C28": "2-00M-045ZL", + "DF670E8": "2-00M-045ZR", + "DBF6720": "2-00M-046X", + "DFE9D80": "2-00M-046Y", + "D9DF0E8": "2-00M-046ZL", + "DDB70E8": "2-00M-046ZR", + "DDFE920": "2-00M-047X", + "DDEBD80": "2-00M-047Y", + "D9F70E8": "2-00M-047ZL", + "DD9F0E8": "2-00M-047ZR", + "D9FB720": "2-00M-048X", + "DDBBD80": "2-00M-048Y", + "DDDEC28": "2-00M-048ZL", + "DDED0E8": "2-00M-048ZR", + "DB7B720": "2-00M-049X", + "D7BBD80": "2-00M-049Y", + "DDE70E8": "2-00M-049ZL", + "DDF6C28": "2-00M-049ZR", + "DDAF720": "2-00M-050X", + "D9FED80": "2-00M-050Y", + "DAF5F20": "2-00M-051X", + "DFA7D80": "2-00M-051Y", + "DFE660C": "2-00M-052X", + "DBF9930": "2-00M-052Y", + "DDA7E0C": "2-00M-053X", + "D9DAF30": "2-00M-053Y", + "DE7B720": "2-00M-054X", + "D6FBD80": "2-00M-054Y", + "D7DAF20": "2-00M-055X", + "DF69F80": "2-00M-055Y", + "D7AF720": "2-00M-056X", + "DB7ED80": "2-00M-056Y", + "DB7ED20": "2-00M-057X", + "D7AF780": "2-00M-057Y", + "D9FE720": "2-00M-058X", + "DDAFD80": "2-00M-058Y", + "D5EACCC": "2-00M-059X", + "D5ABF30": "2-00M-059Y", + "D5ABCCC": "2-00M-060X", + "D5EAF30": "2-00M-060Y", + "DA7DF20": "2-00M-061X", + "D6BFD80": "2-00M-061Y", + "D9BDE0C": "2-00M-062X", + "D9BED30": "2-00M-062Y", + "DA6DCCC": "2-00M-063X", + "D6BB730": "2-00M-063Y", + "D5BACCC": "2-00M-064X", + "D5AEF30": "2-00M-064Y", + "DDEF920": "2-00M-065X", + "DDEF980": "2-00M-065Y", + "DDBE60C": "2-00M-066X", + "D9EF930": "2-00M-066Y", + "DBE5E0C": "2-00M-067X", + "DBE6D30": "2-00M-067Y", + "DA5FE0C": "2-00M-068X", + "D69BF30": "2-00M-068Y", + "D7BE60C": "2-00M-069X", + "DB6F930": "2-00M-069Y", + "DB67F20": "2-00M-070X", + "D79BF80": "2-00M-070Y", + "D6EB4CC": "2-00M-071X", + "DE7A730": "2-00M-071Y", + "DF69F20": "2-00M-072X", + "D7DAF80": "2-00M-072Y", + "DDDAF20": "2-00M-073X", + "DDE9F80": "2-00M-073Y", + "DF7E920": "2-00M-074X", + "D7EBD80": "2-00M-074Y", + "DFA5E0C": "2-00M-075X", + "DAF6D30": "2-00M-075Y", + "DBE7720": "2-00M-076X", + "DBE7780": "2-00M-076Y", + "D9FED20": "2-00M-077X", + "DDAF780": "2-00M-077Y", + "D5BBF20": "2-00M-078X", + "D5EEF80": "2-00M-078Y", + "D7EF920": "2-00M-079X", + "DF6F980": "2-00M-079Y", + "D6BB4CC": "2-00M-080X", + "DA6DF30": "2-00M-080Y", + "DF5AF20": "2-00M-081X", + "D7E9F80": "2-00M-081Y", + "DB7E720": "2-00M-082X", + "D7AFD80": "2-00M-082Y", + "D5AFE0C": "2-00M-083X", + "D5FAB30": "2-00M-083Y", + "D7AB4CC": "2-00M-084X", + "DB7A730": "2-00M-084Y", + "DA7DE0C": "2-00M-085X", + "D6BED30": "2-00M-085Y", + "DF6F920": "2-00M-086X", + "D7EF980": "2-00M-086Y", + "D7E9F20": "2-00M-087X", + "DF5AF80": "2-00M-087Y", + "DE6F720": "2-00M-088X", + "D6FED80": "2-00M-088Y", + "DA7F720": "2-00M-089X", + "D6BF780": "2-00M-089Y", + "DE67E0C": "2-00M-090X", + "D6DAF30": "2-00M-090Y", + "DDAB4CC": "2-00M-091X", + "D9FA730": "2-00M-091Y", + "DA79CCC": "2-00M-092X", + "D6AF730": "2-00M-092Y", + "DE7ED20": "2-00M-093X", + "D6EF780": "2-00M-093Y", + "D5AFF20": "2-00M-094X", + "D5FAF80": "2-00M-094Y", + "DDE9F20": "2-00M-095X", + "DDDAF80": "2-00M-095Y", + "D5FAF20": "2-00M-096X", + "D5AFF80": "2-00M-096Y", + "D9BF60C": "2-00M-097X", + "D9BE730": "2-00M-097Y", + "D9E7F20": "2-00M-098X", + "DD9BF80": "2-00M-098Y", + "D6ADCCC": "2-00M-099X", + "DA7B730": "2-00M-099Y", + "DA7B4CC": "2-00M-100X", + "D6ADF30": "2-00M-100Y", + "DA7F60C": "2-00M-101X", + "D6BE730": "2-00M-101Y", + "DE6F60C": "2-00M-102X", + "D6FE930": "2-00M-102Y", + "D5AECCC": "2-00M-103X", + "D5BAF30": "2-00M-103Y", + "D5BEF20": "2-00M-104X", + "D5BEF80": "2-00M-104Y", + "DBE760C": "2-00M-105X", + "DBE6730": "2-00M-105Y", + "DE6E4CC": "2-00M-106X", + "D6EE730": "2-00M-106Y", + "D7AF60C": "2-00M-107X", + "DB7E930": "2-00M-107Y", + "DE7A4CC": "2-00M-108X", + "D6EB730": "2-00M-108Y", + "DE7E720": "2-00M-109X", + "D6EFD80": "2-00M-109Y", + "DAF5E0C": "2-00M-110X", + "DFA6D30": "2-00M-110Y", + "D6EE4CC": "2-00M-111X", + "DE6E730": "2-00M-111Y", + "D6EF720": "2-00M-112X", + "DE7ED80": "2-00M-112Y", + "DDAF60C": "2-00M-113X", + "D9FE930": "2-00M-113Y", + "DFA7720": "2-00M-114X", + "DAF7780": "2-00M-114Y", + "DFB6D20": "2-00M-115X", + "DEF9780": "2-00M-115Y", + "D6FED20": "2-00M-116X", + "DE6F780": "2-00M-116Y", + "DAF760C": "2-00M-117X", + "DFA6730": "2-00M-117Y", + "DEF960C": "2-00M-118X", + "DFB6930": "2-00M-118Y", + "D6BF720": "2-00M-119X", + "DA7F780": "2-00M-119Y", + "DAF7720": "2-00M-120X", + "DFA7780": "2-00M-120Y", + "DEF9720": "2-00M-121X", + "DFB6D80": "2-00M-121Y", + "D6BF60C": "2-00M-122X", + "DA7E730": "2-00M-122Y", + "D7E9E0C": "2-00M-123X", + "DF5AB30": "2-00M-123Y", + "D9E7E0C": "2-00M-124X", + "DD9AF30": "2-00M-124Y", + "DB67E0C": "2-00M-125X", + "D79AF30": "2-00M-125Y", + "DDE9E0C": "2-00M-126X", + "DDDAB30": "2-00M-126Y", + "DF69E0C": "2-00M-127X", + "D7DAB30": "2-00M-127Y", + "DFE960C": "2-00M-128X", + "DBF6930": "2-00M-128Y", + "D6BFD20": "2-00M-129X", + "DA7DF80": "2-00M-129Y", + "D6EFD20": "2-00M-130X", + "DE7E780": "2-00M-130Y", + "D7AFD20": "2-00M-131X", + "DB7E780": "2-00M-131Y", + "D7BBD20": "2-00M-132X", + "DB7B780": "2-00M-132Y", + "D7EBD20": "2-00M-133X", + "DF7E980": "2-00M-133Y", + "D9BFD20": "2-00M-134X", + "D9BDF80": "2-00M-134Y", + "DA7FD20": "2-00M-135X", + "D6BDF80": "2-00M-135Y", + "DAF7D20": "2-00M-136X", + "DFA5F80": "2-00M-136Y", + "DBE7D20": "2-00M-137X", + "DBE5F80": "2-00M-137Y", + "DDAFD20": "2-00M-138X", + "D9FE780": "2-00M-138Y", + "DDBBD20": "2-00M-139X", + "D9FB780": "2-00M-139Y", + "DDEBD20": "2-00M-140X", + "DDFE980": "2-00M-140Y", + "DE6FD20": "2-00M-141X", + "D6FE780": "2-00M-141Y", + "DEF9D20": "2-00M-142X", + "DFB6780": "2-00M-142Y", + "DF6BD20": "2-00M-143X", + "D7FE980": "2-00M-143Y", + "DFA7D20": "2-00M-144X", + "DAF5F80": "2-00M-144Y", + "DFE9D20": "2-00M-145X", + "DBF6780": "2-00M-145Y", + "DFFA520": "2-00M-146X", + "DFF6980": "2-00M-146Y", + "DAED4CC": "2-01L-000X", + "DBAD4CC": "2-01L-001X", + "DABD4CC": "2-01L-002X", + "DEAD4CC": "2-01L-003X", + "DBAD730": "2-01R-000Y", + "DAED730": "2-01R-001Y", + "DEAD730": "2-01R-002Y", + "DABD730": "2-01R-003Y", + "D6FB930": "2-02L-000Y", + "DE7B60C": "2-02R-000X", + "D9F60BC": "2-03L-000Z", + "DD9E0BC": "2-03R-000Z", + "D6DE0BC": "2-04L-000Z", + "DE760BC": "2-04R-000Z", + "D6EF60C": "2-05L-000X", + "DE7E930": "2-05R-000Y", + "DAF6730": "2-06L-000Y", + "DFA760C": "2-06R-000X", + "D6DF0AC": "2-07L-000Z", + "DE760EC": "2-07R-000Z", + "D7BE780": "2-08L-000Y", + "DB6FD20": "2-08R-000X", + "DBF9D20": "2-09L-000X", + "DFE6780": "2-09R-000Y", + "D9EFD20": "2-10L-000X", + "DDBE780": "2-10R-000Y", + "D6FBD20": "2-11L-000X", + "DE7B780": "2-11R-000Y", + "DAFF520": "2-12L-000X", + "DFAF580": "2-12R-000Y", + "DAFF580": "2-13L-000Y", + "DFAF520": "2-13R-000X", + "DBBF520": "2-14L-000X", + "DEEF580": "2-14R-000Y", + "DBBF580": "2-15L-000Y", + "DEEF520": "2-15R-000X", + "DBEF520": "2-16L-000X", + "DBEF580": "2-16R-000Y", + "DEBF520": "2-17L-000X", + "DEBF580": "2-17R-000Y", + "DFA54CC": "3-00M-000X", + "DAF5730": "3-00M-000Y", + "D57B0EC": "3-00M-000ZL", + "D5B43BC": "3-00M-000ZR", + "D6BD4CC": "3-00M-001X", + "DA7D730": "3-00M-001Y", + "D59C3BC": "3-00M-001ZL", + "D5DB0EC": "3-00M-001ZR", + "DA5F4CC": "3-00M-002X", + "D697F30": "3-00M-002Y", + "D59C2FC": "3-00M-002ZL", + "D5DA0FC": "3-00M-002ZR", + "D99F4CC": "3-00M-003X", + "D997F30": "3-00M-003Y", + "D57A0FC": "3-00M-003ZL", + "D5B42FC": "3-00M-003ZR", + "D697CCC": "3-00M-004X", + "DA5F730": "3-00M-004Y", + "D5DE0BC": "3-00M-004Z", + "D69F4CC": "3-00M-005X", + "DA57F30": "3-00M-005Y", + "D57B0BC": "3-00M-005ZL", + "D5B43EC": "3-00M-005ZR", + "D7A74CC": "3-00M-006X", + "DB59F30": "3-00M-006Y", + "D57E0BC": "3-00M-006ZL", + "D5F60BC": "3-00M-006ZR", + "DDA74CC": "3-00M-007X", + "D9D9F30": "3-00M-007Y", + "D59C3EC": "3-00M-007ZL", + "D5DB0BC": "3-00M-007ZR", + "DDDB60C": "3-00M-008X", + "DDF9930": "3-00M-008Y", + "D57F0AC": "3-00M-008ZL", + "D5F60EC": "3-00M-008ZR", + "D56FE0C": "3-00M-009X", + "D5E6F30": "3-00M-009Y", + "D5DE0EC": "3-00M-009ZL", + "D5DF0AC": "3-00M-009ZR", + "D799CCC": "3-00M-010X", + "DB67730": "3-00M-010Y", + "D57E0EC": "3-00M-010ZL", + "D5F70AC": "3-00M-010ZR", + "D9BD4CC": "3-00M-011X", + "D9BD730": "3-00M-011Y", + "D7D60EC": "3-00M-011ZL", + "DF570AC": "3-00M-011ZR", + "D6DDF20": "3-00M-012X", + "DE77D80": "3-00M-012Y", + "D7D70AC": "3-00M-012ZL", + "DF560EC": "3-00M-012ZR", + "D6D9CCC": "3-00M-013X", + "DE67730": "3-00M-013Y", + "DDD60EC": "3-00M-013ZL", + "DDD70AC": "3-00M-013ZR", + "DDDB720": "3-00M-014X", + "DDF9D80": "3-00M-014Y", + "D57F0E8": "3-00M-014ZL", + "D5F70E8": "3-00M-014ZR", + "D7DA4CC": "3-00M-015X", + "DF69730": "3-00M-015Y", + "D5DF0E8": "3-00M-015Z", + "DF5B60C": "3-00M-016X", + "D7F9930": "3-00M-016Y", + "D7D70E8": "3-00M-016ZL", + "DF570E8": "3-00M-016ZR", + "DDDA4CC": "3-00M-017X", + "DDE9730": "3-00M-017Y", + "DDD70E8": "3-00M-017Z", + "D7DB720": "3-00M-018X", + "DF79D80": "3-00M-018Y", + "D6DDE0C": "3-00M-019X", + "DE76D30": "3-00M-019Y", + "DD99CCC": "3-00M-020X", + "D9E7730": "3-00M-020Y", + "DB75F20": "3-00M-021X", + "D79FD80": "3-00M-021Y", + "D56BCCC": "3-00M-022X", + "D5A7F30": "3-00M-022Y", + "DDB5F20": "3-00M-023X", + "D9DFD80": "3-00M-023Y", + "D9DDF20": "3-00M-024X", + "DDB7D80": "3-00M-024Y", + "DF5B720": "3-00M-025X", + "D7F9D80": "3-00M-025Y", + "D7B5F20": "3-00M-026X", + "DB5FD80": "3-00M-026Y", + "D9F5F20": "3-00M-027X", + "DD9FD80": "3-00M-027Y", + "DD9DF20": "3-00M-028X", + "D9F7D80": "3-00M-028Y", + "DF5A4CC": "3-00M-029X", + "D7E9730": "3-00M-029Y", + "DB5DF20": "3-00M-030X", + "D7B7D80": "3-00M-030Y", + "D5FA4CC": "3-00M-031X", + "D5AF730": "3-00M-031Y", + "D79DF20": "3-00M-032X", + "DB77D80": "3-00M-032Y", + "DDB7720": "3-00M-033X", + "D9DF780": "3-00M-033Y", + "D5FB60C": "3-00M-034X", + "D5EF930": "3-00M-034Y", + "D7DB60C": "3-00M-035X", + "DF79930": "3-00M-035Y", + "DDF6D20": "3-00M-036X", + "DDE7780": "3-00M-036Y", + "DE75F20": "3-00M-037X", + "D6DFD80": "3-00M-037Y", + "DDF6720": "3-00M-038X", + "DDE7D80": "3-00M-038Y", + "D56FF20": "3-00M-039X", + "D5E7F80": "3-00M-039Y", + "D5FB720": "3-00M-040X", + "D5EFD80": "3-00M-040Y", + "D7F6D20": "3-00M-041X", + "DF67780": "3-00M-041Y", + "D9DF720": "3-00M-042X", + "DDB7780": "3-00M-042Y", + "D5DBF20": "3-00M-043X", + "D59FF80": "3-00M-043Y", + "D5B7F20": "3-00M-044X", + "D57BF80": "3-00M-044Y", + "DF76720": "3-00M-045X", + "D7E7D80": "3-00M-045Y", + "DD9DE0C": "3-00M-046X", + "D9F6D30": "3-00M-046Y", + "D59FF20": "3-00M-047X", + "D5DBF80": "3-00M-047Y", + "D7DE720": "3-00M-048X", + "DF6DD80": "3-00M-048Y", + "D9D9CCC": "3-00M-049X", + "DDA7730": "3-00M-049Y", + "D9DDE0C": "3-00M-050X", + "DDB6D30": "3-00M-050Y", + "D9DB4CC": "3-00M-051X", + "DDA5F30": "3-00M-051Y", + "D7F6720": "3-00M-052X", + "DF67D80": "3-00M-052Y", + "DA57CCC": "3-00M-053X", + "D69F730": "3-00M-053Y", + "DF76D20": "3-00M-054X", + "D7E7780": "3-00M-054Y", + "D7B5E0C": "3-00M-055X", + "DB5ED30": "3-00M-055Y", + "D99DCCC": "3-00M-056X", + "D99DF30": "3-00M-056Y", + "D7B7720": "3-00M-057X", + "DB5F780": "3-00M-057Y", + "D79F720": "3-00M-058X", + "DB77780": "3-00M-058Y", + "DB5DE0C": "3-00M-059X", + "D7B6D30": "3-00M-059Y", + "DB59CCC": "3-00M-060X", + "D7A7730": "3-00M-060Y", + "D59FE0C": "3-00M-061X", + "D5DAF30": "3-00M-061Y", + "DDDED20": "3-00M-062X", + "DDED780": "3-00M-062Y", + "D79DE0C": "3-00M-063X", + "DB76D30": "3-00M-063Y", + "D7DED20": "3-00M-064X", + "DF6D780": "3-00M-064Y", + "DDB5E0C": "3-00M-065X", + "D9DED30": "3-00M-065Y", + "DD9F720": "3-00M-066X", + "D9F7780": "3-00M-066Y", + "DDDE720": "3-00M-067X", + "DDEDD80": "3-00M-067Y", + "DAF54CC": "3-00M-068X", + "DFA5730": "3-00M-068Y", + "DA7D4CC": "3-00M-069X", + "D6BD730": "3-00M-069Y", + "D57BF20": "3-00M-070X", + "D5B7F80": "3-00M-070Y", + "DDE64CC": "3-00M-071X", + "DDE6730": "3-00M-071Y", + "DB5F720": "3-00M-072X", + "D7B7780": "3-00M-072Y", + "DDE7720": "3-00M-073X", + "DDF6D80": "3-00M-073Y", + "D5BF720": "3-00M-074X", + "D5FED80": "3-00M-074Y", + "D5FE720": "3-00M-075X", + "D5BFD80": "3-00M-075Y", + "DF5ED20": "3-00M-076X", + "D7ED780": "3-00M-076Y", + "D7E7720": "3-00M-077X", + "DF76D80": "3-00M-077Y", + "D7E64CC": "3-00M-078X", + "DF66730": "3-00M-078Y", + "D7A5CCC": "3-00M-079X", + "DB5B730": "3-00M-079Y", + "DE65CCC": "3-00M-080X", + "D6DB730": "3-00M-080Y", + "DF5E720": "3-00M-081X", + "D7EDD80": "3-00M-081Y", + "DA5DCCC": "3-00M-082X", + "D69DF30": "3-00M-082Y", + "DF664CC": "3-00M-083X", + "D7E6730": "3-00M-083Y", + "DDA5CCC": "3-00M-084X", + "D9DB730": "3-00M-084Y", + "DF67720": "3-00M-085X", + "D7F6D80": "3-00M-085Y", + "DB5B4CC": "3-00M-086X", + "D7A5F30": "3-00M-086Y", + "D5E7F20": "3-00M-087X", + "D56FF80": "3-00M-087Y", + "D69DCCC": "3-00M-088X", + "DA5DF30": "3-00M-088Y", + "D5FED20": "3-00M-089X", + "D5BF780": "3-00M-089Y", + "D9F5E0C": "3-00M-090X", + "DD9ED30": "3-00M-090Y", + "DB75E0C": "3-00M-091X", + "D79ED30": "3-00M-091Y", + "D59BCCC": "3-00M-092X", + "D59BF30": "3-00M-092Y", + "D5BE4CC": "3-00M-093X", + "D5BE730": "3-00M-093Y", + "D5B7E0C": "3-00M-094X", + "D57AF30": "3-00M-094Y", + "D9F760C": "3-00M-095X", + "DD9E730": "3-00M-095Y", + "DE7760C": "3-00M-096X", + "D6DE730": "3-00M-096Y", + "DE75E0C": "3-00M-097X", + "D6DED30": "3-00M-097Y", + "DDE94CC": "3-00M-098X", + "DDDA730": "3-00M-098Y", + "D9F7720": "3-00M-099X", + "DD9F780": "3-00M-099Y", + "DE77720": "3-00M-100X", + "D6DF780": "3-00M-100Y", + "D6DB4CC": "3-00M-101X", + "DE65F30": "3-00M-101Y", + "D7B760C": "3-00M-102X", + "DB5E730": "3-00M-102Y", + "DDB760C": "3-00M-103X", + "D9DE730": "3-00M-103Y", + "D9DF60C": "3-00M-104X", + "DDB6730": "3-00M-104Y", + "DB5F60C": "3-00M-105X", + "D7B6730": "3-00M-105Y", + "D6DF720": "3-00M-106X", + "DE77780": "3-00M-106Y", + "DB674CC": "3-00M-107X", + "D799F30": "3-00M-107Y", + "D5BF60C": "3-00M-108X", + "D5FE930": "3-00M-108Y", + "DB7760C": "3-00M-109X", + "D79E730": "3-00M-109Y", + "DE674CC": "3-00M-110X", + "D6D9F30": "3-00M-110Y", + "D5A7CCC": "3-00M-111X", + "D56BF30": "3-00M-111Y", + "D7E94CC": "3-00M-112X", + "DF5A730": "3-00M-112Y", + "DB77720": "3-00M-113X", + "D79F780": "3-00M-113Y", + "DF694CC": "3-00M-114X", + "D7DA730": "3-00M-114Y", + "D5AF4CC": "3-00M-115X", + "D5FA730": "3-00M-115Y", + "DF6D60C": "3-00M-116X", + "D7DE930": "3-00M-116Y", + "D79F60C": "3-00M-117X", + "DB76730": "3-00M-117Y", + "DF6D720": "3-00M-118X", + "D7DED80": "3-00M-118Y", + "D5E7E0C": "3-00M-119X", + "D56EF30": "3-00M-119Y", + "D7ED60C": "3-00M-120X", + "DF5E930": "3-00M-120Y", + "DDED60C": "3-00M-121X", + "DDDE930": "3-00M-121Y", + "D7E760C": "3-00M-122X", + "DF76930": "3-00M-122Y", + "DDE760C": "3-00M-123X", + "DDF6930": "3-00M-123Y", + "D7ED720": "3-00M-124X", + "DF5ED80": "3-00M-124Y", + "DDED720": "3-00M-125X", + "DDDED80": "3-00M-125Y", + "DF6760C": "3-00M-126X", + "D7F6930": "3-00M-126Y", + "D5BFD20": "3-00M-127X", + "D5FE780": "3-00M-127Y", + "D5EFD20": "3-00M-128X", + "D5FB780": "3-00M-128Y", + "D6DFD20": "3-00M-129X", + "DE75F80": "3-00M-129Y", + "D79FD20": "3-00M-130X", + "DB75F80": "3-00M-130Y", + "D7B7D20": "3-00M-131X", + "DB5DF80": "3-00M-131Y", + "D7E7D20": "3-00M-132X", + "DF76780": "3-00M-132Y", + "D7EDD20": "3-00M-133X", + "DF5E780": "3-00M-133Y", + "D7F9D20": "3-00M-134X", + "DF5B780": "3-00M-134Y", + "D9DFD20": "3-00M-135X", + "DDB5F80": "3-00M-135Y", + "D9F7D20": "3-00M-136X", + "DD9DF80": "3-00M-136Y", + "DB5FD20": "3-00M-137X", + "D7B5F80": "3-00M-137Y", + "DB77D20": "3-00M-138X", + "D79DF80": "3-00M-138Y", + "DD9FD20": "3-00M-139X", + "D9F5F80": "3-00M-139Y", + "DDB7D20": "3-00M-140X", + "D9DDF80": "3-00M-140Y", + "DDE7D20": "3-00M-141X", + "DDF6780": "3-00M-141Y", + "DDEDD20": "3-00M-142X", + "DDDE780": "3-00M-142Y", + "DDF9D20": "3-00M-143X", + "DDDB780": "3-00M-143Y", + "DE77D20": "3-00M-144X", + "D6DDF80": "3-00M-144Y", + "DF67D20": "3-00M-145X", + "D7F6780": "3-00M-145Y", + "DF6DD20": "3-00M-146X", + "D7DE780": "3-00M-146Y", + "DF79D20": "3-00M-147X", + "D7DB780": "3-00M-147Y", + "D997CCC": "3-01L-000X", + "D99F730": "3-01R-000Y", + "DBE54CC": "3-02L-000X", + "DBE5730": "3-02R-000Y", + "D9E74CC": "3-03L-000X", + "DD99F30": "3-03R-000Y", + "D5983FC": "3-04M-000Z", + "D9F6730": "3-05L-000Y", + "DD9F60C": "3-05R-000X", + "D6DF60C": "3-06L-000X", + "DE76730": "3-06R-000Y", + "D7D60BC": "3-07L-000Z", + "DF560BC": "3-07R-000Z", + "DDD60BC": "3-08M-000Z", + "D6FF520": "3-09L-000X", + "DE7F580": "3-09R-000Y", + "D6FF580": "3-10L-000Y", + "DE7F520": "3-10R-000X", + "D7BF520": "3-11L-000X", + "DB7F580": "3-11R-000Y", + "D7BF580": "3-12L-000Y", + "DB7F520": "3-12R-000X", + "D9FF520": "3-13L-000X", + "DDBF580": "3-13R-000Y", + "D9FF580": "3-14L-000Y", + "DDBF520": "3-14R-000X", + "DBF7520": "3-15L-000X", + "DFED580": "3-15R-000Y", + "DBF7580": "3-16L-000Y", + "DFED520": "3-16R-000X", + "DBFD520": "3-17L-000X", + "DFE7580": "3-17R-000Y", + "DBFD580": "3-18L-000Y", + "DFE7520": "3-18R-000X", + "DEFD520": "3-19L-000X", + "DFB7580": "3-19R-000Y", + "DEFD580": "3-20L-000Y", + "DFB7520": "3-20R-000X", + "D79D4CC": "4-00M-000X", + "DB75730": "4-00M-000Y", + "D55C3BC": "4-00M-000ZL", + "D55C3EC": "4-00M-000ZR", + "D6DD4CC": "4-00M-001X", + "DE75730": "4-00M-001Y", + "D5583FC": "4-00M-001ZL", + "D55C2FC": "4-00M-001ZR", + "D7B54CC": "4-00M-002X", + "DB5D730": "4-00M-002Y", + "DD9D4CC": "4-00M-003X", + "D9F5730": "4-00M-003Y", + "D56DCCC": "4-00M-004X", + "D5E7730": "4-00M-004Y", + "D9F54CC": "4-00M-005X", + "DD9D730": "4-00M-005Y", + "DB754CC": "4-00M-006X", + "D79D730": "4-00M-006Y", + "DF55F20": "4-00M-007X", + "D7D7D80": "4-00M-007Y", + "D5F5F20": "4-00M-008X", + "D57FD80": "4-00M-008Y", + "D7D5F20": "4-00M-009X", + "DF57D80": "4-00M-009Y", + "DB5D4CC": "4-00M-010X", + "D7B5730": "4-00M-010Y", + "D55FF20": "4-00M-011X", + "D55FF80": "4-00M-011Y", + "D57DE0C": "4-00M-012X", + "D5F6D30": "4-00M-012Y", + "D57DF20": "4-00M-013X", + "D5F7D80": "4-00M-013Y", + "D55FE0C": "4-00M-014X", + "D55BF30": "4-00M-014Y", + "DE754CC": "4-00M-015X", + "D6DD730": "4-00M-015Y", + "D579CCC": "4-00M-016X", + "D5B7730": "4-00M-016Y", + "D5B74CC": "4-00M-017X", + "D579F30": "4-00M-017Y", + "D59DCCC": "4-00M-018X", + "D5DB730": "4-00M-018Y", + "D5DF720": "4-00M-019X", + "D5DF780": "4-00M-019Y", + "D59F4CC": "4-00M-020X", + "D5D9F30": "4-00M-020Y", + "D5B5CCC": "4-00M-021X", + "D57B730": "4-00M-021Y", + "D5F5E0C": "4-00M-022X", + "D57ED30": "4-00M-022Y", + "D5DF60C": "4-00M-023X", + "D5DE730": "4-00M-023Y", + "D7D5E0C": "4-00M-024X", + "DF56D30": "4-00M-024Y", + "DF55E0C": "4-00M-025X", + "D7D6D30": "4-00M-025Y", + "D5DB4CC": "4-00M-026X", + "D59DF30": "4-00M-026Y", + "D5F7720": "4-00M-027X", + "D57F780": "4-00M-027Y", + "D5E74CC": "4-00M-028X", + "D56DF30": "4-00M-028Y", + "D57FD20": "4-00M-029X", + "D5F5F80": "4-00M-029Y", + "D5DFD20": "4-00M-030X", + "D5DDF80": "4-00M-030Y", + "D5F7D20": "4-00M-031X", + "D57DF80": "4-00M-031Y", + "D7D7D20": "4-00M-032X", + "DF55F80": "4-00M-032Y", + "DF57D20": "4-00M-033X", + "D7D5F80": "4-00M-033Y", + "D5DDF20": "4-01L-000X", + "D5D9CCC": "4-01L-001X", + "D5DDE0C": "4-01L-002X", + "D57F720": "4-01L-003X", + "D57B4CC": "4-01L-004X", + "D57F60C": "4-01L-005X", + "D5DFD80": "4-01R-000Y", + "D59F730": "4-01R-001Y", + "D5DED30": "4-01R-002Y", + "D5F7780": "4-01R-003Y", + "D5B5F30": "4-01R-004Y", + "D5F6730": "4-01R-005Y", + "DDD5F20": "4-02L-000X", + "DDD5E0C": "4-02L-001X", + "DDD7D80": "4-02R-000Y", + "DDD6D30": "4-02R-001Y", + "D9DD4CC": "4-03L-000X", + "DDB5730": "4-03R-000Y", + "D9DD730": "4-04L-000Y", + "DDB54CC": "4-04R-000X", + "D57E730": "4-05L-000Y", + "D5F760C": "4-05R-000X", + "D7D6730": "4-06L-000Y", + "DF5760C": "4-06R-000X", + "D7D760C": "4-07L-000X", + "DF56730": "4-07R-000Y", + "DDD6730": "4-08L-000Y", + "DDD760C": "4-08R-000X", + "D7D7720": "4-09L-000X", + "DF57780": "4-09R-000Y", + "D7D7780": "4-10L-000Y", + "DF57720": "4-10R-000X", + "DDD7720": "4-11L-000X", + "DDD7780": "4-11R-000Y", + "DDD5F80": "4-12L-000Y", + "DDD7D20": "4-12R-000X", + "D5FF520": "4-13L-000X", + "D5FF580": "4-13R-000Y", + "D7DF520": "4-14L-000X", + "DF7D580": "4-14R-000Y", + "D7DF580": "4-15L-000Y", + "DF7D520": "4-15R-000X", + "D7F7520": "4-16L-000X", + "DF77580": "4-16R-000Y", + "D7F7580": "4-17L-000Y", + "DF77520": "4-17R-000X", + "D7FD520": "4-18L-000X", + "DF5F580": "4-18R-000Y", + "D7FD580": "4-19L-000Y", + "DF5F520": "4-19R-000X", + "DDDF520": "4-20L-000X", + "DDFD580": "4-20R-000Y", + "DDDF580": "4-21L-000Y", + "DDFD520": "4-21R-000X", + "DDF7520": "4-22L-000X", + "DDF7580": "4-22R-000Y", + "DFF5520": "4-23L-000X", + "DFF5580": "4-23R-000Y", + "D557CCC": "5-00M-000X", + "D55F730": "5-00M-000Y", + "DF554CC": "5-00M-001X", + "D7D5730": "5-00M-001Y", + "D7D54CC": "5-00M-002X", + "DF55730": "5-00M-002Y", + "D57D4CC": "5-00M-003X", + "D5F5730": "5-00M-003Y", + "DDD54CC": "5-00M-004X", + "DDD5730": "5-00M-004Y", + "D55F4CC": "5-00M-005X", + "D557F30": "5-00M-005Y", + "D5F54CC": "5-00M-006X", + "D57D730": "5-00M-006Y", + "D5DD4CC": "5-01L-000X", + "D5DD730": "5-01R-000Y", + "D55DCCC": "5-02L-000X", + "D55DF30": "5-02R-000Y" +} diff --git a/verify/classic.py b/verify/classic.py index 7706dba..155f099 100755 --- a/verify/classic.py +++ b/verify/classic.py @@ -171,19 +171,19 @@ class SoluGroup: for num in range(len(z_pairs)): if z_pairs[num][0] == z_pairs[num][1]: - z_pairs[num][0].name = f'{self.name}-{num:02}Z' + z_pairs[num][0].name = f'{self.name}-{num:03}Z' else: - z_pairs[num][0].name = f'{self.name}-{num:02}ZL' - z_pairs[num][1].name = f'{self.name}-{num:02}ZR' + z_pairs[num][0].name = f'{self.name}-{num:03}ZL' + z_pairs[num][1].name = f'{self.name}-{num:03}ZR' def build_lx_index(self) -> dict[str, str]: assert self.__name[-1] == 'L' right_data = {} self.__x_solus.sort(key=lambda x: (-x.ethnic_size, -x.ethnic_deep, x.layout)) for num in range(len(self.__x_solus)): - self.__x_solus[num].name = f'{self.name}-{num:01}X' + self.__x_solus[num].name = f'{self.name}-{num:03}X' mirror = str(self.__x_solus[num].layout.to_horizontal_mirror())[:7] - right_data[mirror] = f'{num:01}Y' + right_data[mirror] = f'{num:03}Y' return right_data def build_rx_index(self) -> dict[str, str]: @@ -191,9 +191,9 @@ class SoluGroup: left_data = {} self.__x_solus.sort(key=lambda x: (-x.ethnic_size, -x.ethnic_deep, x.layout)) for num in range(len(self.__x_solus)): - self.__x_solus[num].name = f'{self.name}-{num:01}X' + self.__x_solus[num].name = f'{self.name}-{num:03}X' mirror = str(self.__x_solus[num].layout.to_horizontal_mirror())[:7] - left_data[mirror] = f'{num:01}Y' + left_data[mirror] = f'{num:03}Y' return left_data def apply_ly_index(self, data: dict[str, str]) -> None: @@ -211,9 +211,9 @@ class SoluGroup: data = {} self.__z_solus.sort(key=lambda x: (-x.ethnic_size, -x.ethnic_deep, x.layout)) for num in range(len(self.__z_solus)): - self.__z_solus[num].name = f'{self.name}-{num:01}Z' + self.__z_solus[num].name = f'{self.name}-{num:03}Z' mirror = str(self.__z_solus[num].layout.to_horizontal_mirror())[:7] - data[mirror] = f'{num:01}Z' + data[mirror] = f'{num:03}Z' return data def apply_rz_index(self, data: dict[str, str]) -> None: @@ -381,9 +381,11 @@ def main() -> None: for num in range(6): # 0/1/2/3/4/5 for solu_pattern in split_patterns(load_valid_solutions(num)): solus.extend(solu_pattern.solus) - print(solu_pattern, end='\n\n') - print('-' * 238) - pprint(solus) + # print(solu_pattern, end='\n\n') + # print('-' * 238) + + data = sorted([(x.code, x.name) for x in solus], key=lambda x: x[1]) + print(json.dumps(dict(data))) if __name__ == "__main__": diff --git a/verify/verify.py b/verify/verify.py new file mode 100755 index 0000000..f59d558 --- /dev/null +++ b/verify/verify.py @@ -0,0 +1,198 @@ +#!/usr/bin/env python3 + +import re +import json +import functools +from klotski import Block, Layout + +type Info = tuple[int, int, str, int, str] + + +@functools.cache +def solu_data() -> dict[str, dict]: + return json.loads(open('./data/data.json').read()) + + +def solu_ethnic_info(code: str) -> tuple[int, int]: # (ethnic_size, ethnic_deep) + cases = [x for x, y in solu_data().items() if code in y['solutions']] + steps = [solu_data()[x]['step'] for x in cases] + return len(cases), max(steps) + + +def is_ethnic_case(code: Layout) -> bool: + seq = code.dump_seq() + if seq[13] != Block.B_2x2: + return True + if seq[12] == Block.SPACE and seq[16] == Block.SPACE: + return True + if seq[15] == Block.SPACE and seq[19] == Block.SPACE: + return True + if seq[9] == Block.SPACE and seq[10] == Block.SPACE: + return True + return False + + +def split_name(code: str, name: str) -> Info: + match = re.match(r'^([0-5])-(\d{2})([MLR])-(\d{3})(X|Y|Z|ZL|ZR)$', name) + type_id, solu_type = int(match[1]), match[5] + assert Layout(code).n_1x2 == type_id + + layout_seq = Layout(code).dump_seq() + assert solu_type[0] in ['X', 'Y', 'Z'] + if solu_type[0] == 'X': + assert layout_seq[12] == Block.SPACE and layout_seq[16] == Block.SPACE + elif solu_type[0] == 'Y': + assert layout_seq[15] == Block.SPACE and layout_seq[19] == Block.SPACE + elif solu_type[0] == 'Z': + assert layout_seq[9] == Block.SPACE and layout_seq[10] == Block.SPACE + + return type_id, int(match[2]), match[3], int(match[4]), solu_type + + +def split_into_groups(data: dict[str, Info]) -> dict[tuple[int, int, str], dict[str, Info]]: + groups = {} + for code, info in data.items(): + name = info[0], info[1], info[2] + if name not in groups: + groups[name] = {} + groups[name][code] = info + + for name, codes in groups.items(): + group = Layout(list(codes)[0]).group + cases = list(group.cases()) + for code in codes: + assert Layout(code) in cases + + if name[2] == 'M': + assert group.is_horizontal_mirror + else: # L / R + assert not group.is_horizontal_mirror + + if name[2] == 'L': + min_solu_l = min(codes.keys()) + min_solu_r = min(groups[(name[0], name[1], 'R')].keys()) + assert min_solu_l < min_solu_r + + return groups + + +def verify_m_group(data: dict[str, Info]) -> tuple[int, int, int, str]: + for code, info in data.items(): + assert info[4] in ['X', 'Y', 'Z', 'ZL', 'ZR'] + if info[4] == 'X': + y_code = str(Layout(code).to_horizontal_mirror())[:7] + assert data[y_code] == (info[0], info[1], info[2], info[3], 'Y') + elif info[4] == 'Y': + x_code = str(Layout(code).to_horizontal_mirror())[:7] + assert data[x_code] == (info[0], info[1], info[2], info[3], 'X') + elif info[4] == 'Z': + assert Layout(code).is_horizontal_mirror + elif info[4] == 'ZL': + zr_code = str(Layout(code).to_horizontal_mirror())[:7] + assert code < zr_code + assert data[zr_code] == (info[0], info[1], info[2], info[3], 'ZR') + elif info[4] == 'ZR': + zl_code = str(Layout(code).to_horizontal_mirror())[:7] + assert zl_code < code + assert data[zl_code] == (info[0], info[1], info[2], info[3], 'ZL') + + x_solus = sorted([(x, y[3]) for x, y in data.items() if y[4] == 'X'], key=lambda x: x[1]) + assert [x[1] for x in x_solus] == list(range(len(x_solus))) + x_data = [(*solu_ethnic_info(x[0]), x[0]) for x in x_solus] + assert len(set(x_data)) == len(x_data) and x_data == sorted(x_data, key=lambda x: (-x[0], -x[1], x[2])) + + z_solus = sorted([(x, y[3]) for x, y in data.items() if y[4] in {'Z', 'ZL'}], key=lambda x: x[1]) + assert [x[1] for x in z_solus] == list(range(len(z_solus))) + z_data = [(*solu_ethnic_info(x[0]), x[0]) for x in z_solus] + assert len(set(z_data)) == len(z_data) and z_data == sorted(z_data, key=lambda x: (-x[0], -x[1], x[2])) + + group = Layout(list(data)[0]).group + valid_size = len([x for x in list(group.cases()) if is_ethnic_case(x)]) + max_ethnic_size = max(x_data[0][0] if x_data else -1, z_data[0][0] if z_data else -1) + min_solu = min(list(data)) + return valid_size, group.size, max_ethnic_size, min_solu + + +def verify_lr_group(l_data: dict[str, Info], r_data: dict[str, Info]) -> tuple[int, int, int, str]: + assert len(l_data) == len(r_data) + for code, info in l_data.items(): + assert info[4] in ['X', 'Y', 'Z'] + if info[4] == 'X': + y_code = str(Layout(code).to_horizontal_mirror())[:7] + assert r_data[y_code] == (info[0], info[1], 'R', info[3], 'Y') + elif info[4] == 'Y': + x_code = str(Layout(code).to_horizontal_mirror())[:7] + assert r_data[x_code] == (info[0], info[1], 'R', info[3], 'X') + elif info[4] == 'Z': + assert not Layout(code).is_horizontal_mirror + z_code = str(Layout(code).to_horizontal_mirror())[:7] + assert r_data[z_code] == (info[0], info[1], 'R', info[3], 'Z') + for code, info in r_data.items(): + assert info[4] in ['X', 'Y', 'Z'] + if info[4] == 'X': + y_code = str(Layout(code).to_horizontal_mirror())[:7] + assert l_data[y_code] == (info[0], info[1], 'L', info[3], 'Y') + elif info[4] == 'Y': + x_code = str(Layout(code).to_horizontal_mirror())[:7] + assert l_data[x_code] == (info[0], info[1], 'L', info[3], 'X') + elif info[4] == 'Z': + assert not Layout(code).is_horizontal_mirror + z_code = str(Layout(code).to_horizontal_mirror())[:7] + assert l_data[z_code] == (info[0], info[1], 'L', info[3], 'Z') + + lx_solus = sorted([(x, y[3]) for x, y in l_data.items() if y[4] == 'X'], key=lambda x: x[1]) + assert [x[1] for x in lx_solus] == list(range(len(lx_solus))) + lx_data = [(*solu_ethnic_info(x[0]), x[0]) for x in lx_solus] + assert len(set(lx_data)) == len(lx_data) and lx_data == sorted(lx_data, key=lambda x: (-x[0], -x[1], x[2])) + + rx_solus = sorted([(x, y[3]) for x, y in r_data.items() if y[4] == 'X'], key=lambda x: x[1]) + assert [x[1] for x in rx_solus] == list(range(len(rx_solus))) + rx_data = [(*solu_ethnic_info(x[0]), x[0]) for x in rx_solus] + assert len(set(rx_data)) == len(rx_data) and rx_data == sorted(rx_data, key=lambda x: (-x[0], -x[1], x[2])) + + lz_solus = sorted([(x, y[3]) for x, y in l_data.items() if y[4] == 'Z'], key=lambda x: x[1]) + assert [x[1] for x in lz_solus] == list(range(len(lz_solus))) + lz_data = [(*solu_ethnic_info(x[0]), x[0]) for x in lz_solus] + assert len(set(lz_data)) == len(lz_data) and lz_data == sorted(lz_data, key=lambda x: (-x[0], -x[1], x[2])) + + l_group = Layout(list(l_data)[0]).group + r_group = Layout(list(r_data)[0]).group + assert l_group.size == r_group.size + + l_valid_size = len([x for x in list(l_group.cases()) if is_ethnic_case(x)]) + r_valid_size = len([x for x in list(r_group.cases()) if is_ethnic_case(x)]) + assert l_valid_size == r_valid_size + + max_ethnic_size = max(lx_data[0][0] if lx_data else -1, rx_data[0][0] if rx_data else -1, lz_data[0][0] if lz_data else -1) + min_solu = min(list(l_data) + list(r_data)) + return l_valid_size * 2, l_group.size * 2, max_ethnic_size, min_solu + + +def verify_pattern(info: dict[int, tuple[int, int, int, str]]) -> None: + assert list(info.keys()) == list(range(len(info))) + info = list(info.values()) + assert info == sorted(info, key=lambda x: (-x[0], -x[1], -x[2], x[3])) + + +def main() -> None: + data = json.loads(open('classic.json').read()) + data = {x: split_name(x, y) for x, y in data.items()} + groups = split_into_groups(data) + + pattern_info = {0: {}, 1: {}, 2: {}, 3: {}, 4: {}, 5: {}} + for name, group in groups.items(): + if name[2] == 'M': + pattern_info[name[0]][name[1]] = verify_m_group(group) + elif name[2] == 'L': + pattern_info[name[0]][name[1]] = verify_lr_group(group, groups[(name[0], name[1], 'R')]) + + verify_pattern(pattern_info[0]) + verify_pattern(pattern_info[1]) + verify_pattern(pattern_info[2]) + verify_pattern(pattern_info[3]) + verify_pattern(pattern_info[4]) + verify_pattern(pattern_info[5]) + + +if __name__ == '__main__': + main()