From 7576835ab5eee689d38ee1e983cb155cc8270766 Mon Sep 17 00:00:00 2001 From: Frederik Claus Date: Wed, 10 Sep 2025 21:01:15 +0200 Subject: [PATCH 01/10] Adds tests for multi line comments --- src/test/suite/commentHandling.vsc-test.ts | 77 ++++++++++ src/test/suite/parser/parseArray.test.ts | 64 ++++++++- src/test/suite/serializeArray.test.ts | 158 +++++++++++++++++++++ 3 files changed, 298 insertions(+), 1 deletion(-) diff --git a/src/test/suite/commentHandling.vsc-test.ts b/src/test/suite/commentHandling.vsc-test.ts index 6fd0738..d0d1f44 100644 --- a/src/test/suite/commentHandling.vsc-test.ts +++ b/src/test/suite/commentHandling.vsc-test.ts @@ -97,6 +97,83 @@ suite('Comment Handling Integration Tests', function() { } // comment end of id 2 // comment at the end ]`; + await triggerSortExpectSuccess({ + command: 'extension.sortJsonArrayAscending', // Sorts by id + code: originalJson, + expectedCode: expectedJson, + position: new vscode.Position(0, 0), + fileExtension: '.json' + + }); + }); + + test('should sort object array and preserve multi-line comments', async function() { + const originalJson = undent` + [ /* start of array */ + /* comment 1 before id 2 object */ + /* + * comment 2 before id 2 object + */ + { /* comment start of id 2 */ + /* comment before id 2 */ + "id": 2, /* comment for id 2 */ + /* + * comment between id 2 and array2 + */ + "array2": [ /* comment start of array2 */ + 1, /* inline comment array2 1 */ + 2, /* inline comment array2 2 */ + 3 /* inline comment array2 3 */ + ], /* comment end of array 2 */ + /* comment between array2 and dataId2 */ + "dataId2": { /* comment start of dataId2 */ + "value": "zeta" /* comment for zeta */ + } /* comment end of dataId2 */ + }, /* comment end of id 2 */ + /* comment before id 1 object */ + { /* comment start of id 1 */ + /* comment before id 1 */ + "id": 1, /* comment for id 1 */ + /* comment between id 1 and dataId1 */ + "dataId1": { /* comment start of dataId1 */ + "value": "alpha" /* comment for alpha */ + } /* comment end of dataId1 */ + } /* comment end of id 1 object */ + /* comment at the end */ + ]`; + const expectedJson = undent` + [ /* start of array */ + /* comment before id 1 object */ + { /* comment start of id 1 */ + /* comment before id 1 */ + "id": 1, /* comment for id 1 */ + /* comment between id 1 and dataId1 */ + "dataId1": { /* comment start of dataId1 */ + "value": "alpha" /* comment for alpha */ + } /* comment end of dataId1 */ + }, /* comment end of id 1 object */ + /* comment 1 before id 2 object */ + /* + * comment 2 before id 2 object + */ + { /* comment start of id 2 */ + /* comment before id 2 */ + "id": 2, /* comment for id 2 */ + /* + * comment between id 2 and array2 + */ + "array2": [ /* comment start of array2 */ + 1, /* inline comment array2 1 */ + 2, /* inline comment array2 2 */ + 3 /* inline comment array2 3 */ + ], /* comment end of array 2 */ + /* comment between array2 and dataId2 */ + "dataId2": { /* comment start of dataId2 */ + "value": "zeta" /* comment for zeta */ + } /* comment end of dataId2 */ + } /* comment end of id 2 */ + /* comment at the end */ + ]`; await triggerSortExpectSuccess({ command: 'extension.sortJsonArrayAscending', // Sorts by id code: originalJson, diff --git a/src/test/suite/parser/parseArray.test.ts b/src/test/suite/parser/parseArray.test.ts index 3ef9c89..38d3684 100644 --- a/src/test/suite/parser/parseArray.test.ts +++ b/src/test/suite/parser/parseArray.test.ts @@ -173,7 +173,69 @@ suite('parseArray', function() { { text: '// after last2', line: 7, column: 2 } ]; + expect(result.comments).to.deep.members(expectedComments); + + }); + + test('should collect multi-line inline comments from array elements', function() { + const json = '[\n "a", /* comment1 */\n "b" /* comment2 */\n]'; + const result = parseArray(json); + expect(result.items.length).to.equal(2); + const expectedComments: Partial[] = [ + { text: '/* comment1 */', line: 2, column: 7 }, + { text: '/* comment2 */', line: 3, column: 6 } + ]; + expect(result.comments).to.deep.members(expectedComments); + }); + + test('should collect multi-line comments on lines before array elements', function() { + const json = '[\n /*\n * comment1\n */\n "a",\n /* comment2 */\n "b"\n]'; + const result = parseArray(json); + expect(result.items.length).to.equal(2); + const expectedComments: Partial[] = [ + { text: '/*\n * comment1\n */', line: 2, column: 2 }, + { text: '/* comment2 */', line: 6, column: 2 } + ]; + expect(result.comments).to.deep.members(expectedComments); + }); + + test('should collect multi-line comments after the last array element (within the array brackets)', function() { + const json = '[\n "a",\n "b"\n /* comment after last 1 */\n /*\n * comment after last 2\n */\n]'; + const result = parseArray(json); + expect(result.items.length).to.equal(2); + const expectedComments: Partial[] = [ + { text: '/* comment after last 1 */', line: 4, column: 2 }, + { text: '/*\n * comment after last 2\n */', line: 5, column: 2 } + ]; + expect(result.comments).to.deep.members(expectedComments); + }); + + test('should handle a mix of single and multi-line comment types and collect them all', function() { + const json = undent` + [ + // before1 + /* multi-line + * comment 1 */ + "a", // inline1 + /* multi-line comment 2 */ + "b", // inline2 + // after last1 + /* after last2 */ + ]`; + const result = parseArray(json); + expect(result.items.length).to.equal(2); + expect(result.comments.length).to.equal(7); + + const expectedComments: Partial[] = [ + { text: '// before1', line: 2, column: 2 }, + { text: '/* multi-line\n * comment 1 */', line: 3, column: 2 }, + { text: '// inline1', line: 5, column: 7 }, + { text: '/* multi-line comment 2 */', line: 6, column: 2 }, + { text: '// inline2', line: 7, column: 7 }, + { text: '// after last1', line: 8, column: 2 }, + { text: '/* after last2 */', line: 9, column: 2 } + ]; + expect(result.comments).to.deep.members(expectedComments); }); - }); diff --git a/src/test/suite/serializeArray.test.ts b/src/test/suite/serializeArray.test.ts index 92a59f4..88a49c9 100644 --- a/src/test/suite/serializeArray.test.ts +++ b/src/test/suite/serializeArray.test.ts @@ -255,4 +255,162 @@ suite('serializeArray', function() { expectSerializedArray(original, expected, {sortFn: (a, b) => a.id - b.id}); }) + test('multi-line comments in string array', function() { + const original = undent` + [ /* arrayInline */ + /* before1 */ + "a", /* inline1 */ + /* before2 */ + "b", /* inline2 */ + /* + * before 3 + * before 4 + */ + "c", + /* after last1 */ + /* after last2 */ + ]`; + const expected = undent` + [ /* arrayInline */ + /* before1 */ + "a", /* inline1 */ + /* before2 */ + "b", /* inline2 */ + /* + * before 3 + * before 4 + */ + "c" + /* after last1 */ + /* after last2 */ + ] + `; + expectSerializedArray(original, expected, { indentLevel: 0, newIndent: ' ' }); + }); + + test('multi-line comments in object array', function() { + const original = undent` + [ + { /* objInlineBefore */ + /* objBefore1 */ + /* objBefore2 */ + "a": 1, /* objInline1 */ + /* objBefore2 */ + "b": 2 /* objInline2 */ + /* objAfter 1 */ + /* objAfter 2 */ + } /* objInlineAfter */ + /* after last 1 */ + /* after last 2 */ + ] + `; + const expected = undent` + [ + { /* objInlineBefore */ + /* objBefore1 */ + /* objBefore2 */ + "a": 1, /* objInline1 */ + /* objBefore2 */ + "b": 2 /* objInline2 */ + /* objAfter 1 */ + /* objAfter 2 */ + } /* objInlineAfter */ + /* after last 1 */ + /* after last 2 */ + ] + `; + expectSerializedArray(original, expected); + }); + + test('multi-line comments in nested array', function() { + const original = undent` + [ + [ + /* nestedBefore1 */ + "x", /* nestedInline1 */ + /* nestedBefore2 */ + "y" /* nestedInline2 */ + ], /* itemInline */ + /* after last */ + ] + `; + const expected = undent` + [ + [ + /* nestedBefore1 */ + "x", /* nestedInline1 */ + /* nestedBefore2 */ + "y" /* nestedInline2 */ + ] /* itemInline */ + /* after last */ + ] + `; + expectSerializedArray(original, expected); + }); + + test('multi-line comments in empty objects and arrays', function() { + const original = undent` + [ + { + "array": [ + /* array comment */ + /* array comment comment */ + ], + "object": { + /* object comment 1 */ + /* object comment 2 */ + /* object comment 3 */ + /* object comment 4 */ + } + } + ] + `; + const expected = undent` + [ + { + "array": [ + /* array comment */ + /* array comment comment */ + ], + "object": { + /* object comment 1 */ + /* object comment 2 */ + /* object comment 3 */ + /* object comment 4 */ + } + } + ] + `; + expectSerializedArray(original, expected); + }); + + test('multi-line comments after sorting', function() { + const original = undent` + [ + { + "id": 2 /* id 2 */ + /* end 2 */ + }, + { + "id": 1 /* id 1 */ + /* end 1 */ + } + ] + `; + const expected = undent` + [ + { + "id": 1 /* id 1 */ + /* end 1 */ + }, + { + "id": 2 /* id 2 */ + /* end 2 */ + } + ] + `; + + expectSerializedArray(original, expected, {sortFn: (a, b) => a.id - b.id}); + }) + }); From 68cffa77bd0ab7f977d7c595ffa199b0b3b53209 Mon Sep 17 00:00:00 2001 From: Frederik Claus Date: Fri, 3 Oct 2025 16:53:39 +0200 Subject: [PATCH 02/10] Adds implementation for multi line comments --- package.json | 2 +- src/parser/JSON.g4 | 3 + src/parser/generated/JSON.interp | 4 +- src/parser/generated/JSON.tokens | 3 +- src/parser/generated/JSONLexer.interp | 5 +- src/parser/generated/JSONLexer.tokens | 3 +- src/parser/generated/JSONLexer.ts | 841 ++++++++++---------- src/parser/generated/JSONParser.ts | 7 +- src/parser/parseArray.ts | 57 +- src/serializeArray.ts | 10 +- src/test/suite/commentHandling.vsc-test.ts | 1 - src/test/suite/parser/parseArray.test.ts | 85 +- src/test/suite/processAndParseArray.test.ts | 3 +- 13 files changed, 554 insertions(+), 470 deletions(-) diff --git a/package.json b/package.json index 82a9329..6b8dfa2 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "sort-json-array", "displayName": "Sort JSON/JS array", "description": "Sorts JSON/JS arrays by value, object property or custom function", - "version": "4.1.0", + "version": "4.2.0", "publisher": "fvclaus", "license": "BSD-3-Clause", "engines": { diff --git a/src/parser/JSON.g4 b/src/parser/JSON.g4 index 7512123..3963458 100644 --- a/src/parser/JSON.g4 +++ b/src/parser/JSON.g4 @@ -86,5 +86,8 @@ IDENTIFIER // Single-line comments LINE_COMMENT : '//' ~[\r\n]* -> channel(HIDDEN); +// Multi-line comments +BLOCK_COMMENT : '/*' .*? '*/' -> channel(HIDDEN); + // handle characters which failed to match any other token ErrorCharacter : . ; diff --git a/src/parser/generated/JSON.interp b/src/parser/generated/JSON.interp index eb72e3d..c273df9 100644 --- a/src/parser/generated/JSON.interp +++ b/src/parser/generated/JSON.interp @@ -16,6 +16,7 @@ null null null null +null token symbolic names: null @@ -34,6 +35,7 @@ NUMBER WS IDENTIFIER LINE_COMMENT +BLOCK_COMMENT ErrorCharacter rule names: @@ -45,4 +47,4 @@ arr atn: -[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 3, 18, 66, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 3, 24, 10, 3, 3, 4, 3, 4, 3, 4, 3, 4, 7, 4, 30, 10, 4, 12, 4, 14, 4, 33, 11, 4, 3, 4, 5, 4, 36, 10, 4, 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 42, 10, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 52, 10, 6, 12, 6, 14, 6, 55, 11, 6, 3, 6, 5, 6, 58, 10, 6, 3, 6, 3, 6, 3, 6, 3, 6, 5, 6, 64, 10, 6, 3, 6, 2, 2, 2, 7, 2, 2, 4, 2, 6, 2, 8, 2, 10, 2, 2, 3, 4, 2, 13, 13, 16, 16, 2, 73, 2, 12, 3, 2, 2, 2, 4, 23, 3, 2, 2, 2, 6, 41, 3, 2, 2, 2, 8, 43, 3, 2, 2, 2, 10, 63, 3, 2, 2, 2, 12, 13, 5, 10, 6, 2, 13, 14, 7, 2, 2, 3, 14, 3, 3, 2, 2, 2, 15, 24, 5, 6, 4, 2, 16, 24, 5, 10, 6, 2, 17, 24, 7, 13, 2, 2, 18, 24, 7, 14, 2, 2, 19, 24, 7, 3, 2, 2, 20, 24, 7, 4, 2, 2, 21, 24, 7, 5, 2, 2, 22, 24, 7, 6, 2, 2, 23, 15, 3, 2, 2, 2, 23, 16, 3, 2, 2, 2, 23, 17, 3, 2, 2, 2, 23, 18, 3, 2, 2, 2, 23, 19, 3, 2, 2, 2, 23, 20, 3, 2, 2, 2, 23, 21, 3, 2, 2, 2, 23, 22, 3, 2, 2, 2, 24, 5, 3, 2, 2, 2, 25, 26, 7, 11, 2, 2, 26, 31, 5, 8, 5, 2, 27, 28, 7, 7, 2, 2, 28, 30, 5, 8, 5, 2, 29, 27, 3, 2, 2, 2, 30, 33, 3, 2, 2, 2, 31, 29, 3, 2, 2, 2, 31, 32, 3, 2, 2, 2, 32, 35, 3, 2, 2, 2, 33, 31, 3, 2, 2, 2, 34, 36, 7, 7, 2, 2, 35, 34, 3, 2, 2, 2, 35, 36, 3, 2, 2, 2, 36, 37, 3, 2, 2, 2, 37, 38, 7, 10, 2, 2, 38, 42, 3, 2, 2, 2, 39, 40, 7, 11, 2, 2, 40, 42, 7, 10, 2, 2, 41, 25, 3, 2, 2, 2, 41, 39, 3, 2, 2, 2, 42, 7, 3, 2, 2, 2, 43, 44, 9, 2, 2, 2, 44, 45, 7, 12, 2, 2, 45, 46, 5, 4, 3, 2, 46, 9, 3, 2, 2, 2, 47, 48, 7, 8, 2, 2, 48, 53, 5, 4, 3, 2, 49, 50, 7, 7, 2, 2, 50, 52, 5, 4, 3, 2, 51, 49, 3, 2, 2, 2, 52, 55, 3, 2, 2, 2, 53, 51, 3, 2, 2, 2, 53, 54, 3, 2, 2, 2, 54, 57, 3, 2, 2, 2, 55, 53, 3, 2, 2, 2, 56, 58, 7, 7, 2, 2, 57, 56, 3, 2, 2, 2, 57, 58, 3, 2, 2, 2, 58, 59, 3, 2, 2, 2, 59, 60, 7, 9, 2, 2, 60, 64, 3, 2, 2, 2, 61, 62, 7, 8, 2, 2, 62, 64, 7, 9, 2, 2, 63, 47, 3, 2, 2, 2, 63, 61, 3, 2, 2, 2, 64, 11, 3, 2, 2, 2, 9, 23, 31, 35, 41, 53, 57, 63] \ No newline at end of file +[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 3, 19, 66, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 3, 24, 10, 3, 3, 4, 3, 4, 3, 4, 3, 4, 7, 4, 30, 10, 4, 12, 4, 14, 4, 33, 11, 4, 3, 4, 5, 4, 36, 10, 4, 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 42, 10, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 3, 6, 7, 6, 52, 10, 6, 12, 6, 14, 6, 55, 11, 6, 3, 6, 5, 6, 58, 10, 6, 3, 6, 3, 6, 3, 6, 3, 6, 5, 6, 64, 10, 6, 3, 6, 2, 2, 2, 7, 2, 2, 4, 2, 6, 2, 8, 2, 10, 2, 2, 3, 4, 2, 13, 13, 16, 16, 2, 73, 2, 12, 3, 2, 2, 2, 4, 23, 3, 2, 2, 2, 6, 41, 3, 2, 2, 2, 8, 43, 3, 2, 2, 2, 10, 63, 3, 2, 2, 2, 12, 13, 5, 10, 6, 2, 13, 14, 7, 2, 2, 3, 14, 3, 3, 2, 2, 2, 15, 24, 5, 6, 4, 2, 16, 24, 5, 10, 6, 2, 17, 24, 7, 13, 2, 2, 18, 24, 7, 14, 2, 2, 19, 24, 7, 3, 2, 2, 20, 24, 7, 4, 2, 2, 21, 24, 7, 5, 2, 2, 22, 24, 7, 6, 2, 2, 23, 15, 3, 2, 2, 2, 23, 16, 3, 2, 2, 2, 23, 17, 3, 2, 2, 2, 23, 18, 3, 2, 2, 2, 23, 19, 3, 2, 2, 2, 23, 20, 3, 2, 2, 2, 23, 21, 3, 2, 2, 2, 23, 22, 3, 2, 2, 2, 24, 5, 3, 2, 2, 2, 25, 26, 7, 11, 2, 2, 26, 31, 5, 8, 5, 2, 27, 28, 7, 7, 2, 2, 28, 30, 5, 8, 5, 2, 29, 27, 3, 2, 2, 2, 30, 33, 3, 2, 2, 2, 31, 29, 3, 2, 2, 2, 31, 32, 3, 2, 2, 2, 32, 35, 3, 2, 2, 2, 33, 31, 3, 2, 2, 2, 34, 36, 7, 7, 2, 2, 35, 34, 3, 2, 2, 2, 35, 36, 3, 2, 2, 2, 36, 37, 3, 2, 2, 2, 37, 38, 7, 10, 2, 2, 38, 42, 3, 2, 2, 2, 39, 40, 7, 11, 2, 2, 40, 42, 7, 10, 2, 2, 41, 25, 3, 2, 2, 2, 41, 39, 3, 2, 2, 2, 42, 7, 3, 2, 2, 2, 43, 44, 9, 2, 2, 2, 44, 45, 7, 12, 2, 2, 45, 46, 5, 4, 3, 2, 46, 9, 3, 2, 2, 2, 47, 48, 7, 8, 2, 2, 48, 53, 5, 4, 3, 2, 49, 50, 7, 7, 2, 2, 50, 52, 5, 4, 3, 2, 51, 49, 3, 2, 2, 2, 52, 55, 3, 2, 2, 2, 53, 51, 3, 2, 2, 2, 53, 54, 3, 2, 2, 2, 54, 57, 3, 2, 2, 2, 55, 53, 3, 2, 2, 2, 56, 58, 7, 7, 2, 2, 57, 56, 3, 2, 2, 2, 57, 58, 3, 2, 2, 2, 58, 59, 3, 2, 2, 2, 59, 60, 7, 9, 2, 2, 60, 64, 3, 2, 2, 2, 61, 62, 7, 8, 2, 2, 62, 64, 7, 9, 2, 2, 63, 47, 3, 2, 2, 2, 63, 61, 3, 2, 2, 2, 64, 11, 3, 2, 2, 2, 9, 23, 31, 35, 41, 53, 57, 63] \ No newline at end of file diff --git a/src/parser/generated/JSON.tokens b/src/parser/generated/JSON.tokens index 5777a80..c34ef57 100644 --- a/src/parser/generated/JSON.tokens +++ b/src/parser/generated/JSON.tokens @@ -13,7 +13,8 @@ NUMBER=12 WS=13 IDENTIFIER=14 LINE_COMMENT=15 -ErrorCharacter=16 +BLOCK_COMMENT=16 +ErrorCharacter=17 'true'=1 'false'=2 'null'=3 diff --git a/src/parser/generated/JSONLexer.interp b/src/parser/generated/JSONLexer.interp index d38dfda..ab8de6f 100644 --- a/src/parser/generated/JSONLexer.interp +++ b/src/parser/generated/JSONLexer.interp @@ -16,6 +16,7 @@ null null null null +null token symbolic names: null @@ -34,6 +35,7 @@ NUMBER WS IDENTIFIER LINE_COMMENT +BLOCK_COMMENT ErrorCharacter rule names: @@ -56,6 +58,7 @@ EXP WS IDENTIFIER LINE_COMMENT +BLOCK_COMMENT ErrorCharacter channel names: @@ -66,4 +69,4 @@ mode names: DEFAULT_MODE atn: -[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 2, 18, 165, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 7, 3, 7, 3, 8, 3, 8, 3, 9, 3, 9, 3, 10, 3, 10, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 90, 10, 12, 3, 13, 3, 13, 3, 13, 7, 13, 95, 10, 13, 12, 13, 14, 13, 98, 11, 13, 3, 14, 3, 14, 3, 14, 7, 14, 103, 10, 14, 12, 14, 14, 14, 106, 11, 14, 3, 15, 5, 15, 109, 10, 15, 3, 15, 3, 15, 3, 15, 6, 15, 114, 10, 15, 13, 15, 14, 15, 115, 5, 15, 118, 10, 15, 3, 15, 5, 15, 121, 10, 15, 3, 16, 3, 16, 3, 16, 7, 16, 126, 10, 16, 12, 16, 14, 16, 129, 11, 16, 5, 16, 131, 10, 16, 3, 17, 3, 17, 5, 17, 135, 10, 17, 3, 17, 3, 17, 3, 18, 6, 18, 140, 10, 18, 13, 18, 14, 18, 141, 3, 18, 3, 18, 3, 19, 3, 19, 7, 19, 148, 10, 19, 12, 19, 14, 19, 151, 11, 19, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 157, 10, 20, 12, 20, 14, 20, 160, 11, 20, 3, 20, 3, 20, 3, 21, 3, 21, 2, 2, 2, 22, 3, 2, 3, 5, 2, 4, 7, 2, 5, 9, 2, 6, 11, 2, 7, 13, 2, 8, 15, 2, 9, 17, 2, 10, 19, 2, 11, 21, 2, 12, 23, 2, 13, 25, 2, 2, 27, 2, 2, 29, 2, 14, 31, 2, 2, 33, 2, 2, 35, 2, 15, 37, 2, 16, 39, 2, 17, 41, 2, 18, 3, 2, 10, 3, 2, 36, 36, 3, 2, 41, 41, 3, 2, 50, 59, 3, 2, 51, 59, 4, 2, 71, 71, 103, 103, 4, 2, 45, 45, 47, 47, 13, 2, 11, 15, 34, 34, 135, 135, 162, 162, 5762, 5762, 8194, 8204, 8234, 8235, 8241, 8241, 8289, 8289, 12290, 12290, 65281, 65281, 4, 2, 12, 12, 15, 15, 4, 575, 2, 38, 2, 38, 2, 67, 2, 92, 2, 97, 2, 97, 2, 99, 2, 124, 2, 172, 2, 172, 2, 183, 2, 183, 2, 188, 2, 188, 2, 194, 2, 216, 2, 218, 2, 248, 2, 250, 2, 707, 2, 712, 2, 723, 2, 738, 2, 742, 2, 750, 2, 750, 2, 752, 2, 752, 2, 882, 2, 886, 2, 888, 2, 889, 2, 892, 2, 895, 2, 897, 2, 897, 2, 904, 2, 904, 2, 906, 2, 908, 2, 910, 2, 910, 2, 912, 2, 931, 2, 933, 2, 1015, 2, 1017, 2, 1155, 2, 1164, 2, 1329, 2, 1331, 2, 1368, 2, 1371, 2, 1371, 2, 1379, 2, 1417, 2, 1490, 2, 1516, 2, 1522, 2, 1524, 2, 1570, 2, 1612, 2, 1648, 2, 1649, 2, 1651, 2, 1749, 2, 1751, 2, 1751, 2, 1767, 2, 1768, 2, 1776, 2, 1777, 2, 1788, 2, 1790, 2, 1793, 2, 1793, 2, 1810, 2, 1810, 2, 1812, 2, 1841, 2, 1871, 2, 1959, 2, 1971, 2, 1971, 2, 1996, 2, 2028, 2, 2038, 2, 2039, 2, 2044, 2, 2044, 2, 2050, 2, 2071, 2, 2076, 2, 2076, 2, 2086, 2, 2086, 2, 2090, 2, 2090, 2, 2114, 2, 2138, 2, 2210, 2, 2230, 2, 2232, 2, 2239, 2, 2310, 2, 2363, 2, 2367, 2, 2367, 2, 2386, 2, 2386, 2, 2394, 2, 2403, 2, 2419, 2, 2434, 2, 2439, 2, 2446, 2, 2449, 2, 2450, 2, 2453, 2, 2474, 2, 2476, 2, 2482, 2, 2484, 2, 2484, 2, 2488, 2, 2491, 2, 2495, 2, 2495, 2, 2512, 2, 2512, 2, 2526, 2, 2527, 2, 2529, 2, 2531, 2, 2546, 2, 2547, 2, 2567, 2, 2572, 2, 2577, 2, 2578, 2, 2581, 2, 2602, 2, 2604, 2, 2610, 2, 2612, 2, 2613, 2, 2615, 2, 2616, 2, 2618, 2, 2619, 2, 2651, 2, 2654, 2, 2656, 2, 2656, 2, 2676, 2, 2678, 2, 2695, 2, 2703, 2, 2705, 2, 2707, 2, 2709, 2, 2730, 2, 2732, 2, 2738, 2, 2740, 2, 2741, 2, 2743, 2, 2747, 2, 2751, 2, 2751, 2, 2770, 2, 2770, 2, 2786, 2, 2787, 2, 2811, 2, 2811, 2, 2823, 2, 2830, 2, 2833, 2, 2834, 2, 2837, 2, 2858, 2, 2860, 2, 2866, 2, 2868, 2, 2869, 2, 2871, 2, 2875, 2, 2879, 2, 2879, 2, 2910, 2, 2911, 2, 2913, 2, 2915, 2, 2931, 2, 2931, 2, 2949, 2, 2949, 2, 2951, 2, 2956, 2, 2960, 2, 2962, 2, 2964, 2, 2967, 2, 2971, 2, 2972, 2, 2974, 2, 2974, 2, 2976, 2, 2977, 2, 2981, 2, 2982, 2, 2986, 2, 2988, 2, 2992, 2, 3003, 2, 3026, 2, 3026, 2, 3079, 2, 3086, 2, 3088, 2, 3090, 2, 3092, 2, 3114, 2, 3116, 2, 3131, 2, 3135, 2, 3135, 2, 3162, 2, 3164, 2, 3170, 2, 3171, 2, 3202, 2, 3202, 2, 3207, 2, 3214, 2, 3216, 2, 3218, 2, 3220, 2, 3242, 2, 3244, 2, 3253, 2, 3255, 2, 3259, 2, 3263, 2, 3263, 2, 3296, 2, 3296, 2, 3298, 2, 3299, 2, 3315, 2, 3316, 2, 3335, 2, 3342, 2, 3344, 2, 3346, 2, 3348, 2, 3388, 2, 3391, 2, 3391, 2, 3408, 2, 3408, 2, 3414, 2, 3416, 2, 3425, 2, 3427, 2, 3452, 2, 3457, 2, 3463, 2, 3480, 2, 3484, 2, 3507, 2, 3509, 2, 3517, 2, 3519, 2, 3519, 2, 3522, 2, 3528, 2, 3587, 2, 3634, 2, 3636, 2, 3637, 2, 3650, 2, 3656, 2, 3715, 2, 3716, 2, 3718, 2, 3718, 2, 3721, 2, 3722, 2, 3724, 2, 3724, 2, 3727, 2, 3727, 2, 3734, 2, 3737, 2, 3739, 2, 3745, 2, 3747, 2, 3749, 2, 3751, 2, 3751, 2, 3753, 2, 3753, 2, 3756, 2, 3757, 2, 3759, 2, 3762, 2, 3764, 2, 3765, 2, 3775, 2, 3775, 2, 3778, 2, 3782, 2, 3784, 2, 3784, 2, 3806, 2, 3809, 2, 3842, 2, 3842, 2, 3906, 2, 3913, 2, 3915, 2, 3950, 2, 3978, 2, 3982, 2, 4098, 2, 4140, 2, 4161, 2, 4161, 2, 4178, 2, 4183, 2, 4188, 2, 4191, 2, 4195, 2, 4195, 2, 4199, 2, 4200, 2, 4208, 2, 4210, 2, 4215, 2, 4227, 2, 4240, 2, 4240, 2, 4258, 2, 4295, 2, 4297, 2, 4297, 2, 4303, 2, 4303, 2, 4306, 2, 4348, 2, 4350, 2, 4682, 2, 4684, 2, 4687, 2, 4690, 2, 4696, 2, 4698, 2, 4698, 2, 4700, 2, 4703, 2, 4706, 2, 4746, 2, 4748, 2, 4751, 2, 4754, 2, 4786, 2, 4788, 2, 4791, 2, 4794, 2, 4800, 2, 4802, 2, 4802, 2, 4804, 2, 4807, 2, 4810, 2, 4824, 2, 4826, 2, 4882, 2, 4884, 2, 4887, 2, 4890, 2, 4956, 2, 4994, 2, 5009, 2, 5026, 2, 5111, 2, 5114, 2, 5119, 2, 5123, 2, 5742, 2, 5745, 2, 5761, 2, 5763, 2, 5788, 2, 5794, 2, 5868, 2, 5872, 2, 5882, 2, 5890, 2, 5902, 2, 5904, 2, 5907, 2, 5922, 2, 5939, 2, 5954, 2, 5971, 2, 5986, 2, 5998, 2, 6000, 2, 6002, 2, 6018, 2, 6069, 2, 6105, 2, 6105, 2, 6110, 2, 6110, 2, 6178, 2, 6265, 2, 6274, 2, 6314, 2, 6316, 2, 6316, 2, 6322, 2, 6391, 2, 6402, 2, 6432, 2, 6482, 2, 6511, 2, 6514, 2, 6518, 2, 6530, 2, 6573, 2, 6578, 2, 6603, 2, 6658, 2, 6680, 2, 6690, 2, 6742, 2, 6825, 2, 6825, 2, 6919, 2, 6965, 2, 6983, 2, 6989, 2, 7045, 2, 7074, 2, 7088, 2, 7089, 2, 7100, 2, 7143, 2, 7170, 2, 7205, 2, 7247, 2, 7249, 2, 7260, 2, 7295, 2, 7298, 2, 7306, 2, 7403, 2, 7406, 2, 7408, 2, 7411, 2, 7415, 2, 7416, 2, 7426, 2, 7617, 2, 7682, 2, 7959, 2, 7962, 2, 7967, 2, 7970, 2, 8007, 2, 8010, 2, 8015, 2, 8018, 2, 8025, 2, 8027, 2, 8027, 2, 8029, 2, 8029, 2, 8031, 2, 8031, 2, 8033, 2, 8063, 2, 8066, 2, 8118, 2, 8120, 2, 8126, 2, 8128, 2, 8128, 2, 8132, 2, 8134, 2, 8136, 2, 8142, 2, 8146, 2, 8149, 2, 8152, 2, 8157, 2, 8162, 2, 8174, 2, 8180, 2, 8182, 2, 8184, 2, 8190, 2, 8307, 2, 8307, 2, 8321, 2, 8321, 2, 8338, 2, 8350, 2, 8452, 2, 8452, 2, 8457, 2, 8457, 2, 8460, 2, 8469, 2, 8471, 2, 8471, 2, 8474, 2, 8479, 2, 8486, 2, 8486, 2, 8488, 2, 8488, 2, 8490, 2, 8490, 2, 8492, 2, 8507, 2, 8510, 2, 8513, 2, 8519, 2, 8523, 2, 8528, 2, 8528, 2, 8546, 2, 8586, 2, 11266, 2, 11312, 2, 11314, 2, 11360, 2, 11362, 2, 11494, 2, 11501, 2, 11504, 2, 11508, 2, 11509, 2, 11522, 2, 11559, 2, 11561, 2, 11561, 2, 11567, 2, 11567, 2, 11570, 2, 11625, 2, 11633, 2, 11633, 2, 11650, 2, 11672, 2, 11682, 2, 11688, 2, 11690, 2, 11696, 2, 11698, 2, 11704, 2, 11706, 2, 11712, 2, 11714, 2, 11720, 2, 11722, 2, 11728, 2, 11730, 2, 11736, 2, 11738, 2, 11744, 2, 12295, 2, 12297, 2, 12323, 2, 12331, 2, 12339, 2, 12343, 2, 12346, 2, 12350, 2, 12355, 2, 12440, 2, 12445, 2, 12449, 2, 12451, 2, 12540, 2, 12542, 2, 12545, 2, 12551, 2, 12591, 2, 12595, 2, 12688, 2, 12706, 2, 12732, 2, 12786, 2, 12801, 2, 13314, 2, 19895, 2, 19970, 2, 40919, 2, 40962, 2, 42126, 2, 42194, 2, 42239, 2, 42242, 2, 42510, 2, 42514, 2, 42529, 2, 42540, 2, 42541, 2, 42562, 2, 42608, 2, 42625, 2, 42655, 2, 42658, 2, 42737, 2, 42777, 2, 42785, 2, 42788, 2, 42890, 2, 42893, 2, 42928, 2, 42930, 2, 42937, 2, 43001, 2, 43011, 2, 43013, 2, 43015, 2, 43017, 2, 43020, 2, 43022, 2, 43044, 2, 43074, 2, 43125, 2, 43140, 2, 43189, 2, 43252, 2, 43257, 2, 43261, 2, 43261, 2, 43263, 2, 43263, 2, 43276, 2, 43303, 2, 43314, 2, 43336, 2, 43362, 2, 43390, 2, 43398, 2, 43444, 2, 43473, 2, 43473, 2, 43490, 2, 43494, 2, 43496, 2, 43505, 2, 43516, 2, 43520, 2, 43522, 2, 43562, 2, 43586, 2, 43588, 2, 43590, 2, 43597, 2, 43618, 2, 43640, 2, 43644, 2, 43644, 2, 43648, 2, 43697, 2, 43699, 2, 43699, 2, 43703, 2, 43704, 2, 43707, 2, 43711, 2, 43714, 2, 43714, 2, 43716, 2, 43716, 2, 43741, 2, 43743, 2, 43746, 2, 43756, 2, 43764, 2, 43766, 2, 43779, 2, 43784, 2, 43787, 2, 43792, 2, 43795, 2, 43800, 2, 43810, 2, 43816, 2, 43818, 2, 43824, 2, 43826, 2, 43868, 2, 43870, 2, 43879, 2, 43890, 2, 44004, 2, 44034, 2, 55205, 2, 55218, 2, 55240, 2, 55245, 2, 55293, 2, 63746, 2, 64111, 2, 64114, 2, 64219, 2, 64258, 2, 64264, 2, 64277, 2, 64281, 2, 64287, 2, 64287, 2, 64289, 2, 64298, 2, 64300, 2, 64312, 2, 64314, 2, 64318, 2, 64320, 2, 64320, 2, 64322, 2, 64323, 2, 64325, 2, 64326, 2, 64328, 2, 64435, 2, 64469, 2, 64831, 2, 64850, 2, 64913, 2, 64916, 2, 64969, 2, 65010, 2, 65021, 2, 65138, 2, 65142, 2, 65144, 2, 65278, 2, 65315, 2, 65340, 2, 65347, 2, 65372, 2, 65384, 2, 65472, 2, 65476, 2, 65481, 2, 65484, 2, 65489, 2, 65492, 2, 65497, 2, 65500, 2, 65502, 2, 2, 3, 13, 3, 15, 3, 40, 3, 42, 3, 60, 3, 62, 3, 63, 3, 65, 3, 79, 3, 82, 3, 95, 3, 130, 3, 252, 3, 322, 3, 374, 3, 642, 3, 670, 3, 674, 3, 722, 3, 770, 3, 801, 3, 818, 3, 844, 3, 850, 3, 887, 3, 898, 3, 927, 3, 930, 3, 965, 3, 970, 3, 977, 3, 979, 3, 983, 3, 1026, 3, 1183, 3, 1202, 3, 1237, 3, 1242, 3, 1277, 3, 1282, 3, 1321, 3, 1330, 3, 1381, 3, 1538, 3, 1848, 3, 1858, 3, 1879, 3, 1890, 3, 1897, 3, 2050, 3, 2055, 3, 2058, 3, 2058, 3, 2060, 3, 2103, 3, 2105, 3, 2106, 3, 2110, 3, 2110, 3, 2113, 3, 2135, 3, 2146, 3, 2168, 3, 2178, 3, 2208, 3, 2274, 3, 2292, 3, 2294, 3, 2295, 3, 2306, 3, 2327, 3, 2338, 3, 2363, 3, 2434, 3, 2489, 3, 2496, 3, 2497, 3, 2562, 3, 2562, 3, 2578, 3, 2581, 3, 2583, 3, 2585, 3, 2587, 3, 2613, 3, 2658, 3, 2686, 3, 2690, 3, 2718, 3, 2754, 3, 2761, 3, 2763, 3, 2790, 3, 2818, 3, 2871, 3, 2882, 3, 2903, 3, 2914, 3, 2932, 3, 2946, 3, 2963, 3, 3074, 3, 3146, 3, 3202, 3, 3252, 3, 3266, 3, 3316, 3, 4101, 3, 4153, 3, 4229, 3, 4273, 3, 4306, 3, 4330, 3, 4357, 3, 4392, 3, 4434, 3, 4468, 3, 4472, 3, 4472, 3, 4485, 3, 4532, 3, 4547, 3, 4550, 3, 4572, 3, 4572, 3, 4574, 3, 4574, 3, 4610, 3, 4627, 3, 4629, 3, 4653, 3, 4738, 3, 4744, 3, 4746, 3, 4746, 3, 4748, 3, 4751, 3, 4753, 3, 4767, 3, 4769, 3, 4778, 3, 4786, 3, 4832, 3, 4871, 3, 4878, 3, 4881, 3, 4882, 3, 4885, 3, 4906, 3, 4908, 3, 4914, 3, 4916, 3, 4917, 3, 4919, 3, 4923, 3, 4927, 3, 4927, 3, 4946, 3, 4946, 3, 4959, 3, 4963, 3, 5122, 3, 5174, 3, 5193, 3, 5196, 3, 5250, 3, 5297, 3, 5318, 3, 5319, 3, 5321, 3, 5321, 3, 5506, 3, 5552, 3, 5594, 3, 5597, 3, 5634, 3, 5681, 3, 5702, 3, 5702, 3, 5762, 3, 5804, 3, 5890, 3, 5915, 3, 6306, 3, 6369, 3, 6401, 3, 6401, 3, 6850, 3, 6906, 3, 7170, 3, 7178, 3, 7180, 3, 7216, 3, 7234, 3, 7234, 3, 7284, 3, 7313, 3, 8194, 3, 9115, 3, 9218, 3, 9328, 3, 9346, 3, 9541, 3, 12290, 3, 13360, 3, 17410, 3, 17992, 3, 26626, 3, 27194, 3, 27202, 3, 27232, 3, 27346, 3, 27375, 3, 27394, 3, 27441, 3, 27458, 3, 27461, 3, 27493, 3, 27513, 3, 27519, 3, 27537, 3, 28418, 3, 28486, 3, 28498, 3, 28498, 3, 28565, 3, 28577, 3, 28642, 3, 28642, 3, 28674, 3, 34798, 3, 34818, 3, 35572, 3, 45058, 3, 45059, 3, 48130, 3, 48236, 3, 48242, 3, 48254, 3, 48258, 3, 48266, 3, 48274, 3, 48283, 3, 54274, 3, 54358, 3, 54360, 3, 54430, 3, 54432, 3, 54433, 3, 54436, 3, 54436, 3, 54439, 3, 54440, 3, 54443, 3, 54446, 3, 54448, 3, 54459, 3, 54461, 3, 54461, 3, 54463, 3, 54469, 3, 54471, 3, 54535, 3, 54537, 3, 54540, 3, 54543, 3, 54550, 3, 54552, 3, 54558, 3, 54560, 3, 54587, 3, 54589, 3, 54592, 3, 54594, 3, 54598, 3, 54600, 3, 54600, 3, 54604, 3, 54610, 3, 54612, 3, 54951, 3, 54954, 3, 54978, 3, 54980, 3, 55004, 3, 55006, 3, 55036, 3, 55038, 3, 55062, 3, 55064, 3, 55094, 3, 55096, 3, 55120, 3, 55122, 3, 55152, 3, 55154, 3, 55178, 3, 55180, 3, 55210, 3, 55212, 3, 55236, 3, 55238, 3, 55245, 3, 59394, 3, 59590, 3, 59650, 3, 59717, 3, 60930, 3, 60933, 3, 60935, 3, 60961, 3, 60963, 3, 60964, 3, 60966, 3, 60966, 3, 60969, 3, 60969, 3, 60971, 3, 60980, 3, 60982, 3, 60985, 3, 60987, 3, 60987, 3, 60989, 3, 60989, 3, 60996, 3, 60996, 3, 61001, 3, 61001, 3, 61003, 3, 61003, 3, 61005, 3, 61005, 3, 61007, 3, 61009, 3, 61011, 3, 61012, 3, 61014, 3, 61014, 3, 61017, 3, 61017, 3, 61019, 3, 61019, 3, 61021, 3, 61021, 3, 61023, 3, 61023, 3, 61025, 3, 61025, 3, 61027, 3, 61028, 3, 61030, 3, 61030, 3, 61033, 3, 61036, 3, 61038, 3, 61044, 3, 61046, 3, 61049, 3, 61051, 3, 61054, 3, 61056, 3, 61056, 3, 61058, 3, 61067, 3, 61069, 3, 61085, 3, 61091, 3, 61093, 3, 61095, 3, 61099, 3, 61101, 3, 61117, 3, 2, 4, 42712, 4, 42754, 4, 46902, 4, 46914, 4, 47135, 4, 47138, 4, 52899, 4, 63490, 4, 64031, 4, 679, 2, 38, 2, 38, 2, 50, 2, 59, 2, 67, 2, 92, 2, 97, 2, 97, 2, 99, 2, 124, 2, 172, 2, 172, 2, 183, 2, 183, 2, 185, 2, 185, 2, 188, 2, 188, 2, 194, 2, 216, 2, 218, 2, 248, 2, 250, 2, 707, 2, 712, 2, 723, 2, 738, 2, 742, 2, 750, 2, 750, 2, 752, 2, 752, 2, 770, 2, 886, 2, 888, 2, 889, 2, 892, 2, 895, 2, 897, 2, 897, 2, 904, 2, 908, 2, 910, 2, 910, 2, 912, 2, 931, 2, 933, 2, 1015, 2, 1017, 2, 1155, 2, 1157, 2, 1161, 2, 1164, 2, 1329, 2, 1331, 2, 1368, 2, 1371, 2, 1371, 2, 1379, 2, 1417, 2, 1427, 2, 1471, 2, 1473, 2, 1473, 2, 1475, 2, 1476, 2, 1478, 2, 1479, 2, 1481, 2, 1481, 2, 1490, 2, 1516, 2, 1522, 2, 1524, 2, 1554, 2, 1564, 2, 1570, 2, 1643, 2, 1648, 2, 1749, 2, 1751, 2, 1758, 2, 1761, 2, 1770, 2, 1772, 2, 1790, 2, 1793, 2, 1793, 2, 1810, 2, 1868, 2, 1871, 2, 1971, 2, 1986, 2, 2039, 2, 2044, 2, 2044, 2, 2050, 2, 2095, 2, 2114, 2, 2141, 2, 2210, 2, 2230, 2, 2232, 2, 2239, 2, 2262, 2, 2275, 2, 2277, 2, 2405, 2, 2408, 2, 2417, 2, 2419, 2, 2437, 2, 2439, 2, 2446, 2, 2449, 2, 2450, 2, 2453, 2, 2474, 2, 2476, 2, 2482, 2, 2484, 2, 2484, 2, 2488, 2, 2491, 2, 2494, 2, 2502, 2, 2505, 2, 2506, 2, 2509, 2, 2512, 2, 2521, 2, 2521, 2, 2526, 2, 2527, 2, 2529, 2, 2533, 2, 2536, 2, 2547, 2, 2563, 2, 2565, 2, 2567, 2, 2572, 2, 2577, 2, 2578, 2, 2581, 2, 2602, 2, 2604, 2, 2610, 2, 2612, 2, 2613, 2, 2615, 2, 2616, 2, 2618, 2, 2619, 2, 2622, 2, 2622, 2, 2624, 2, 2628, 2, 2633, 2, 2634, 2, 2637, 2, 2639, 2, 2643, 2, 2643, 2, 2651, 2, 2654, 2, 2656, 2, 2656, 2, 2664, 2, 2679, 2, 2691, 2, 2693, 2, 2695, 2, 2703, 2, 2705, 2, 2707, 2, 2709, 2, 2730, 2, 2732, 2, 2738, 2, 2740, 2, 2741, 2, 2743, 2, 2747, 2, 2750, 2, 2759, 2, 2761, 2, 2763, 2, 2765, 2, 2767, 2, 2770, 2, 2770, 2, 2786, 2, 2789, 2, 2792, 2, 2801, 2, 2811, 2, 2811, 2, 2819, 2, 2821, 2, 2823, 2, 2830, 2, 2833, 2, 2834, 2, 2837, 2, 2858, 2, 2860, 2, 2866, 2, 2868, 2, 2869, 2, 2871, 2, 2875, 2, 2878, 2, 2886, 2, 2889, 2, 2890, 2, 2893, 2, 2895, 2, 2904, 2, 2905, 2, 2910, 2, 2911, 2, 2913, 2, 2917, 2, 2920, 2, 2929, 2, 2931, 2, 2931, 2, 2948, 2, 2949, 2, 2951, 2, 2956, 2, 2960, 2, 2962, 2, 2964, 2, 2967, 2, 2971, 2, 2972, 2, 2974, 2, 2974, 2, 2976, 2, 2977, 2, 2981, 2, 2982, 2, 2986, 2, 2988, 2, 2992, 2, 3003, 2, 3008, 2, 3012, 2, 3016, 2, 3018, 2, 3020, 2, 3023, 2, 3026, 2, 3026, 2, 3033, 2, 3033, 2, 3048, 2, 3057, 2, 3074, 2, 3077, 2, 3079, 2, 3086, 2, 3088, 2, 3090, 2, 3092, 2, 3114, 2, 3116, 2, 3131, 2, 3135, 2, 3142, 2, 3144, 2, 3146, 2, 3148, 2, 3151, 2, 3159, 2, 3160, 2, 3162, 2, 3164, 2, 3170, 2, 3173, 2, 3176, 2, 3185, 2, 3202, 2, 3205, 2, 3207, 2, 3214, 2, 3216, 2, 3218, 2, 3220, 2, 3242, 2, 3244, 2, 3253, 2, 3255, 2, 3259, 2, 3262, 2, 3270, 2, 3272, 2, 3274, 2, 3276, 2, 3279, 2, 3287, 2, 3288, 2, 3296, 2, 3296, 2, 3298, 2, 3301, 2, 3304, 2, 3313, 2, 3315, 2, 3316, 2, 3331, 2, 3333, 2, 3335, 2, 3342, 2, 3344, 2, 3346, 2, 3348, 2, 3388, 2, 3391, 2, 3398, 2, 3400, 2, 3402, 2, 3404, 2, 3408, 2, 3414, 2, 3417, 2, 3425, 2, 3429, 2, 3432, 2, 3441, 2, 3452, 2, 3457, 2, 3460, 2, 3461, 2, 3463, 2, 3480, 2, 3484, 2, 3507, 2, 3509, 2, 3517, 2, 3519, 2, 3519, 2, 3522, 2, 3528, 2, 3532, 2, 3532, 2, 3537, 2, 3542, 2, 3544, 2, 3544, 2, 3546, 2, 3553, 2, 3560, 2, 3569, 2, 3572, 2, 3573, 2, 3587, 2, 3644, 2, 3650, 2, 3664, 2, 3666, 2, 3675, 2, 3715, 2, 3716, 2, 3718, 2, 3718, 2, 3721, 2, 3722, 2, 3724, 2, 3724, 2, 3727, 2, 3727, 2, 3734, 2, 3737, 2, 3739, 2, 3745, 2, 3747, 2, 3749, 2, 3751, 2, 3751, 2, 3753, 2, 3753, 2, 3756, 2, 3757, 2, 3759, 2, 3771, 2, 3773, 2, 3775, 2, 3778, 2, 3782, 2, 3784, 2, 3784, 2, 3786, 2, 3791, 2, 3794, 2, 3803, 2, 3806, 2, 3809, 2, 3842, 2, 3842, 2, 3866, 2, 3867, 2, 3874, 2, 3883, 2, 3895, 2, 3895, 2, 3897, 2, 3897, 2, 3899, 2, 3899, 2, 3904, 2, 3913, 2, 3915, 2, 3950, 2, 3955, 2, 3974, 2, 3976, 2, 3993, 2, 3995, 2, 4030, 2, 4040, 2, 4040, 2, 4098, 2, 4171, 2, 4178, 2, 4255, 2, 4258, 2, 4295, 2, 4297, 2, 4297, 2, 4303, 2, 4303, 2, 4306, 2, 4348, 2, 4350, 2, 4682, 2, 4684, 2, 4687, 2, 4690, 2, 4696, 2, 4698, 2, 4698, 2, 4700, 2, 4703, 2, 4706, 2, 4746, 2, 4748, 2, 4751, 2, 4754, 2, 4786, 2, 4788, 2, 4791, 2, 4794, 2, 4800, 2, 4802, 2, 4802, 2, 4804, 2, 4807, 2, 4810, 2, 4824, 2, 4826, 2, 4882, 2, 4884, 2, 4887, 2, 4890, 2, 4956, 2, 4959, 2, 4961, 2, 4971, 2, 4979, 2, 4994, 2, 5009, 2, 5026, 2, 5111, 2, 5114, 2, 5119, 2, 5123, 2, 5742, 2, 5745, 2, 5761, 2, 5763, 2, 5788, 2, 5794, 2, 5868, 2, 5872, 2, 5882, 2, 5890, 2, 5902, 2, 5904, 2, 5910, 2, 5922, 2, 5942, 2, 5954, 2, 5973, 2, 5986, 2, 5998, 2, 6000, 2, 6002, 2, 6004, 2, 6005, 2, 6018, 2, 6101, 2, 6105, 2, 6105, 2, 6110, 2, 6111, 2, 6114, 2, 6123, 2, 6157, 2, 6159, 2, 6162, 2, 6171, 2, 6178, 2, 6265, 2, 6274, 2, 6316, 2, 6322, 2, 6391, 2, 6402, 2, 6432, 2, 6434, 2, 6445, 2, 6450, 2, 6461, 2, 6472, 2, 6511, 2, 6514, 2, 6518, 2, 6530, 2, 6573, 2, 6578, 2, 6603, 2, 6610, 2, 6620, 2, 6658, 2, 6685, 2, 6690, 2, 6752, 2, 6754, 2, 6782, 2, 6785, 2, 6795, 2, 6802, 2, 6811, 2, 6825, 2, 6825, 2, 6834, 2, 6847, 2, 6914, 2, 6989, 2, 6994, 2, 7003, 2, 7021, 2, 7029, 2, 7042, 2, 7157, 2, 7170, 2, 7225, 2, 7234, 2, 7243, 2, 7247, 2, 7295, 2, 7298, 2, 7306, 2, 7378, 2, 7380, 2, 7382, 2, 7416, 2, 7418, 2, 7419, 2, 7426, 2, 7671, 2, 7677, 2, 7959, 2, 7962, 2, 7967, 2, 7970, 2, 8007, 2, 8010, 2, 8015, 2, 8018, 2, 8025, 2, 8027, 2, 8027, 2, 8029, 2, 8029, 2, 8031, 2, 8031, 2, 8033, 2, 8063, 2, 8066, 2, 8118, 2, 8120, 2, 8126, 2, 8128, 2, 8128, 2, 8132, 2, 8134, 2, 8136, 2, 8142, 2, 8146, 2, 8149, 2, 8152, 2, 8157, 2, 8162, 2, 8174, 2, 8180, 2, 8182, 2, 8184, 2, 8190, 2, 8257, 2, 8258, 2, 8278, 2, 8278, 2, 8307, 2, 8307, 2, 8321, 2, 8321, 2, 8338, 2, 8350, 2, 8402, 2, 8414, 2, 8419, 2, 8419, 2, 8423, 2, 8434, 2, 8452, 2, 8452, 2, 8457, 2, 8457, 2, 8460, 2, 8469, 2, 8471, 2, 8471, 2, 8474, 2, 8479, 2, 8486, 2, 8486, 2, 8488, 2, 8488, 2, 8490, 2, 8490, 2, 8492, 2, 8507, 2, 8510, 2, 8513, 2, 8519, 2, 8523, 2, 8528, 2, 8528, 2, 8546, 2, 8586, 2, 11266, 2, 11312, 2, 11314, 2, 11360, 2, 11362, 2, 11494, 2, 11501, 2, 11509, 2, 11522, 2, 11559, 2, 11561, 2, 11561, 2, 11567, 2, 11567, 2, 11570, 2, 11625, 2, 11633, 2, 11633, 2, 11649, 2, 11672, 2, 11682, 2, 11688, 2, 11690, 2, 11696, 2, 11698, 2, 11704, 2, 11706, 2, 11712, 2, 11714, 2, 11720, 2, 11722, 2, 11728, 2, 11730, 2, 11736, 2, 11738, 2, 11744, 2, 11746, 2, 11777, 2, 12295, 2, 12297, 2, 12323, 2, 12337, 2, 12339, 2, 12343, 2, 12346, 2, 12350, 2, 12355, 2, 12440, 2, 12443, 2, 12449, 2, 12451, 2, 12540, 2, 12542, 2, 12545, 2, 12551, 2, 12591, 2, 12595, 2, 12688, 2, 12706, 2, 12732, 2, 12786, 2, 12801, 2, 13314, 2, 19895, 2, 19970, 2, 40919, 2, 40962, 2, 42126, 2, 42194, 2, 42239, 2, 42242, 2, 42510, 2, 42514, 2, 42541, 2, 42562, 2, 42609, 2, 42614, 2, 42623, 2, 42625, 2, 42739, 2, 42777, 2, 42785, 2, 42788, 2, 42890, 2, 42893, 2, 42928, 2, 42930, 2, 42937, 2, 43001, 2, 43049, 2, 43074, 2, 43125, 2, 43138, 2, 43207, 2, 43218, 2, 43227, 2, 43234, 2, 43257, 2, 43261, 2, 43261, 2, 43263, 2, 43263, 2, 43266, 2, 43311, 2, 43314, 2, 43349, 2, 43362, 2, 43390, 2, 43394, 2, 43458, 2, 43473, 2, 43483, 2, 43490, 2, 43520, 2, 43522, 2, 43576, 2, 43586, 2, 43599, 2, 43602, 2, 43611, 2, 43618, 2, 43640, 2, 43644, 2, 43716, 2, 43741, 2, 43743, 2, 43746, 2, 43761, 2, 43764, 2, 43768, 2, 43779, 2, 43784, 2, 43787, 2, 43792, 2, 43795, 2, 43800, 2, 43810, 2, 43816, 2, 43818, 2, 43824, 2, 43826, 2, 43868, 2, 43870, 2, 43879, 2, 43890, 2, 44012, 2, 44014, 2, 44015, 2, 44018, 2, 44027, 2, 44034, 2, 55205, 2, 55218, 2, 55240, 2, 55245, 2, 55293, 2, 63746, 2, 64111, 2, 64114, 2, 64219, 2, 64258, 2, 64264, 2, 64277, 2, 64281, 2, 64287, 2, 64298, 2, 64300, 2, 64312, 2, 64314, 2, 64318, 2, 64320, 2, 64320, 2, 64322, 2, 64323, 2, 64325, 2, 64326, 2, 64328, 2, 64435, 2, 64469, 2, 64831, 2, 64850, 2, 64913, 2, 64916, 2, 64969, 2, 65010, 2, 65021, 2, 65026, 2, 65041, 2, 65058, 2, 65073, 2, 65077, 2, 65078, 2, 65103, 2, 65105, 2, 65138, 2, 65142, 2, 65144, 2, 65278, 2, 65298, 2, 65307, 2, 65315, 2, 65340, 2, 65345, 2, 65345, 2, 65347, 2, 65372, 2, 65384, 2, 65472, 2, 65476, 2, 65481, 2, 65484, 2, 65489, 2, 65492, 2, 65497, 2, 65500, 2, 65502, 2, 2, 3, 13, 3, 15, 3, 40, 3, 42, 3, 60, 3, 62, 3, 63, 3, 65, 3, 79, 3, 82, 3, 95, 3, 130, 3, 252, 3, 322, 3, 374, 3, 511, 3, 511, 3, 642, 3, 670, 3, 674, 3, 722, 3, 738, 3, 738, 3, 770, 3, 801, 3, 818, 3, 844, 3, 850, 3, 892, 3, 898, 3, 927, 3, 930, 3, 965, 3, 970, 3, 977, 3, 979, 3, 983, 3, 1026, 3, 1183, 3, 1186, 3, 1195, 3, 1202, 3, 1237, 3, 1242, 3, 1277, 3, 1282, 3, 1321, 3, 1330, 3, 1381, 3, 1538, 3, 1848, 3, 1858, 3, 1879, 3, 1890, 3, 1897, 3, 2050, 3, 2055, 3, 2058, 3, 2058, 3, 2060, 3, 2103, 3, 2105, 3, 2106, 3, 2110, 3, 2110, 3, 2113, 3, 2135, 3, 2146, 3, 2168, 3, 2178, 3, 2208, 3, 2274, 3, 2292, 3, 2294, 3, 2295, 3, 2306, 3, 2327, 3, 2338, 3, 2363, 3, 2434, 3, 2489, 3, 2496, 3, 2497, 3, 2562, 3, 2565, 3, 2567, 3, 2568, 3, 2574, 3, 2581, 3, 2583, 3, 2585, 3, 2587, 3, 2613, 3, 2618, 3, 2620, 3, 2625, 3, 2625, 3, 2658, 3, 2686, 3, 2690, 3, 2718, 3, 2754, 3, 2761, 3, 2763, 3, 2792, 3, 2818, 3, 2871, 3, 2882, 3, 2903, 3, 2914, 3, 2932, 3, 2946, 3, 2963, 3, 3074, 3, 3146, 3, 3202, 3, 3252, 3, 3266, 3, 3316, 3, 4098, 3, 4168, 3, 4200, 3, 4209, 3, 4225, 3, 4284, 3, 4306, 3, 4330, 3, 4338, 3, 4347, 3, 4354, 3, 4406, 3, 4408, 3, 4417, 3, 4434, 3, 4469, 3, 4472, 3, 4472, 3, 4482, 3, 4550, 3, 4556, 3, 4558, 3, 4562, 3, 4572, 3, 4574, 3, 4574, 3, 4610, 3, 4627, 3, 4629, 3, 4665, 3, 4672, 3, 4672, 3, 4738, 3, 4744, 3, 4746, 3, 4746, 3, 4748, 3, 4751, 3, 4753, 3, 4767, 3, 4769, 3, 4778, 3, 4786, 3, 4844, 3, 4850, 3, 4859, 3, 4866, 3, 4869, 3, 4871, 3, 4878, 3, 4881, 3, 4882, 3, 4885, 3, 4906, 3, 4908, 3, 4914, 3, 4916, 3, 4917, 3, 4919, 3, 4923, 3, 4926, 3, 4934, 3, 4937, 3, 4938, 3, 4941, 3, 4943, 3, 4946, 3, 4946, 3, 4953, 3, 4953, 3, 4959, 3, 4965, 3, 4968, 3, 4974, 3, 4978, 3, 4982, 3, 5122, 3, 5196, 3, 5202, 3, 5211, 3, 5250, 3, 5319, 3, 5321, 3, 5321, 3, 5330, 3, 5339, 3, 5506, 3, 5559, 3, 5562, 3, 5570, 3, 5594, 3, 5599, 3, 5634, 3, 5698, 3, 5702, 3, 5702, 3, 5714, 3, 5723, 3, 5762, 3, 5817, 3, 5826, 3, 5835, 3, 5890, 3, 5915, 3, 5919, 3, 5933, 3, 5938, 3, 5947, 3, 6306, 3, 6379, 3, 6401, 3, 6401, 3, 6850, 3, 6906, 3, 7170, 3, 7178, 3, 7180, 3, 7224, 3, 7226, 3, 7234, 3, 7250, 3, 7259, 3, 7284, 3, 7313, 3, 7316, 3, 7337, 3, 7339, 3, 7352, 3, 8194, 3, 9115, 3, 9218, 3, 9328, 3, 9346, 3, 9541, 3, 12290, 3, 13360, 3, 17410, 3, 17992, 3, 26626, 3, 27194, 3, 27202, 3, 27232, 3, 27234, 3, 27243, 3, 27346, 3, 27375, 3, 27378, 3, 27382, 3, 27394, 3, 27448, 3, 27458, 3, 27461, 3, 27474, 3, 27483, 3, 27493, 3, 27513, 3, 27519, 3, 27537, 3, 28418, 3, 28486, 3, 28498, 3, 28544, 3, 28561, 3, 28577, 3, 28642, 3, 28642, 3, 28674, 3, 34798, 3, 34818, 3, 35572, 3, 45058, 3, 45059, 3, 48130, 3, 48236, 3, 48242, 3, 48254, 3, 48258, 3, 48266, 3, 48274, 3, 48283, 3, 48287, 3, 48288, 3, 53607, 3, 53611, 3, 53615, 3, 53620, 3, 53629, 3, 53636, 3, 53639, 3, 53645, 3, 53676, 3, 53679, 3, 53828, 3, 53830, 3, 54274, 3, 54358, 3, 54360, 3, 54430, 3, 54432, 3, 54433, 3, 54436, 3, 54436, 3, 54439, 3, 54440, 3, 54443, 3, 54446, 3, 54448, 3, 54459, 3, 54461, 3, 54461, 3, 54463, 3, 54469, 3, 54471, 3, 54535, 3, 54537, 3, 54540, 3, 54543, 3, 54550, 3, 54552, 3, 54558, 3, 54560, 3, 54587, 3, 54589, 3, 54592, 3, 54594, 3, 54598, 3, 54600, 3, 54600, 3, 54604, 3, 54610, 3, 54612, 3, 54951, 3, 54954, 3, 54978, 3, 54980, 3, 55004, 3, 55006, 3, 55036, 3, 55038, 3, 55062, 3, 55064, 3, 55094, 3, 55096, 3, 55120, 3, 55122, 3, 55152, 3, 55154, 3, 55178, 3, 55180, 3, 55210, 3, 55212, 3, 55236, 3, 55238, 3, 55245, 3, 55248, 3, 55297, 3, 55810, 3, 55864, 3, 55869, 3, 55918, 3, 55927, 3, 55927, 3, 55942, 3, 55942, 3, 55965, 3, 55969, 3, 55971, 3, 55985, 3, 57346, 3, 57352, 3, 57354, 3, 57370, 3, 57373, 3, 57379, 3, 57381, 3, 57382, 3, 57384, 3, 57388, 3, 59394, 3, 59590, 3, 59602, 3, 59608, 3, 59650, 3, 59724, 3, 59730, 3, 59739, 3, 60930, 3, 60933, 3, 60935, 3, 60961, 3, 60963, 3, 60964, 3, 60966, 3, 60966, 3, 60969, 3, 60969, 3, 60971, 3, 60980, 3, 60982, 3, 60985, 3, 60987, 3, 60987, 3, 60989, 3, 60989, 3, 60996, 3, 60996, 3, 61001, 3, 61001, 3, 61003, 3, 61003, 3, 61005, 3, 61005, 3, 61007, 3, 61009, 3, 61011, 3, 61012, 3, 61014, 3, 61014, 3, 61017, 3, 61017, 3, 61019, 3, 61019, 3, 61021, 3, 61021, 3, 61023, 3, 61023, 3, 61025, 3, 61025, 3, 61027, 3, 61028, 3, 61030, 3, 61030, 3, 61033, 3, 61036, 3, 61038, 3, 61044, 3, 61046, 3, 61049, 3, 61051, 3, 61054, 3, 61056, 3, 61056, 3, 61058, 3, 61067, 3, 61069, 3, 61085, 3, 61091, 3, 61093, 3, 61095, 3, 61099, 3, 61101, 3, 61117, 3, 2, 4, 42712, 4, 42754, 4, 46902, 4, 46914, 4, 47135, 4, 47138, 4, 52899, 4, 63490, 4, 64031, 4, 258, 16, 497, 16, 175, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 21, 3, 2, 2, 2, 2, 23, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 3, 43, 3, 2, 2, 2, 5, 48, 3, 2, 2, 2, 7, 54, 3, 2, 2, 2, 9, 59, 3, 2, 2, 2, 11, 69, 3, 2, 2, 2, 13, 71, 3, 2, 2, 2, 15, 73, 3, 2, 2, 2, 17, 75, 3, 2, 2, 2, 19, 77, 3, 2, 2, 2, 21, 79, 3, 2, 2, 2, 23, 89, 3, 2, 2, 2, 25, 96, 3, 2, 2, 2, 27, 104, 3, 2, 2, 2, 29, 108, 3, 2, 2, 2, 31, 130, 3, 2, 2, 2, 33, 132, 3, 2, 2, 2, 35, 139, 3, 2, 2, 2, 37, 145, 3, 2, 2, 2, 39, 152, 3, 2, 2, 2, 41, 163, 3, 2, 2, 2, 43, 44, 7, 118, 2, 2, 44, 45, 7, 116, 2, 2, 45, 46, 7, 119, 2, 2, 46, 47, 7, 103, 2, 2, 47, 4, 3, 2, 2, 2, 48, 49, 7, 104, 2, 2, 49, 50, 7, 99, 2, 2, 50, 51, 7, 110, 2, 2, 51, 52, 7, 117, 2, 2, 52, 53, 7, 103, 2, 2, 53, 6, 3, 2, 2, 2, 54, 55, 7, 112, 2, 2, 55, 56, 7, 119, 2, 2, 56, 57, 7, 110, 2, 2, 57, 58, 7, 110, 2, 2, 58, 8, 3, 2, 2, 2, 59, 60, 7, 119, 2, 2, 60, 61, 7, 112, 2, 2, 61, 62, 7, 102, 2, 2, 62, 63, 7, 103, 2, 2, 63, 64, 7, 104, 2, 2, 64, 65, 7, 107, 2, 2, 65, 66, 7, 112, 2, 2, 66, 67, 7, 103, 2, 2, 67, 68, 7, 102, 2, 2, 68, 10, 3, 2, 2, 2, 69, 70, 7, 46, 2, 2, 70, 12, 3, 2, 2, 2, 71, 72, 7, 93, 2, 2, 72, 14, 3, 2, 2, 2, 73, 74, 7, 95, 2, 2, 74, 16, 3, 2, 2, 2, 75, 76, 7, 127, 2, 2, 76, 18, 3, 2, 2, 2, 77, 78, 7, 125, 2, 2, 78, 20, 3, 2, 2, 2, 79, 80, 7, 60, 2, 2, 80, 22, 3, 2, 2, 2, 81, 82, 7, 36, 2, 2, 82, 83, 5, 25, 13, 2, 83, 84, 7, 36, 2, 2, 84, 90, 3, 2, 2, 2, 85, 86, 7, 41, 2, 2, 86, 87, 5, 27, 14, 2, 87, 88, 7, 41, 2, 2, 88, 90, 3, 2, 2, 2, 89, 81, 3, 2, 2, 2, 89, 85, 3, 2, 2, 2, 90, 24, 3, 2, 2, 2, 91, 92, 7, 94, 2, 2, 92, 95, 7, 36, 2, 2, 93, 95, 10, 2, 2, 2, 94, 91, 3, 2, 2, 2, 94, 93, 3, 2, 2, 2, 95, 98, 3, 2, 2, 2, 96, 94, 3, 2, 2, 2, 96, 97, 3, 2, 2, 2, 97, 26, 3, 2, 2, 2, 98, 96, 3, 2, 2, 2, 99, 100, 7, 94, 2, 2, 100, 103, 7, 41, 2, 2, 101, 103, 10, 3, 2, 2, 102, 99, 3, 2, 2, 2, 102, 101, 3, 2, 2, 2, 103, 106, 3, 2, 2, 2, 104, 102, 3, 2, 2, 2, 104, 105, 3, 2, 2, 2, 105, 28, 3, 2, 2, 2, 106, 104, 3, 2, 2, 2, 107, 109, 7, 47, 2, 2, 108, 107, 3, 2, 2, 2, 108, 109, 3, 2, 2, 2, 109, 110, 3, 2, 2, 2, 110, 117, 5, 31, 16, 2, 111, 113, 7, 48, 2, 2, 112, 114, 9, 4, 2, 2, 113, 112, 3, 2, 2, 2, 114, 115, 3, 2, 2, 2, 115, 113, 3, 2, 2, 2, 115, 116, 3, 2, 2, 2, 116, 118, 3, 2, 2, 2, 117, 111, 3, 2, 2, 2, 117, 118, 3, 2, 2, 2, 118, 120, 3, 2, 2, 2, 119, 121, 5, 33, 17, 2, 120, 119, 3, 2, 2, 2, 120, 121, 3, 2, 2, 2, 121, 30, 3, 2, 2, 2, 122, 131, 7, 50, 2, 2, 123, 127, 9, 5, 2, 2, 124, 126, 9, 4, 2, 2, 125, 124, 3, 2, 2, 2, 126, 129, 3, 2, 2, 2, 127, 125, 3, 2, 2, 2, 127, 128, 3, 2, 2, 2, 128, 131, 3, 2, 2, 2, 129, 127, 3, 2, 2, 2, 130, 122, 3, 2, 2, 2, 130, 123, 3, 2, 2, 2, 131, 32, 3, 2, 2, 2, 132, 134, 9, 6, 2, 2, 133, 135, 9, 7, 2, 2, 134, 133, 3, 2, 2, 2, 134, 135, 3, 2, 2, 2, 135, 136, 3, 2, 2, 2, 136, 137, 5, 31, 16, 2, 137, 34, 3, 2, 2, 2, 138, 140, 9, 8, 2, 2, 139, 138, 3, 2, 2, 2, 140, 141, 3, 2, 2, 2, 141, 139, 3, 2, 2, 2, 141, 142, 3, 2, 2, 2, 142, 143, 3, 2, 2, 2, 143, 144, 8, 18, 2, 2, 144, 36, 3, 2, 2, 2, 145, 149, 9, 10, 2, 2, 146, 148, 9, 11, 2, 2, 147, 146, 3, 2, 2, 2, 148, 151, 3, 2, 2, 2, 149, 147, 3, 2, 2, 2, 149, 150, 3, 2, 2, 2, 150, 38, 3, 2, 2, 2, 151, 149, 3, 2, 2, 2, 152, 153, 7, 49, 2, 2, 153, 154, 7, 49, 2, 2, 154, 158, 3, 2, 2, 2, 155, 157, 10, 9, 2, 2, 156, 155, 3, 2, 2, 2, 157, 160, 3, 2, 2, 2, 158, 156, 3, 2, 2, 2, 158, 159, 3, 2, 2, 2, 159, 161, 3, 2, 2, 2, 160, 158, 3, 2, 2, 2, 161, 162, 8, 20, 3, 2, 162, 40, 3, 2, 2, 2, 163, 164, 11, 2, 2, 2, 164, 42, 3, 2, 2, 2, 18, 2, 89, 94, 96, 102, 104, 108, 115, 117, 120, 127, 130, 134, 141, 149, 158, 4, 8, 2, 2, 2, 3, 2] \ No newline at end of file +[3, 51485, 51898, 1421, 44986, 20307, 1543, 60043, 49729, 2, 19, 181, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 7, 3, 7, 3, 8, 3, 8, 3, 9, 3, 9, 3, 10, 3, 10, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 92, 10, 12, 3, 13, 3, 13, 3, 13, 7, 13, 97, 10, 13, 12, 13, 14, 13, 100, 11, 13, 3, 14, 3, 14, 3, 14, 7, 14, 105, 10, 14, 12, 14, 14, 14, 108, 11, 14, 3, 15, 5, 15, 111, 10, 15, 3, 15, 3, 15, 3, 15, 6, 15, 116, 10, 15, 13, 15, 14, 15, 117, 5, 15, 120, 10, 15, 3, 15, 5, 15, 123, 10, 15, 3, 16, 3, 16, 3, 16, 7, 16, 128, 10, 16, 12, 16, 14, 16, 131, 11, 16, 5, 16, 133, 10, 16, 3, 17, 3, 17, 5, 17, 137, 10, 17, 3, 17, 3, 17, 3, 18, 6, 18, 142, 10, 18, 13, 18, 14, 18, 143, 3, 18, 3, 18, 3, 19, 3, 19, 7, 19, 150, 10, 19, 12, 19, 14, 19, 153, 11, 19, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 159, 10, 20, 12, 20, 14, 20, 162, 11, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 170, 10, 21, 12, 21, 14, 21, 173, 11, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 171, 2, 2, 23, 3, 2, 3, 5, 2, 4, 7, 2, 5, 9, 2, 6, 11, 2, 7, 13, 2, 8, 15, 2, 9, 17, 2, 10, 19, 2, 11, 21, 2, 12, 23, 2, 13, 25, 2, 2, 27, 2, 2, 29, 2, 14, 31, 2, 2, 33, 2, 2, 35, 2, 15, 37, 2, 16, 39, 2, 17, 41, 2, 18, 43, 2, 19, 3, 2, 10, 3, 2, 36, 36, 3, 2, 41, 41, 3, 2, 50, 59, 3, 2, 51, 59, 4, 2, 71, 71, 103, 103, 4, 2, 45, 45, 47, 47, 13, 2, 11, 15, 34, 34, 135, 135, 162, 162, 5762, 5762, 8194, 8204, 8234, 8235, 8241, 8241, 8289, 8289, 12290, 12290, 65281, 65281, 4, 2, 12, 12, 15, 15, 4, 575, 2, 38, 2, 38, 2, 67, 2, 92, 2, 97, 2, 97, 2, 99, 2, 124, 2, 172, 2, 172, 2, 183, 2, 183, 2, 188, 2, 188, 2, 194, 2, 216, 2, 218, 2, 248, 2, 250, 2, 707, 2, 712, 2, 723, 2, 738, 2, 742, 2, 750, 2, 750, 2, 752, 2, 752, 2, 882, 2, 886, 2, 888, 2, 889, 2, 892, 2, 895, 2, 897, 2, 897, 2, 904, 2, 904, 2, 906, 2, 908, 2, 910, 2, 910, 2, 912, 2, 931, 2, 933, 2, 1015, 2, 1017, 2, 1155, 2, 1164, 2, 1329, 2, 1331, 2, 1368, 2, 1371, 2, 1371, 2, 1379, 2, 1417, 2, 1490, 2, 1516, 2, 1522, 2, 1524, 2, 1570, 2, 1612, 2, 1648, 2, 1649, 2, 1651, 2, 1749, 2, 1751, 2, 1751, 2, 1767, 2, 1768, 2, 1776, 2, 1777, 2, 1788, 2, 1790, 2, 1793, 2, 1793, 2, 1810, 2, 1810, 2, 1812, 2, 1841, 2, 1871, 2, 1959, 2, 1971, 2, 1971, 2, 1996, 2, 2028, 2, 2038, 2, 2039, 2, 2044, 2, 2044, 2, 2050, 2, 2071, 2, 2076, 2, 2076, 2, 2086, 2, 2086, 2, 2090, 2, 2090, 2, 2114, 2, 2138, 2, 2210, 2, 2230, 2, 2232, 2, 2239, 2, 2310, 2, 2363, 2, 2367, 2, 2367, 2, 2386, 2, 2386, 2, 2394, 2, 2403, 2, 2419, 2, 2434, 2, 2439, 2, 2446, 2, 2449, 2, 2450, 2, 2453, 2, 2474, 2, 2476, 2, 2482, 2, 2484, 2, 2484, 2, 2488, 2, 2491, 2, 2495, 2, 2495, 2, 2512, 2, 2512, 2, 2526, 2, 2527, 2, 2529, 2, 2531, 2, 2546, 2, 2547, 2, 2567, 2, 2572, 2, 2577, 2, 2578, 2, 2581, 2, 2602, 2, 2604, 2, 2610, 2, 2612, 2, 2613, 2, 2615, 2, 2616, 2, 2618, 2, 2619, 2, 2651, 2, 2654, 2, 2656, 2, 2656, 2, 2676, 2, 2678, 2, 2695, 2, 2703, 2, 2705, 2, 2707, 2, 2709, 2, 2730, 2, 2732, 2, 2738, 2, 2740, 2, 2741, 2, 2743, 2, 2747, 2, 2751, 2, 2751, 2, 2770, 2, 2770, 2, 2786, 2, 2787, 2, 2811, 2, 2811, 2, 2823, 2, 2830, 2, 2833, 2, 2834, 2, 2837, 2, 2858, 2, 2860, 2, 2866, 2, 2868, 2, 2869, 2, 2871, 2, 2875, 2, 2879, 2, 2879, 2, 2910, 2, 2911, 2, 2913, 2, 2915, 2, 2931, 2, 2931, 2, 2949, 2, 2949, 2, 2951, 2, 2956, 2, 2960, 2, 2962, 2, 2964, 2, 2967, 2, 2971, 2, 2972, 2, 2974, 2, 2974, 2, 2976, 2, 2977, 2, 2981, 2, 2982, 2, 2986, 2, 2988, 2, 2992, 2, 3003, 2, 3026, 2, 3026, 2, 3079, 2, 3086, 2, 3088, 2, 3090, 2, 3092, 2, 3114, 2, 3116, 2, 3131, 2, 3135, 2, 3135, 2, 3162, 2, 3164, 2, 3170, 2, 3171, 2, 3202, 2, 3202, 2, 3207, 2, 3214, 2, 3216, 2, 3218, 2, 3220, 2, 3242, 2, 3244, 2, 3253, 2, 3255, 2, 3259, 2, 3263, 2, 3263, 2, 3296, 2, 3296, 2, 3298, 2, 3299, 2, 3315, 2, 3316, 2, 3335, 2, 3342, 2, 3344, 2, 3346, 2, 3348, 2, 3388, 2, 3391, 2, 3391, 2, 3408, 2, 3408, 2, 3414, 2, 3416, 2, 3425, 2, 3427, 2, 3452, 2, 3457, 2, 3463, 2, 3480, 2, 3484, 2, 3507, 2, 3509, 2, 3517, 2, 3519, 2, 3519, 2, 3522, 2, 3528, 2, 3587, 2, 3634, 2, 3636, 2, 3637, 2, 3650, 2, 3656, 2, 3715, 2, 3716, 2, 3718, 2, 3718, 2, 3721, 2, 3722, 2, 3724, 2, 3724, 2, 3727, 2, 3727, 2, 3734, 2, 3737, 2, 3739, 2, 3745, 2, 3747, 2, 3749, 2, 3751, 2, 3751, 2, 3753, 2, 3753, 2, 3756, 2, 3757, 2, 3759, 2, 3762, 2, 3764, 2, 3765, 2, 3775, 2, 3775, 2, 3778, 2, 3782, 2, 3784, 2, 3784, 2, 3806, 2, 3809, 2, 3842, 2, 3842, 2, 3906, 2, 3913, 2, 3915, 2, 3950, 2, 3978, 2, 3982, 2, 4098, 2, 4140, 2, 4161, 2, 4161, 2, 4178, 2, 4183, 2, 4188, 2, 4191, 2, 4195, 2, 4195, 2, 4199, 2, 4200, 2, 4208, 2, 4210, 2, 4215, 2, 4227, 2, 4240, 2, 4240, 2, 4258, 2, 4295, 2, 4297, 2, 4297, 2, 4303, 2, 4303, 2, 4306, 2, 4348, 2, 4350, 2, 4682, 2, 4684, 2, 4687, 2, 4690, 2, 4696, 2, 4698, 2, 4698, 2, 4700, 2, 4703, 2, 4706, 2, 4746, 2, 4748, 2, 4751, 2, 4754, 2, 4786, 2, 4788, 2, 4791, 2, 4794, 2, 4800, 2, 4802, 2, 4802, 2, 4804, 2, 4807, 2, 4810, 2, 4824, 2, 4826, 2, 4882, 2, 4884, 2, 4887, 2, 4890, 2, 4956, 2, 4994, 2, 5009, 2, 5026, 2, 5111, 2, 5114, 2, 5119, 2, 5123, 2, 5742, 2, 5745, 2, 5761, 2, 5763, 2, 5788, 2, 5794, 2, 5868, 2, 5872, 2, 5882, 2, 5890, 2, 5902, 2, 5904, 2, 5907, 2, 5922, 2, 5939, 2, 5954, 2, 5971, 2, 5986, 2, 5998, 2, 6000, 2, 6002, 2, 6018, 2, 6069, 2, 6105, 2, 6105, 2, 6110, 2, 6110, 2, 6178, 2, 6265, 2, 6274, 2, 6314, 2, 6316, 2, 6316, 2, 6322, 2, 6391, 2, 6402, 2, 6432, 2, 6482, 2, 6511, 2, 6514, 2, 6518, 2, 6530, 2, 6573, 2, 6578, 2, 6603, 2, 6658, 2, 6680, 2, 6690, 2, 6742, 2, 6825, 2, 6825, 2, 6919, 2, 6965, 2, 6983, 2, 6989, 2, 7045, 2, 7074, 2, 7088, 2, 7089, 2, 7100, 2, 7143, 2, 7170, 2, 7205, 2, 7247, 2, 7249, 2, 7260, 2, 7295, 2, 7298, 2, 7306, 2, 7403, 2, 7406, 2, 7408, 2, 7411, 2, 7415, 2, 7416, 2, 7426, 2, 7617, 2, 7682, 2, 7959, 2, 7962, 2, 7967, 2, 7970, 2, 8007, 2, 8010, 2, 8015, 2, 8018, 2, 8025, 2, 8027, 2, 8027, 2, 8029, 2, 8029, 2, 8031, 2, 8031, 2, 8033, 2, 8063, 2, 8066, 2, 8118, 2, 8120, 2, 8126, 2, 8128, 2, 8128, 2, 8132, 2, 8134, 2, 8136, 2, 8142, 2, 8146, 2, 8149, 2, 8152, 2, 8157, 2, 8162, 2, 8174, 2, 8180, 2, 8182, 2, 8184, 2, 8190, 2, 8307, 2, 8307, 2, 8321, 2, 8321, 2, 8338, 2, 8350, 2, 8452, 2, 8452, 2, 8457, 2, 8457, 2, 8460, 2, 8469, 2, 8471, 2, 8471, 2, 8474, 2, 8479, 2, 8486, 2, 8486, 2, 8488, 2, 8488, 2, 8490, 2, 8490, 2, 8492, 2, 8507, 2, 8510, 2, 8513, 2, 8519, 2, 8523, 2, 8528, 2, 8528, 2, 8546, 2, 8586, 2, 11266, 2, 11312, 2, 11314, 2, 11360, 2, 11362, 2, 11494, 2, 11501, 2, 11504, 2, 11508, 2, 11509, 2, 11522, 2, 11559, 2, 11561, 2, 11561, 2, 11567, 2, 11567, 2, 11570, 2, 11625, 2, 11633, 2, 11633, 2, 11650, 2, 11672, 2, 11682, 2, 11688, 2, 11690, 2, 11696, 2, 11698, 2, 11704, 2, 11706, 2, 11712, 2, 11714, 2, 11720, 2, 11722, 2, 11728, 2, 11730, 2, 11736, 2, 11738, 2, 11744, 2, 12295, 2, 12297, 2, 12323, 2, 12331, 2, 12339, 2, 12343, 2, 12346, 2, 12350, 2, 12355, 2, 12440, 2, 12445, 2, 12449, 2, 12451, 2, 12540, 2, 12542, 2, 12545, 2, 12551, 2, 12591, 2, 12595, 2, 12688, 2, 12706, 2, 12732, 2, 12786, 2, 12801, 2, 13314, 2, 19895, 2, 19970, 2, 40919, 2, 40962, 2, 42126, 2, 42194, 2, 42239, 2, 42242, 2, 42510, 2, 42514, 2, 42529, 2, 42540, 2, 42541, 2, 42562, 2, 42608, 2, 42625, 2, 42655, 2, 42658, 2, 42737, 2, 42777, 2, 42785, 2, 42788, 2, 42890, 2, 42893, 2, 42928, 2, 42930, 2, 42937, 2, 43001, 2, 43011, 2, 43013, 2, 43015, 2, 43017, 2, 43020, 2, 43022, 2, 43044, 2, 43074, 2, 43125, 2, 43140, 2, 43189, 2, 43252, 2, 43257, 2, 43261, 2, 43261, 2, 43263, 2, 43263, 2, 43276, 2, 43303, 2, 43314, 2, 43336, 2, 43362, 2, 43390, 2, 43398, 2, 43444, 2, 43473, 2, 43473, 2, 43490, 2, 43494, 2, 43496, 2, 43505, 2, 43516, 2, 43520, 2, 43522, 2, 43562, 2, 43586, 2, 43588, 2, 43590, 2, 43597, 2, 43618, 2, 43640, 2, 43644, 2, 43644, 2, 43648, 2, 43697, 2, 43699, 2, 43699, 2, 43703, 2, 43704, 2, 43707, 2, 43711, 2, 43714, 2, 43714, 2, 43716, 2, 43716, 2, 43741, 2, 43743, 2, 43746, 2, 43756, 2, 43764, 2, 43766, 2, 43779, 2, 43784, 2, 43787, 2, 43792, 2, 43795, 2, 43800, 2, 43810, 2, 43816, 2, 43818, 2, 43824, 2, 43826, 2, 43868, 2, 43870, 2, 43879, 2, 43890, 2, 44004, 2, 44034, 2, 55205, 2, 55218, 2, 55240, 2, 55245, 2, 55293, 2, 63746, 2, 64111, 2, 64114, 2, 64219, 2, 64258, 2, 64264, 2, 64277, 2, 64281, 2, 64287, 2, 64287, 2, 64289, 2, 64298, 2, 64300, 2, 64312, 2, 64314, 2, 64318, 2, 64320, 2, 64320, 2, 64322, 2, 64323, 2, 64325, 2, 64326, 2, 64328, 2, 64435, 2, 64469, 2, 64831, 2, 64850, 2, 64913, 2, 64916, 2, 64969, 2, 65010, 2, 65021, 2, 65138, 2, 65142, 2, 65144, 2, 65278, 2, 65315, 2, 65340, 2, 65347, 2, 65372, 2, 65384, 2, 65472, 2, 65476, 2, 65481, 2, 65484, 2, 65489, 2, 65492, 2, 65497, 2, 65500, 2, 65502, 2, 2, 3, 13, 3, 15, 3, 40, 3, 42, 3, 60, 3, 62, 3, 63, 3, 65, 3, 79, 3, 82, 3, 95, 3, 130, 3, 252, 3, 322, 3, 374, 3, 642, 3, 670, 3, 674, 3, 722, 3, 770, 3, 801, 3, 818, 3, 844, 3, 850, 3, 887, 3, 898, 3, 927, 3, 930, 3, 965, 3, 970, 3, 977, 3, 979, 3, 983, 3, 1026, 3, 1183, 3, 1202, 3, 1237, 3, 1242, 3, 1277, 3, 1282, 3, 1321, 3, 1330, 3, 1381, 3, 1538, 3, 1848, 3, 1858, 3, 1879, 3, 1890, 3, 1897, 3, 2050, 3, 2055, 3, 2058, 3, 2058, 3, 2060, 3, 2103, 3, 2105, 3, 2106, 3, 2110, 3, 2110, 3, 2113, 3, 2135, 3, 2146, 3, 2168, 3, 2178, 3, 2208, 3, 2274, 3, 2292, 3, 2294, 3, 2295, 3, 2306, 3, 2327, 3, 2338, 3, 2363, 3, 2434, 3, 2489, 3, 2496, 3, 2497, 3, 2562, 3, 2562, 3, 2578, 3, 2581, 3, 2583, 3, 2585, 3, 2587, 3, 2613, 3, 2658, 3, 2686, 3, 2690, 3, 2718, 3, 2754, 3, 2761, 3, 2763, 3, 2790, 3, 2818, 3, 2871, 3, 2882, 3, 2903, 3, 2914, 3, 2932, 3, 2946, 3, 2963, 3, 3074, 3, 3146, 3, 3202, 3, 3252, 3, 3266, 3, 3316, 3, 4101, 3, 4153, 3, 4229, 3, 4273, 3, 4306, 3, 4330, 3, 4357, 3, 4392, 3, 4434, 3, 4468, 3, 4472, 3, 4472, 3, 4485, 3, 4532, 3, 4547, 3, 4550, 3, 4572, 3, 4572, 3, 4574, 3, 4574, 3, 4610, 3, 4627, 3, 4629, 3, 4653, 3, 4738, 3, 4744, 3, 4746, 3, 4746, 3, 4748, 3, 4751, 3, 4753, 3, 4767, 3, 4769, 3, 4778, 3, 4786, 3, 4832, 3, 4871, 3, 4878, 3, 4881, 3, 4882, 3, 4885, 3, 4906, 3, 4908, 3, 4914, 3, 4916, 3, 4917, 3, 4919, 3, 4923, 3, 4927, 3, 4927, 3, 4946, 3, 4946, 3, 4959, 3, 4963, 3, 5122, 3, 5174, 3, 5193, 3, 5196, 3, 5250, 3, 5297, 3, 5318, 3, 5319, 3, 5321, 3, 5321, 3, 5506, 3, 5552, 3, 5594, 3, 5597, 3, 5634, 3, 5681, 3, 5702, 3, 5702, 3, 5762, 3, 5804, 3, 5890, 3, 5915, 3, 6306, 3, 6369, 3, 6401, 3, 6401, 3, 6850, 3, 6906, 3, 7170, 3, 7178, 3, 7180, 3, 7216, 3, 7234, 3, 7234, 3, 7284, 3, 7313, 3, 8194, 3, 9115, 3, 9218, 3, 9328, 3, 9346, 3, 9541, 3, 12290, 3, 13360, 3, 17410, 3, 17992, 3, 26626, 3, 27194, 3, 27202, 3, 27232, 3, 27346, 3, 27375, 3, 27394, 3, 27441, 3, 27458, 3, 27461, 3, 27493, 3, 27513, 3, 27519, 3, 27537, 3, 28418, 3, 28486, 3, 28498, 3, 28498, 3, 28565, 3, 28577, 3, 28642, 3, 28642, 3, 28674, 3, 34798, 3, 34818, 3, 35572, 3, 45058, 3, 45059, 3, 48130, 3, 48236, 3, 48242, 3, 48254, 3, 48258, 3, 48266, 3, 48274, 3, 48283, 3, 54274, 3, 54358, 3, 54360, 3, 54430, 3, 54432, 3, 54433, 3, 54436, 3, 54436, 3, 54439, 3, 54440, 3, 54443, 3, 54446, 3, 54448, 3, 54459, 3, 54461, 3, 54461, 3, 54463, 3, 54469, 3, 54471, 3, 54535, 3, 54537, 3, 54540, 3, 54543, 3, 54550, 3, 54552, 3, 54558, 3, 54560, 3, 54587, 3, 54589, 3, 54592, 3, 54594, 3, 54598, 3, 54600, 3, 54600, 3, 54604, 3, 54610, 3, 54612, 3, 54951, 3, 54954, 3, 54978, 3, 54980, 3, 55004, 3, 55006, 3, 55036, 3, 55038, 3, 55062, 3, 55064, 3, 55094, 3, 55096, 3, 55120, 3, 55122, 3, 55152, 3, 55154, 3, 55178, 3, 55180, 3, 55210, 3, 55212, 3, 55236, 3, 55238, 3, 55245, 3, 59394, 3, 59590, 3, 59650, 3, 59717, 3, 60930, 3, 60933, 3, 60935, 3, 60961, 3, 60963, 3, 60964, 3, 60966, 3, 60966, 3, 60969, 3, 60969, 3, 60971, 3, 60980, 3, 60982, 3, 60985, 3, 60987, 3, 60987, 3, 60989, 3, 60989, 3, 60996, 3, 60996, 3, 61001, 3, 61001, 3, 61003, 3, 61003, 3, 61005, 3, 61005, 3, 61007, 3, 61009, 3, 61011, 3, 61012, 3, 61014, 3, 61014, 3, 61017, 3, 61017, 3, 61019, 3, 61019, 3, 61021, 3, 61021, 3, 61023, 3, 61023, 3, 61025, 3, 61025, 3, 61027, 3, 61028, 3, 61030, 3, 61030, 3, 61033, 3, 61036, 3, 61038, 3, 61044, 3, 61046, 3, 61049, 3, 61051, 3, 61054, 3, 61056, 3, 61056, 3, 61058, 3, 61067, 3, 61069, 3, 61085, 3, 61091, 3, 61093, 3, 61095, 3, 61099, 3, 61101, 3, 61117, 3, 2, 4, 42712, 4, 42754, 4, 46902, 4, 46914, 4, 47135, 4, 47138, 4, 52899, 4, 63490, 4, 64031, 4, 679, 2, 38, 2, 38, 2, 50, 2, 59, 2, 67, 2, 92, 2, 97, 2, 97, 2, 99, 2, 124, 2, 172, 2, 172, 2, 183, 2, 183, 2, 185, 2, 185, 2, 188, 2, 188, 2, 194, 2, 216, 2, 218, 2, 248, 2, 250, 2, 707, 2, 712, 2, 723, 2, 738, 2, 742, 2, 750, 2, 750, 2, 752, 2, 752, 2, 770, 2, 886, 2, 888, 2, 889, 2, 892, 2, 895, 2, 897, 2, 897, 2, 904, 2, 908, 2, 910, 2, 910, 2, 912, 2, 931, 2, 933, 2, 1015, 2, 1017, 2, 1155, 2, 1157, 2, 1161, 2, 1164, 2, 1329, 2, 1331, 2, 1368, 2, 1371, 2, 1371, 2, 1379, 2, 1417, 2, 1427, 2, 1471, 2, 1473, 2, 1473, 2, 1475, 2, 1476, 2, 1478, 2, 1479, 2, 1481, 2, 1481, 2, 1490, 2, 1516, 2, 1522, 2, 1524, 2, 1554, 2, 1564, 2, 1570, 2, 1643, 2, 1648, 2, 1749, 2, 1751, 2, 1758, 2, 1761, 2, 1770, 2, 1772, 2, 1790, 2, 1793, 2, 1793, 2, 1810, 2, 1868, 2, 1871, 2, 1971, 2, 1986, 2, 2039, 2, 2044, 2, 2044, 2, 2050, 2, 2095, 2, 2114, 2, 2141, 2, 2210, 2, 2230, 2, 2232, 2, 2239, 2, 2262, 2, 2275, 2, 2277, 2, 2405, 2, 2408, 2, 2417, 2, 2419, 2, 2437, 2, 2439, 2, 2446, 2, 2449, 2, 2450, 2, 2453, 2, 2474, 2, 2476, 2, 2482, 2, 2484, 2, 2484, 2, 2488, 2, 2491, 2, 2494, 2, 2502, 2, 2505, 2, 2506, 2, 2509, 2, 2512, 2, 2521, 2, 2521, 2, 2526, 2, 2527, 2, 2529, 2, 2533, 2, 2536, 2, 2547, 2, 2563, 2, 2565, 2, 2567, 2, 2572, 2, 2577, 2, 2578, 2, 2581, 2, 2602, 2, 2604, 2, 2610, 2, 2612, 2, 2613, 2, 2615, 2, 2616, 2, 2618, 2, 2619, 2, 2622, 2, 2622, 2, 2624, 2, 2628, 2, 2633, 2, 2634, 2, 2637, 2, 2639, 2, 2643, 2, 2643, 2, 2651, 2, 2654, 2, 2656, 2, 2656, 2, 2664, 2, 2679, 2, 2691, 2, 2693, 2, 2695, 2, 2703, 2, 2705, 2, 2707, 2, 2709, 2, 2730, 2, 2732, 2, 2738, 2, 2740, 2, 2741, 2, 2743, 2, 2747, 2, 2750, 2, 2759, 2, 2761, 2, 2763, 2, 2765, 2, 2767, 2, 2770, 2, 2770, 2, 2786, 2, 2789, 2, 2792, 2, 2801, 2, 2811, 2, 2811, 2, 2819, 2, 2821, 2, 2823, 2, 2830, 2, 2833, 2, 2834, 2, 2837, 2, 2858, 2, 2860, 2, 2866, 2, 2868, 2, 2869, 2, 2871, 2, 2875, 2, 2878, 2, 2886, 2, 2889, 2, 2890, 2, 2893, 2, 2895, 2, 2904, 2, 2905, 2, 2910, 2, 2911, 2, 2913, 2, 2917, 2, 2920, 2, 2929, 2, 2931, 2, 2931, 2, 2948, 2, 2949, 2, 2951, 2, 2956, 2, 2960, 2, 2962, 2, 2964, 2, 2967, 2, 2971, 2, 2972, 2, 2974, 2, 2974, 2, 2976, 2, 2977, 2, 2981, 2, 2982, 2, 2986, 2, 2988, 2, 2992, 2, 3003, 2, 3008, 2, 3012, 2, 3016, 2, 3018, 2, 3020, 2, 3023, 2, 3026, 2, 3026, 2, 3033, 2, 3033, 2, 3048, 2, 3057, 2, 3074, 2, 3077, 2, 3079, 2, 3086, 2, 3088, 2, 3090, 2, 3092, 2, 3114, 2, 3116, 2, 3131, 2, 3135, 2, 3142, 2, 3144, 2, 3146, 2, 3148, 2, 3151, 2, 3159, 2, 3160, 2, 3162, 2, 3164, 2, 3170, 2, 3173, 2, 3176, 2, 3185, 2, 3202, 2, 3205, 2, 3207, 2, 3214, 2, 3216, 2, 3218, 2, 3220, 2, 3242, 2, 3244, 2, 3253, 2, 3255, 2, 3259, 2, 3262, 2, 3270, 2, 3272, 2, 3274, 2, 3276, 2, 3279, 2, 3287, 2, 3288, 2, 3296, 2, 3296, 2, 3298, 2, 3301, 2, 3304, 2, 3313, 2, 3315, 2, 3316, 2, 3331, 2, 3333, 2, 3335, 2, 3342, 2, 3344, 2, 3346, 2, 3348, 2, 3388, 2, 3391, 2, 3398, 2, 3400, 2, 3402, 2, 3404, 2, 3408, 2, 3414, 2, 3417, 2, 3425, 2, 3429, 2, 3432, 2, 3441, 2, 3452, 2, 3457, 2, 3460, 2, 3461, 2, 3463, 2, 3480, 2, 3484, 2, 3507, 2, 3509, 2, 3517, 2, 3519, 2, 3519, 2, 3522, 2, 3528, 2, 3532, 2, 3532, 2, 3537, 2, 3542, 2, 3544, 2, 3544, 2, 3546, 2, 3553, 2, 3560, 2, 3569, 2, 3572, 2, 3573, 2, 3587, 2, 3644, 2, 3650, 2, 3664, 2, 3666, 2, 3675, 2, 3715, 2, 3716, 2, 3718, 2, 3718, 2, 3721, 2, 3722, 2, 3724, 2, 3724, 2, 3727, 2, 3727, 2, 3734, 2, 3737, 2, 3739, 2, 3745, 2, 3747, 2, 3749, 2, 3751, 2, 3751, 2, 3753, 2, 3753, 2, 3756, 2, 3757, 2, 3759, 2, 3771, 2, 3773, 2, 3775, 2, 3778, 2, 3782, 2, 3784, 2, 3784, 2, 3786, 2, 3791, 2, 3794, 2, 3803, 2, 3806, 2, 3809, 2, 3842, 2, 3842, 2, 3866, 2, 3867, 2, 3874, 2, 3883, 2, 3895, 2, 3895, 2, 3897, 2, 3897, 2, 3899, 2, 3899, 2, 3904, 2, 3913, 2, 3915, 2, 3950, 2, 3955, 2, 3974, 2, 3976, 2, 3993, 2, 3995, 2, 4030, 2, 4040, 2, 4040, 2, 4098, 2, 4171, 2, 4178, 2, 4255, 2, 4258, 2, 4295, 2, 4297, 2, 4297, 2, 4303, 2, 4303, 2, 4306, 2, 4348, 2, 4350, 2, 4682, 2, 4684, 2, 4687, 2, 4690, 2, 4696, 2, 4698, 2, 4698, 2, 4700, 2, 4703, 2, 4706, 2, 4746, 2, 4748, 2, 4751, 2, 4754, 2, 4786, 2, 4788, 2, 4791, 2, 4794, 2, 4800, 2, 4802, 2, 4802, 2, 4804, 2, 4807, 2, 4810, 2, 4824, 2, 4826, 2, 4882, 2, 4884, 2, 4887, 2, 4890, 2, 4956, 2, 4959, 2, 4961, 2, 4971, 2, 4979, 2, 4994, 2, 5009, 2, 5026, 2, 5111, 2, 5114, 2, 5119, 2, 5123, 2, 5742, 2, 5745, 2, 5761, 2, 5763, 2, 5788, 2, 5794, 2, 5868, 2, 5872, 2, 5882, 2, 5890, 2, 5902, 2, 5904, 2, 5910, 2, 5922, 2, 5942, 2, 5954, 2, 5973, 2, 5986, 2, 5998, 2, 6000, 2, 6002, 2, 6004, 2, 6005, 2, 6018, 2, 6101, 2, 6105, 2, 6105, 2, 6110, 2, 6111, 2, 6114, 2, 6123, 2, 6157, 2, 6159, 2, 6162, 2, 6171, 2, 6178, 2, 6265, 2, 6274, 2, 6316, 2, 6322, 2, 6391, 2, 6402, 2, 6432, 2, 6434, 2, 6445, 2, 6450, 2, 6461, 2, 6472, 2, 6511, 2, 6514, 2, 6518, 2, 6530, 2, 6573, 2, 6578, 2, 6603, 2, 6610, 2, 6620, 2, 6658, 2, 6685, 2, 6690, 2, 6752, 2, 6754, 2, 6782, 2, 6785, 2, 6795, 2, 6802, 2, 6811, 2, 6825, 2, 6825, 2, 6834, 2, 6847, 2, 6914, 2, 6989, 2, 6994, 2, 7003, 2, 7021, 2, 7029, 2, 7042, 2, 7157, 2, 7170, 2, 7225, 2, 7234, 2, 7243, 2, 7247, 2, 7295, 2, 7298, 2, 7306, 2, 7378, 2, 7380, 2, 7382, 2, 7416, 2, 7418, 2, 7419, 2, 7426, 2, 7671, 2, 7677, 2, 7959, 2, 7962, 2, 7967, 2, 7970, 2, 8007, 2, 8010, 2, 8015, 2, 8018, 2, 8025, 2, 8027, 2, 8027, 2, 8029, 2, 8029, 2, 8031, 2, 8031, 2, 8033, 2, 8063, 2, 8066, 2, 8118, 2, 8120, 2, 8126, 2, 8128, 2, 8128, 2, 8132, 2, 8134, 2, 8136, 2, 8142, 2, 8146, 2, 8149, 2, 8152, 2, 8157, 2, 8162, 2, 8174, 2, 8180, 2, 8182, 2, 8184, 2, 8190, 2, 8257, 2, 8258, 2, 8278, 2, 8278, 2, 8307, 2, 8307, 2, 8321, 2, 8321, 2, 8338, 2, 8350, 2, 8402, 2, 8414, 2, 8419, 2, 8419, 2, 8423, 2, 8434, 2, 8452, 2, 8452, 2, 8457, 2, 8457, 2, 8460, 2, 8469, 2, 8471, 2, 8471, 2, 8474, 2, 8479, 2, 8486, 2, 8486, 2, 8488, 2, 8488, 2, 8490, 2, 8490, 2, 8492, 2, 8507, 2, 8510, 2, 8513, 2, 8519, 2, 8523, 2, 8528, 2, 8528, 2, 8546, 2, 8586, 2, 11266, 2, 11312, 2, 11314, 2, 11360, 2, 11362, 2, 11494, 2, 11501, 2, 11509, 2, 11522, 2, 11559, 2, 11561, 2, 11561, 2, 11567, 2, 11567, 2, 11570, 2, 11625, 2, 11633, 2, 11633, 2, 11649, 2, 11672, 2, 11682, 2, 11688, 2, 11690, 2, 11696, 2, 11698, 2, 11704, 2, 11706, 2, 11712, 2, 11714, 2, 11720, 2, 11722, 2, 11728, 2, 11730, 2, 11736, 2, 11738, 2, 11744, 2, 11746, 2, 11777, 2, 12295, 2, 12297, 2, 12323, 2, 12337, 2, 12339, 2, 12343, 2, 12346, 2, 12350, 2, 12355, 2, 12440, 2, 12443, 2, 12449, 2, 12451, 2, 12540, 2, 12542, 2, 12545, 2, 12551, 2, 12591, 2, 12595, 2, 12688, 2, 12706, 2, 12732, 2, 12786, 2, 12801, 2, 13314, 2, 19895, 2, 19970, 2, 40919, 2, 40962, 2, 42126, 2, 42194, 2, 42239, 2, 42242, 2, 42510, 2, 42514, 2, 42541, 2, 42562, 2, 42609, 2, 42614, 2, 42623, 2, 42625, 2, 42739, 2, 42777, 2, 42785, 2, 42788, 2, 42890, 2, 42893, 2, 42928, 2, 42930, 2, 42937, 2, 43001, 2, 43049, 2, 43074, 2, 43125, 2, 43138, 2, 43207, 2, 43218, 2, 43227, 2, 43234, 2, 43257, 2, 43261, 2, 43261, 2, 43263, 2, 43263, 2, 43266, 2, 43311, 2, 43314, 2, 43349, 2, 43362, 2, 43390, 2, 43394, 2, 43458, 2, 43473, 2, 43483, 2, 43490, 2, 43520, 2, 43522, 2, 43576, 2, 43586, 2, 43599, 2, 43602, 2, 43611, 2, 43618, 2, 43640, 2, 43644, 2, 43716, 2, 43741, 2, 43743, 2, 43746, 2, 43761, 2, 43764, 2, 43768, 2, 43779, 2, 43784, 2, 43787, 2, 43792, 2, 43795, 2, 43800, 2, 43810, 2, 43816, 2, 43818, 2, 43824, 2, 43826, 2, 43868, 2, 43870, 2, 43879, 2, 43890, 2, 44012, 2, 44014, 2, 44015, 2, 44018, 2, 44027, 2, 44034, 2, 55205, 2, 55218, 2, 55240, 2, 55245, 2, 55293, 2, 63746, 2, 64111, 2, 64114, 2, 64219, 2, 64258, 2, 64264, 2, 64277, 2, 64281, 2, 64287, 2, 64298, 2, 64300, 2, 64312, 2, 64314, 2, 64318, 2, 64320, 2, 64320, 2, 64322, 2, 64323, 2, 64325, 2, 64326, 2, 64328, 2, 64435, 2, 64469, 2, 64831, 2, 64850, 2, 64913, 2, 64916, 2, 64969, 2, 65010, 2, 65021, 2, 65026, 2, 65041, 2, 65058, 2, 65073, 2, 65077, 2, 65078, 2, 65103, 2, 65105, 2, 65138, 2, 65142, 2, 65144, 2, 65278, 2, 65298, 2, 65307, 2, 65315, 2, 65340, 2, 65345, 2, 65345, 2, 65347, 2, 65372, 2, 65384, 2, 65472, 2, 65476, 2, 65481, 2, 65484, 2, 65489, 2, 65492, 2, 65497, 2, 65500, 2, 65502, 2, 2, 3, 13, 3, 15, 3, 40, 3, 42, 3, 60, 3, 62, 3, 63, 3, 65, 3, 79, 3, 82, 3, 95, 3, 130, 3, 252, 3, 322, 3, 374, 3, 511, 3, 511, 3, 642, 3, 670, 3, 674, 3, 722, 3, 738, 3, 738, 3, 770, 3, 801, 3, 818, 3, 844, 3, 850, 3, 892, 3, 898, 3, 927, 3, 930, 3, 965, 3, 970, 3, 977, 3, 979, 3, 983, 3, 1026, 3, 1183, 3, 1186, 3, 1195, 3, 1202, 3, 1237, 3, 1242, 3, 1277, 3, 1282, 3, 1321, 3, 1330, 3, 1381, 3, 1538, 3, 1848, 3, 1858, 3, 1879, 3, 1890, 3, 1897, 3, 2050, 3, 2055, 3, 2058, 3, 2058, 3, 2060, 3, 2103, 3, 2105, 3, 2106, 3, 2110, 3, 2110, 3, 2113, 3, 2135, 3, 2146, 3, 2168, 3, 2178, 3, 2208, 3, 2274, 3, 2292, 3, 2294, 3, 2295, 3, 2306, 3, 2327, 3, 2338, 3, 2363, 3, 2434, 3, 2489, 3, 2496, 3, 2497, 3, 2562, 3, 2565, 3, 2567, 3, 2568, 3, 2574, 3, 2581, 3, 2583, 3, 2585, 3, 2587, 3, 2613, 3, 2618, 3, 2620, 3, 2625, 3, 2625, 3, 2658, 3, 2686, 3, 2690, 3, 2718, 3, 2754, 3, 2761, 3, 2763, 3, 2792, 3, 2818, 3, 2871, 3, 2882, 3, 2903, 3, 2914, 3, 2932, 3, 2946, 3, 2963, 3, 3074, 3, 3146, 3, 3202, 3, 3252, 3, 3266, 3, 3316, 3, 4098, 3, 4168, 3, 4200, 3, 4209, 3, 4225, 3, 4284, 3, 4306, 3, 4330, 3, 4338, 3, 4347, 3, 4354, 3, 4406, 3, 4408, 3, 4417, 3, 4434, 3, 4469, 3, 4472, 3, 4472, 3, 4482, 3, 4550, 3, 4556, 3, 4558, 3, 4562, 3, 4572, 3, 4574, 3, 4574, 3, 4610, 3, 4627, 3, 4629, 3, 4665, 3, 4672, 3, 4672, 3, 4738, 3, 4744, 3, 4746, 3, 4746, 3, 4748, 3, 4751, 3, 4753, 3, 4767, 3, 4769, 3, 4778, 3, 4786, 3, 4844, 3, 4850, 3, 4859, 3, 4866, 3, 4869, 3, 4871, 3, 4878, 3, 4881, 3, 4882, 3, 4885, 3, 4906, 3, 4908, 3, 4914, 3, 4916, 3, 4917, 3, 4919, 3, 4923, 3, 4926, 3, 4934, 3, 4937, 3, 4938, 3, 4941, 3, 4943, 3, 4946, 3, 4946, 3, 4953, 3, 4953, 3, 4959, 3, 4965, 3, 4968, 3, 4974, 3, 4978, 3, 4982, 3, 5122, 3, 5196, 3, 5202, 3, 5211, 3, 5250, 3, 5319, 3, 5321, 3, 5321, 3, 5330, 3, 5339, 3, 5506, 3, 5559, 3, 5562, 3, 5570, 3, 5594, 3, 5599, 3, 5634, 3, 5698, 3, 5702, 3, 5702, 3, 5714, 3, 5723, 3, 5762, 3, 5817, 3, 5826, 3, 5835, 3, 5890, 3, 5915, 3, 5919, 3, 5933, 3, 5938, 3, 5947, 3, 6306, 3, 6379, 3, 6401, 3, 6401, 3, 6850, 3, 6906, 3, 7170, 3, 7178, 3, 7180, 3, 7224, 3, 7226, 3, 7234, 3, 7250, 3, 7259, 3, 7284, 3, 7313, 3, 7316, 3, 7337, 3, 7339, 3, 7352, 3, 8194, 3, 9115, 3, 9218, 3, 9328, 3, 9346, 3, 9541, 3, 12290, 3, 13360, 3, 17410, 3, 17992, 3, 26626, 3, 27194, 3, 27202, 3, 27232, 3, 27234, 3, 27243, 3, 27346, 3, 27375, 3, 27378, 3, 27382, 3, 27394, 3, 27448, 3, 27458, 3, 27461, 3, 27474, 3, 27483, 3, 27493, 3, 27513, 3, 27519, 3, 27537, 3, 28418, 3, 28486, 3, 28498, 3, 28544, 3, 28561, 3, 28577, 3, 28642, 3, 28642, 3, 28674, 3, 34798, 3, 34818, 3, 35572, 3, 45058, 3, 45059, 3, 48130, 3, 48236, 3, 48242, 3, 48254, 3, 48258, 3, 48266, 3, 48274, 3, 48283, 3, 48287, 3, 48288, 3, 53607, 3, 53611, 3, 53615, 3, 53620, 3, 53629, 3, 53636, 3, 53639, 3, 53645, 3, 53676, 3, 53679, 3, 53828, 3, 53830, 3, 54274, 3, 54358, 3, 54360, 3, 54430, 3, 54432, 3, 54433, 3, 54436, 3, 54436, 3, 54439, 3, 54440, 3, 54443, 3, 54446, 3, 54448, 3, 54459, 3, 54461, 3, 54461, 3, 54463, 3, 54469, 3, 54471, 3, 54535, 3, 54537, 3, 54540, 3, 54543, 3, 54550, 3, 54552, 3, 54558, 3, 54560, 3, 54587, 3, 54589, 3, 54592, 3, 54594, 3, 54598, 3, 54600, 3, 54600, 3, 54604, 3, 54610, 3, 54612, 3, 54951, 3, 54954, 3, 54978, 3, 54980, 3, 55004, 3, 55006, 3, 55036, 3, 55038, 3, 55062, 3, 55064, 3, 55094, 3, 55096, 3, 55120, 3, 55122, 3, 55152, 3, 55154, 3, 55178, 3, 55180, 3, 55210, 3, 55212, 3, 55236, 3, 55238, 3, 55245, 3, 55248, 3, 55297, 3, 55810, 3, 55864, 3, 55869, 3, 55918, 3, 55927, 3, 55927, 3, 55942, 3, 55942, 3, 55965, 3, 55969, 3, 55971, 3, 55985, 3, 57346, 3, 57352, 3, 57354, 3, 57370, 3, 57373, 3, 57379, 3, 57381, 3, 57382, 3, 57384, 3, 57388, 3, 59394, 3, 59590, 3, 59602, 3, 59608, 3, 59650, 3, 59724, 3, 59730, 3, 59739, 3, 60930, 3, 60933, 3, 60935, 3, 60961, 3, 60963, 3, 60964, 3, 60966, 3, 60966, 3, 60969, 3, 60969, 3, 60971, 3, 60980, 3, 60982, 3, 60985, 3, 60987, 3, 60987, 3, 60989, 3, 60989, 3, 60996, 3, 60996, 3, 61001, 3, 61001, 3, 61003, 3, 61003, 3, 61005, 3, 61005, 3, 61007, 3, 61009, 3, 61011, 3, 61012, 3, 61014, 3, 61014, 3, 61017, 3, 61017, 3, 61019, 3, 61019, 3, 61021, 3, 61021, 3, 61023, 3, 61023, 3, 61025, 3, 61025, 3, 61027, 3, 61028, 3, 61030, 3, 61030, 3, 61033, 3, 61036, 3, 61038, 3, 61044, 3, 61046, 3, 61049, 3, 61051, 3, 61054, 3, 61056, 3, 61056, 3, 61058, 3, 61067, 3, 61069, 3, 61085, 3, 61091, 3, 61093, 3, 61095, 3, 61099, 3, 61101, 3, 61117, 3, 2, 4, 42712, 4, 42754, 4, 46902, 4, 46914, 4, 47135, 4, 47138, 4, 52899, 4, 63490, 4, 64031, 4, 258, 16, 497, 16, 192, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 21, 3, 2, 2, 2, 2, 23, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 3, 45, 3, 2, 2, 2, 5, 50, 3, 2, 2, 2, 7, 56, 3, 2, 2, 2, 9, 61, 3, 2, 2, 2, 11, 71, 3, 2, 2, 2, 13, 73, 3, 2, 2, 2, 15, 75, 3, 2, 2, 2, 17, 77, 3, 2, 2, 2, 19, 79, 3, 2, 2, 2, 21, 81, 3, 2, 2, 2, 23, 91, 3, 2, 2, 2, 25, 98, 3, 2, 2, 2, 27, 106, 3, 2, 2, 2, 29, 110, 3, 2, 2, 2, 31, 132, 3, 2, 2, 2, 33, 134, 3, 2, 2, 2, 35, 141, 3, 2, 2, 2, 37, 147, 3, 2, 2, 2, 39, 154, 3, 2, 2, 2, 41, 165, 3, 2, 2, 2, 43, 179, 3, 2, 2, 2, 45, 46, 7, 118, 2, 2, 46, 47, 7, 116, 2, 2, 47, 48, 7, 119, 2, 2, 48, 49, 7, 103, 2, 2, 49, 4, 3, 2, 2, 2, 50, 51, 7, 104, 2, 2, 51, 52, 7, 99, 2, 2, 52, 53, 7, 110, 2, 2, 53, 54, 7, 117, 2, 2, 54, 55, 7, 103, 2, 2, 55, 6, 3, 2, 2, 2, 56, 57, 7, 112, 2, 2, 57, 58, 7, 119, 2, 2, 58, 59, 7, 110, 2, 2, 59, 60, 7, 110, 2, 2, 60, 8, 3, 2, 2, 2, 61, 62, 7, 119, 2, 2, 62, 63, 7, 112, 2, 2, 63, 64, 7, 102, 2, 2, 64, 65, 7, 103, 2, 2, 65, 66, 7, 104, 2, 2, 66, 67, 7, 107, 2, 2, 67, 68, 7, 112, 2, 2, 68, 69, 7, 103, 2, 2, 69, 70, 7, 102, 2, 2, 70, 10, 3, 2, 2, 2, 71, 72, 7, 46, 2, 2, 72, 12, 3, 2, 2, 2, 73, 74, 7, 93, 2, 2, 74, 14, 3, 2, 2, 2, 75, 76, 7, 95, 2, 2, 76, 16, 3, 2, 2, 2, 77, 78, 7, 127, 2, 2, 78, 18, 3, 2, 2, 2, 79, 80, 7, 125, 2, 2, 80, 20, 3, 2, 2, 2, 81, 82, 7, 60, 2, 2, 82, 22, 3, 2, 2, 2, 83, 84, 7, 36, 2, 2, 84, 85, 5, 25, 13, 2, 85, 86, 7, 36, 2, 2, 86, 92, 3, 2, 2, 2, 87, 88, 7, 41, 2, 2, 88, 89, 5, 27, 14, 2, 89, 90, 7, 41, 2, 2, 90, 92, 3, 2, 2, 2, 91, 83, 3, 2, 2, 2, 91, 87, 3, 2, 2, 2, 92, 24, 3, 2, 2, 2, 93, 94, 7, 94, 2, 2, 94, 97, 7, 36, 2, 2, 95, 97, 10, 2, 2, 2, 96, 93, 3, 2, 2, 2, 96, 95, 3, 2, 2, 2, 97, 100, 3, 2, 2, 2, 98, 96, 3, 2, 2, 2, 98, 99, 3, 2, 2, 2, 99, 26, 3, 2, 2, 2, 100, 98, 3, 2, 2, 2, 101, 102, 7, 94, 2, 2, 102, 105, 7, 41, 2, 2, 103, 105, 10, 3, 2, 2, 104, 101, 3, 2, 2, 2, 104, 103, 3, 2, 2, 2, 105, 108, 3, 2, 2, 2, 106, 104, 3, 2, 2, 2, 106, 107, 3, 2, 2, 2, 107, 28, 3, 2, 2, 2, 108, 106, 3, 2, 2, 2, 109, 111, 7, 47, 2, 2, 110, 109, 3, 2, 2, 2, 110, 111, 3, 2, 2, 2, 111, 112, 3, 2, 2, 2, 112, 119, 5, 31, 16, 2, 113, 115, 7, 48, 2, 2, 114, 116, 9, 4, 2, 2, 115, 114, 3, 2, 2, 2, 116, 117, 3, 2, 2, 2, 117, 115, 3, 2, 2, 2, 117, 118, 3, 2, 2, 2, 118, 120, 3, 2, 2, 2, 119, 113, 3, 2, 2, 2, 119, 120, 3, 2, 2, 2, 120, 122, 3, 2, 2, 2, 121, 123, 5, 33, 17, 2, 122, 121, 3, 2, 2, 2, 122, 123, 3, 2, 2, 2, 123, 30, 3, 2, 2, 2, 124, 133, 7, 50, 2, 2, 125, 129, 9, 5, 2, 2, 126, 128, 9, 4, 2, 2, 127, 126, 3, 2, 2, 2, 128, 131, 3, 2, 2, 2, 129, 127, 3, 2, 2, 2, 129, 130, 3, 2, 2, 2, 130, 133, 3, 2, 2, 2, 131, 129, 3, 2, 2, 2, 132, 124, 3, 2, 2, 2, 132, 125, 3, 2, 2, 2, 133, 32, 3, 2, 2, 2, 134, 136, 9, 6, 2, 2, 135, 137, 9, 7, 2, 2, 136, 135, 3, 2, 2, 2, 136, 137, 3, 2, 2, 2, 137, 138, 3, 2, 2, 2, 138, 139, 5, 31, 16, 2, 139, 34, 3, 2, 2, 2, 140, 142, 9, 8, 2, 2, 141, 140, 3, 2, 2, 2, 142, 143, 3, 2, 2, 2, 143, 141, 3, 2, 2, 2, 143, 144, 3, 2, 2, 2, 144, 145, 3, 2, 2, 2, 145, 146, 8, 18, 2, 2, 146, 36, 3, 2, 2, 2, 147, 151, 9, 10, 2, 2, 148, 150, 9, 11, 2, 2, 149, 148, 3, 2, 2, 2, 150, 153, 3, 2, 2, 2, 151, 149, 3, 2, 2, 2, 151, 152, 3, 2, 2, 2, 152, 38, 3, 2, 2, 2, 153, 151, 3, 2, 2, 2, 154, 155, 7, 49, 2, 2, 155, 156, 7, 49, 2, 2, 156, 160, 3, 2, 2, 2, 157, 159, 10, 9, 2, 2, 158, 157, 3, 2, 2, 2, 159, 162, 3, 2, 2, 2, 160, 158, 3, 2, 2, 2, 160, 161, 3, 2, 2, 2, 161, 163, 3, 2, 2, 2, 162, 160, 3, 2, 2, 2, 163, 164, 8, 20, 3, 2, 164, 40, 3, 2, 2, 2, 165, 166, 7, 49, 2, 2, 166, 167, 7, 44, 2, 2, 167, 171, 3, 2, 2, 2, 168, 170, 11, 2, 2, 2, 169, 168, 3, 2, 2, 2, 170, 173, 3, 2, 2, 2, 171, 172, 3, 2, 2, 2, 171, 169, 3, 2, 2, 2, 172, 174, 3, 2, 2, 2, 173, 171, 3, 2, 2, 2, 174, 175, 7, 44, 2, 2, 175, 176, 7, 49, 2, 2, 176, 177, 3, 2, 2, 2, 177, 178, 8, 21, 3, 2, 178, 42, 3, 2, 2, 2, 179, 180, 11, 2, 2, 2, 180, 44, 3, 2, 2, 2, 19, 2, 91, 96, 98, 104, 106, 110, 117, 119, 122, 129, 132, 136, 143, 151, 160, 171, 4, 8, 2, 2, 2, 3, 2] \ No newline at end of file diff --git a/src/parser/generated/JSONLexer.tokens b/src/parser/generated/JSONLexer.tokens index 5777a80..c34ef57 100644 --- a/src/parser/generated/JSONLexer.tokens +++ b/src/parser/generated/JSONLexer.tokens @@ -13,7 +13,8 @@ NUMBER=12 WS=13 IDENTIFIER=14 LINE_COMMENT=15 -ErrorCharacter=16 +BLOCK_COMMENT=16 +ErrorCharacter=17 'true'=1 'false'=2 'null'=3 diff --git a/src/parser/generated/JSONLexer.ts b/src/parser/generated/JSONLexer.ts index afec6f3..0a7ed39 100644 --- a/src/parser/generated/JSONLexer.ts +++ b/src/parser/generated/JSONLexer.ts @@ -31,7 +31,8 @@ export class JSONLexer extends Lexer { public static readonly WS = 13; public static readonly IDENTIFIER = 14; public static readonly LINE_COMMENT = 15; - public static readonly ErrorCharacter = 16; + public static readonly BLOCK_COMMENT = 16; + public static readonly ErrorCharacter = 17; // tslint:disable:no-trailing-whitespace public static readonly channelNames: string[] = [ @@ -46,7 +47,8 @@ export class JSONLexer extends Lexer { public static readonly ruleNames: string[] = [ "T__0", "T__1", "T__2", "T__3", "T__4", "T__5", "T__6", "CLOSING_CURLIES", "OPENING_CURLIES", "COLON", "STRING", "STRINGCHARS_DOUBLE", "STRINGCHARS_SINGLE", - "NUMBER", "INT", "EXP", "WS", "IDENTIFIER", "LINE_COMMENT", "ErrorCharacter", + "NUMBER", "INT", "EXP", "WS", "IDENTIFIER", "LINE_COMMENT", "BLOCK_COMMENT", + "ErrorCharacter", ]; private static readonly _LITERAL_NAMES: Array = [ @@ -56,7 +58,7 @@ export class JSONLexer extends Lexer { private static readonly _SYMBOLIC_NAMES: Array = [ undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, "CLOSING_CURLIES", "OPENING_CURLIES", "COLON", "STRING", "NUMBER", - "WS", "IDENTIFIER", "LINE_COMMENT", "ErrorCharacter", + "WS", "IDENTIFIER", "LINE_COMMENT", "BLOCK_COMMENT", "ErrorCharacter", ]; public static readonly VOCABULARY: Vocabulary = new VocabularyImpl(JSONLexer._LITERAL_NAMES, JSONLexer._SYMBOLIC_NAMES, []); @@ -90,434 +92,441 @@ export class JSONLexer extends Lexer { private static readonly _serializedATNSegments: number = 2; private static readonly _serializedATNSegment0: string = - "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x02\x12\xA5\b\x01" + + "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x02\x13\xB5\b\x01" + "\x04\x02\t\x02\x04\x03\t\x03\x04\x04\t\x04\x04\x05\t\x05\x04\x06\t\x06" + "\x04\x07\t\x07\x04\b\t\b\x04\t\t\t\x04\n\t\n\x04\v\t\v\x04\f\t\f\x04\r" + "\t\r\x04\x0E\t\x0E\x04\x0F\t\x0F\x04\x10\t\x10\x04\x11\t\x11\x04\x12\t" + - "\x12\x04\x13\t\x13\x04\x14\t\x14\x04\x15\t\x15\x03\x02\x03\x02\x03\x02" + - "\x03\x02\x03\x02\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x04" + - "\x03\x04\x03\x04\x03\x04\x03\x04\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05" + - "\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x06\x03\x06\x03\x07\x03\x07" + - "\x03\b\x03\b\x03\t\x03\t\x03\n\x03\n\x03\v\x03\v\x03\f\x03\f\x03\f\x03" + - "\f\x03\f\x03\f\x03\f\x03\f\x05\fZ\n\f\x03\r\x03\r\x03\r\x07\r_\n\r\f\r" + - "\x0E\rb\v\r\x03\x0E\x03\x0E\x03\x0E\x07\x0Eg\n\x0E\f\x0E\x0E\x0Ej\v\x0E" + - "\x03\x0F\x05\x0Fm\n\x0F\x03\x0F\x03\x0F\x03\x0F\x06\x0Fr\n\x0F\r\x0F\x0E" + - "\x0Fs\x05\x0Fv\n\x0F\x03\x0F\x05\x0Fy\n\x0F\x03\x10\x03\x10\x03\x10\x07" + - "\x10~\n\x10\f\x10\x0E\x10\x81\v\x10\x05\x10\x83\n\x10\x03\x11\x03\x11" + - "\x05\x11\x87\n\x11\x03\x11\x03\x11\x03\x12\x06\x12\x8C\n\x12\r\x12\x0E" + - "\x12\x8D\x03\x12\x03\x12\x03\x13\x03\x13\x07\x13\x94\n\x13\f\x13\x0E\x13" + - "\x97\v\x13\x03\x14\x03\x14\x03\x14\x03\x14\x07\x14\x9D\n\x14\f\x14\x0E" + - "\x14\xA0\v\x14\x03\x14\x03\x14\x03\x15\x03\x15\x02\x02\x02\x16\x03\x02" + - "\x03\x05\x02\x04\x07\x02\x05\t\x02\x06\v\x02\x07\r\x02\b\x0F\x02\t\x11" + - "\x02\n\x13\x02\v\x15\x02\f\x17\x02\r\x19\x02\x02\x1B\x02\x02\x1D\x02\x0E" + - "\x1F\x02\x02!\x02\x02#\x02\x0F%\x02\x10\'\x02\x11)\x02\x12\x03\x02\n\x03" + - "\x02$$\x03\x02))\x03\x022;\x03\x023;\x04\x02GGgg\x04\x02--//\r\x02\v\x0F" + - "\"\"\x87\x87\xA2\xA2\u1682\u1682\u2002\u200C\u202A\u202B\u2031\u2031\u2061" + - "\u2061\u3002\u3002\uFF01\uFF01\x04\x02\f\f\x0F\x0F\x04\u023F\x02&\x02" + - "&\x02C\x02\\\x02a\x02a\x02c\x02|\x02\xAC\x02\xAC\x02\xB7\x02\xB7\x02\xBC" + - "\x02\xBC\x02\xC2\x02\xD8\x02\xDA\x02\xF8\x02\xFA\x02\u02C3\x02\u02C8\x02" + - "\u02D3\x02\u02E2\x02\u02E6\x02\u02EE\x02\u02EE\x02\u02F0\x02\u02F0\x02" + - "\u0372\x02\u0376\x02\u0378\x02\u0379\x02\u037C\x02\u037F\x02\u0381\x02" + - "\u0381\x02\u0388\x02\u0388\x02\u038A\x02\u038C\x02\u038E\x02\u038E\x02" + - "\u0390\x02\u03A3\x02\u03A5\x02\u03F7\x02\u03F9\x02\u0483\x02\u048C\x02" + - "\u0531\x02\u0533\x02\u0558\x02\u055B\x02\u055B\x02\u0563\x02\u0589\x02" + - "\u05D2\x02\u05EC\x02\u05F2\x02\u05F4\x02\u0622\x02\u064C\x02\u0670\x02" + - "\u0671\x02\u0673\x02\u06D5\x02\u06D7\x02\u06D7\x02\u06E7\x02\u06E8\x02" + - "\u06F0\x02\u06F1\x02\u06FC\x02\u06FE\x02\u0701\x02\u0701\x02\u0712\x02" + - "\u0712\x02\u0714\x02\u0731\x02\u074F\x02\u07A7\x02\u07B3\x02\u07B3\x02" + - "\u07CC\x02\u07EC\x02\u07F6\x02\u07F7\x02\u07FC\x02\u07FC\x02\u0802\x02" + - "\u0817\x02\u081C\x02\u081C\x02\u0826\x02\u0826\x02\u082A\x02\u082A\x02" + - "\u0842\x02\u085A\x02\u08A2\x02\u08B6\x02\u08B8\x02\u08BF\x02\u0906\x02" + - "\u093B\x02\u093F\x02\u093F\x02\u0952\x02\u0952\x02\u095A\x02\u0963\x02" + - "\u0973\x02\u0982\x02\u0987\x02\u098E\x02\u0991\x02\u0992\x02\u0995\x02" + - "\u09AA\x02\u09AC\x02\u09B2\x02\u09B4\x02\u09B4\x02\u09B8\x02\u09BB\x02" + - "\u09BF\x02\u09BF\x02\u09D0\x02\u09D0\x02\u09DE\x02\u09DF\x02\u09E1\x02" + - "\u09E3\x02\u09F2\x02\u09F3\x02\u0A07\x02\u0A0C\x02\u0A11\x02\u0A12\x02" + - "\u0A15\x02\u0A2A\x02\u0A2C\x02\u0A32\x02\u0A34\x02\u0A35\x02\u0A37\x02" + - "\u0A38\x02\u0A3A\x02\u0A3B\x02\u0A5B\x02\u0A5E\x02\u0A60\x02\u0A60\x02" + - "\u0A74\x02\u0A76\x02\u0A87\x02\u0A8F\x02\u0A91\x02\u0A93\x02\u0A95\x02" + - "\u0AAA\x02\u0AAC\x02\u0AB2\x02\u0AB4\x02\u0AB5\x02\u0AB7\x02\u0ABB\x02" + - "\u0ABF\x02\u0ABF\x02\u0AD2\x02\u0AD2\x02\u0AE2\x02\u0AE3\x02\u0AFB\x02" + - "\u0AFB\x02\u0B07\x02\u0B0E\x02\u0B11\x02\u0B12\x02\u0B15\x02\u0B2A\x02" + - "\u0B2C\x02\u0B32\x02\u0B34\x02\u0B35\x02\u0B37\x02\u0B3B\x02\u0B3F\x02" + - "\u0B3F\x02\u0B5E\x02\u0B5F\x02\u0B61\x02\u0B63\x02\u0B73\x02\u0B73\x02" + - "\u0B85\x02\u0B85\x02\u0B87\x02\u0B8C\x02\u0B90\x02\u0B92\x02\u0B94\x02" + - "\u0B97\x02\u0B9B\x02\u0B9C\x02\u0B9E\x02\u0B9E\x02\u0BA0\x02\u0BA1\x02" + - "\u0BA5\x02\u0BA6\x02\u0BAA\x02\u0BAC\x02\u0BB0\x02\u0BBB\x02\u0BD2\x02" + - "\u0BD2\x02\u0C07\x02\u0C0E\x02\u0C10\x02\u0C12\x02\u0C14\x02\u0C2A\x02" + - "\u0C2C\x02\u0C3B\x02\u0C3F\x02\u0C3F\x02\u0C5A\x02\u0C5C\x02\u0C62\x02" + - "\u0C63\x02\u0C82\x02\u0C82\x02\u0C87\x02\u0C8E\x02\u0C90\x02\u0C92\x02" + - "\u0C94\x02\u0CAA\x02\u0CAC\x02\u0CB5\x02\u0CB7\x02\u0CBB\x02\u0CBF\x02" + - "\u0CBF\x02\u0CE0\x02\u0CE0\x02\u0CE2\x02\u0CE3\x02\u0CF3\x02\u0CF4\x02" + - "\u0D07\x02\u0D0E\x02\u0D10\x02\u0D12\x02\u0D14\x02\u0D3C\x02\u0D3F\x02" + - "\u0D3F\x02\u0D50\x02\u0D50\x02\u0D56\x02\u0D58\x02\u0D61\x02\u0D63\x02" + - "\u0D7C\x02\u0D81\x02\u0D87\x02\u0D98\x02\u0D9C\x02\u0DB3\x02\u0DB5\x02" + - "\u0DBD\x02\u0DBF\x02\u0DBF\x02\u0DC2\x02\u0DC8\x02\u0E03\x02\u0E32\x02" + - "\u0E34\x02\u0E35\x02\u0E42\x02\u0E48\x02\u0E83\x02\u0E84\x02\u0E86\x02" + - "\u0E86\x02\u0E89\x02\u0E8A\x02\u0E8C\x02\u0E8C\x02\u0E8F\x02\u0E8F\x02" + - "\u0E96\x02\u0E99\x02\u0E9B\x02\u0EA1\x02\u0EA3\x02\u0EA5\x02\u0EA7\x02" + - "\u0EA7\x02\u0EA9\x02\u0EA9\x02\u0EAC\x02\u0EAD\x02\u0EAF\x02\u0EB2\x02" + - "\u0EB4\x02\u0EB5\x02\u0EBF\x02\u0EBF\x02\u0EC2\x02\u0EC6\x02\u0EC8\x02" + - "\u0EC8\x02\u0EDE\x02\u0EE1\x02\u0F02\x02\u0F02\x02\u0F42\x02\u0F49\x02" + - "\u0F4B\x02\u0F6E\x02\u0F8A\x02\u0F8E\x02\u1002\x02\u102C\x02\u1041\x02" + - "\u1041\x02\u1052\x02\u1057\x02\u105C\x02\u105F\x02\u1063\x02\u1063\x02" + - "\u1067\x02\u1068\x02\u1070\x02\u1072\x02\u1077\x02\u1083\x02\u1090\x02" + - "\u1090\x02\u10A2\x02\u10C7\x02\u10C9\x02\u10C9\x02\u10CF\x02\u10CF\x02" + - "\u10D2\x02\u10FC\x02\u10FE\x02\u124A\x02\u124C\x02\u124F\x02\u1252\x02" + - "\u1258\x02\u125A\x02\u125A\x02\u125C\x02\u125F\x02\u1262\x02\u128A\x02" + - "\u128C\x02\u128F\x02\u1292\x02\u12B2\x02\u12B4\x02\u12B7\x02\u12BA\x02" + - "\u12C0\x02\u12C2\x02\u12C2\x02\u12C4\x02\u12C7\x02\u12CA\x02\u12D8\x02" + - "\u12DA\x02\u1312\x02\u1314\x02\u1317\x02\u131A\x02\u135C\x02\u1382\x02" + - "\u1391\x02\u13A2\x02\u13F7\x02\u13FA\x02\u13FF\x02\u1403\x02\u166E\x02" + - "\u1671\x02\u1681\x02\u1683\x02\u169C\x02\u16A2\x02\u16EC\x02\u16F0\x02" + - "\u16FA\x02\u1702\x02\u170E\x02\u1710\x02\u1713\x02\u1722\x02\u1733\x02" + - "\u1742\x02\u1753\x02\u1762\x02\u176E\x02\u1770\x02\u1772\x02\u1782\x02" + - "\u17B5\x02\u17D9\x02\u17D9\x02\u17DE\x02\u17DE\x02\u1822\x02\u1879\x02" + - "\u1882\x02\u18AA\x02\u18AC\x02\u18AC\x02\u18B2\x02\u18F7\x02\u1902\x02" + - "\u1920\x02\u1952\x02\u196F\x02\u1972\x02\u1976\x02\u1982\x02\u19AD\x02" + - "\u19B2\x02\u19CB\x02\u1A02\x02\u1A18\x02\u1A22\x02\u1A56\x02\u1AA9\x02" + - "\u1AA9\x02\u1B07\x02\u1B35\x02\u1B47\x02\u1B4D\x02\u1B85\x02\u1BA2\x02" + - "\u1BB0\x02\u1BB1\x02\u1BBC\x02\u1BE7\x02\u1C02\x02\u1C25\x02\u1C4F\x02" + - "\u1C51\x02\u1C5C\x02\u1C7F\x02\u1C82\x02\u1C8A\x02\u1CEB\x02\u1CEE\x02" + - "\u1CF0\x02\u1CF3\x02\u1CF7\x02\u1CF8\x02\u1D02\x02\u1DC1\x02\u1E02\x02" + - "\u1F17\x02\u1F1A\x02\u1F1F\x02\u1F22\x02\u1F47\x02\u1F4A\x02\u1F4F\x02" + - "\u1F52\x02\u1F59\x02\u1F5B\x02\u1F5B\x02\u1F5D\x02\u1F5D\x02\u1F5F\x02" + - "\u1F5F\x02\u1F61\x02\u1F7F\x02\u1F82\x02\u1FB6\x02\u1FB8\x02\u1FBE\x02" + - "\u1FC0\x02\u1FC0\x02\u1FC4\x02\u1FC6\x02\u1FC8\x02\u1FCE\x02\u1FD2\x02" + - "\u1FD5\x02\u1FD8\x02\u1FDD\x02\u1FE2\x02\u1FEE\x02\u1FF4\x02\u1FF6\x02" + - "\u1FF8\x02\u1FFE\x02\u2073\x02\u2073\x02\u2081\x02\u2081\x02\u2092\x02" + - "\u209E\x02\u2104\x02\u2104\x02\u2109\x02\u2109\x02\u210C\x02\u2115\x02" + - "\u2117\x02\u2117\x02\u211A\x02\u211F\x02\u2126\x02\u2126\x02\u2128\x02" + - "\u2128\x02\u212A\x02\u212A\x02\u212C\x02\u213B\x02\u213E\x02\u2141\x02" + - "\u2147\x02\u214B\x02\u2150\x02\u2150\x02\u2162\x02\u218A\x02\u2C02\x02" + - "\u2C30\x02\u2C32\x02\u2C60\x02\u2C62\x02\u2CE6\x02\u2CED\x02\u2CF0\x02" + - "\u2CF4\x02\u2CF5\x02\u2D02\x02\u2D27\x02\u2D29\x02\u2D29\x02\u2D2F\x02" + - "\u2D2F\x02\u2D32\x02\u2D69\x02\u2D71\x02\u2D71\x02\u2D82\x02\u2D98\x02" + - "\u2DA2\x02\u2DA8\x02\u2DAA\x02\u2DB0\x02\u2DB2\x02\u2DB8\x02\u2DBA\x02" + - "\u2DC0\x02\u2DC2\x02\u2DC8\x02\u2DCA\x02\u2DD0\x02\u2DD2\x02\u2DD8\x02" + - "\u2DDA\x02\u2DE0\x02\u3007\x02\u3009\x02\u3023\x02\u302B\x02\u3033\x02" + - "\u3037\x02\u303A\x02\u303E\x02\u3043\x02\u3098\x02\u309D\x02\u30A1\x02" + - "\u30A3\x02\u30FC\x02\u30FE\x02\u3101\x02\u3107\x02\u312F\x02\u3133\x02" + - "\u3190\x02\u31A2\x02\u31BC\x02\u31F2\x02\u3201\x02\u3402\x02\u4DB7\x02" + - "\u4E02\x02\u9FD7\x02\uA002\x02\uA48E\x02\uA4D2\x02\uA4FF\x02\uA502\x02" + - "\uA60E\x02\uA612\x02\uA621\x02\uA62C\x02\uA62D\x02\uA642\x02\uA670\x02" + - "\uA681\x02\uA69F\x02\uA6A2\x02\uA6F1\x02\uA719\x02\uA721\x02\uA724\x02" + - "\uA78A\x02\uA78D\x02\uA7B0\x02\uA7B2\x02\uA7B9\x02\uA7F9\x02\uA803\x02" + - "\uA805\x02\uA807\x02\uA809\x02\uA80C\x02\uA80E\x02\uA824\x02\uA842\x02" + - "\uA875\x02\uA884\x02\uA8B5\x02\uA8F4\x02\uA8F9\x02\uA8FD\x02\uA8FD\x02" + - "\uA8FF\x02\uA8FF\x02\uA90C\x02\uA927\x02\uA932\x02\uA948\x02\uA962\x02" + - "\uA97E\x02\uA986\x02\uA9B4\x02\uA9D1\x02\uA9D1\x02\uA9E2\x02\uA9E6\x02" + - "\uA9E8\x02\uA9F1\x02\uA9FC\x02\uAA00\x02\uAA02\x02\uAA2A\x02\uAA42\x02" + - "\uAA44\x02\uAA46\x02\uAA4D\x02\uAA62\x02\uAA78\x02\uAA7C\x02\uAA7C\x02" + - "\uAA80\x02\uAAB1\x02\uAAB3\x02\uAAB3\x02\uAAB7\x02\uAAB8\x02\uAABB\x02" + - "\uAABF\x02\uAAC2\x02\uAAC2\x02\uAAC4\x02\uAAC4\x02\uAADD\x02\uAADF\x02" + - "\uAAE2\x02\uAAEC\x02\uAAF4\x02\uAAF6\x02\uAB03\x02\uAB08\x02\uAB0B\x02" + - "\uAB10\x02\uAB13\x02\uAB18\x02\uAB22\x02\uAB28\x02\uAB2A\x02\uAB30\x02" + - "\uAB32\x02\uAB5C\x02\uAB5E\x02\uAB67\x02\uAB72\x02\uABE4\x02\uAC02\x02" + - "\uD7A5\x02\uD7B2\x02\uD7C8\x02\uD7CD\x02\uD7FD\x02\uF902\x02\uFA6F\x02" + - "\uFA72\x02\uFADB\x02\uFB02\x02\uFB08\x02\uFB15\x02\uFB19\x02\uFB1F\x02" + - "\uFB1F\x02\uFB21\x02\uFB2A\x02\uFB2C\x02\uFB38\x02\uFB3A\x02\uFB3E\x02" + - "\uFB40\x02\uFB40\x02\uFB42\x02\uFB43\x02\uFB45\x02\uFB46\x02\uFB48\x02" + - "\uFBB3\x02\uFBD5\x02\uFD3F\x02\uFD52\x02\uFD91\x02\uFD94\x02\uFDC9\x02" + - "\uFDF2\x02\uFDFD\x02\uFE72\x02\uFE76\x02\uFE78\x02\uFEFE\x02\uFF23\x02" + - "\uFF3C\x02\uFF43\x02\uFF5C\x02\uFF68\x02\uFFC0\x02\uFFC4\x02\uFFC9\x02" + - "\uFFCC\x02\uFFD1\x02\uFFD4\x02\uFFD9\x02\uFFDC\x02\uFFDE\x02\x02\x03\r" + - "\x03\x0F\x03(\x03*\x03<\x03>\x03?\x03A\x03O\x03R\x03_\x03\x82\x03\xFC" + - "\x03\u0142\x03\u0176\x03\u0282\x03\u029E\x03\u02A2\x03\u02D2\x03\u0302" + - "\x03\u0321\x03\u0332\x03\u034C\x03\u0352\x03\u0377\x03\u0382\x03\u039F" + - "\x03\u03A2\x03\u03C5\x03\u03CA\x03\u03D1\x03\u03D3\x03\u03D7\x03\u0402" + - "\x03\u049F\x03\u04B2\x03\u04D5\x03\u04DA\x03\u04FD\x03\u0502\x03\u0529" + - "\x03\u0532\x03\u0565\x03\u0602\x03\u0738\x03\u0742\x03\u0757\x03\u0762" + - "\x03\u0769\x03\u0802\x03\u0807\x03\u080A\x03\u080A\x03\u080C\x03\u0837" + - "\x03\u0839\x03\u083A\x03\u083E\x03\u083E\x03\u0841\x03\u0857\x03\u0862" + - "\x03\u0878\x03\u0882\x03\u08A0\x03\u08E2\x03\u08F4\x03\u08F6\x03\u08F7" + - "\x03\u0902\x03\u0917\x03\u0922\x03\u093B\x03\u0982\x03\u09B9\x03\u09C0" + - "\x03\u09C1\x03\u0A02\x03\u0A02\x03\u0A12\x03\u0A15\x03\u0A17\x03\u0A19" + - "\x03\u0A1B\x03\u0A35\x03\u0A62\x03\u0A7E\x03\u0A82\x03\u0A9E\x03\u0AC2" + - "\x03\u0AC9\x03\u0ACB\x03\u0AE6\x03\u0B02\x03\u0B37\x03\u0B42\x03\u0B57" + - "\x03\u0B62\x03\u0B74\x03\u0B82\x03\u0B93\x03\u0C02\x03\u0C4A\x03\u0C82" + - "\x03\u0CB4\x03\u0CC2\x03\u0CF4\x03\u1005\x03\u1039\x03\u1085\x03\u10B1" + - "\x03\u10D2\x03\u10EA\x03\u1105\x03\u1128\x03\u1152\x03\u1174\x03\u1178" + - "\x03\u1178\x03\u1185\x03\u11B4\x03\u11C3\x03\u11C6\x03\u11DC\x03\u11DC" + - "\x03\u11DE\x03\u11DE\x03\u1202\x03\u1213\x03\u1215\x03\u122D\x03\u1282" + - "\x03\u1288\x03\u128A\x03\u128A\x03\u128C\x03\u128F\x03\u1291\x03\u129F" + - "\x03\u12A1\x03\u12AA\x03\u12B2\x03\u12E0\x03\u1307\x03\u130E\x03\u1311" + - "\x03\u1312\x03\u1315\x03\u132A\x03\u132C\x03\u1332\x03\u1334\x03\u1335" + - "\x03\u1337\x03\u133B\x03\u133F\x03\u133F\x03\u1352\x03\u1352\x03\u135F" + - "\x03\u1363\x03\u1402\x03\u1436\x03\u1449\x03\u144C\x03\u1482\x03\u14B1" + - "\x03\u14C6\x03\u14C7\x03\u14C9\x03\u14C9\x03\u1582\x03\u15B0\x03\u15DA" + - "\x03\u15DD\x03\u1602\x03\u1631\x03\u1646\x03\u1646\x03\u1682\x03\u16AC" + - "\x03\u1702\x03\u171B\x03\u18A2\x03\u18E1\x03\u1901\x03\u1901\x03\u1AC2" + - "\x03\u1AFA\x03\u1C02\x03\u1C0A\x03\u1C0C\x03\u1C30\x03\u1C42\x03\u1C42" + - "\x03\u1C74\x03\u1C91\x03\u2002\x03\u239B\x03\u2402\x03\u2470\x03\u2482" + - "\x03\u2545\x03\u3002\x03\u3430\x03\u4402\x03\u4648\x03\u6802\x03\u6A3A" + - "\x03\u6A42\x03\u6A60\x03\u6AD2\x03\u6AEF\x03\u6B02\x03\u6B31\x03\u6B42" + - "\x03\u6B45\x03\u6B65\x03\u6B79\x03\u6B7F\x03\u6B91\x03\u6F02\x03\u6F46" + - "\x03\u6F52\x03\u6F52\x03\u6F95\x03\u6FA1\x03\u6FE2\x03\u6FE2\x03\u7002" + - "\x03\u87EE\x03\u8802\x03\u8AF4\x03\uB002\x03\uB003\x03\uBC02\x03\uBC6C" + - "\x03\uBC72\x03\uBC7E\x03\uBC82\x03\uBC8A\x03\uBC92\x03\uBC9B\x03\uD402" + - "\x03\uD456\x03\uD458\x03\uD49E\x03\uD4A0\x03\uD4A1\x03\uD4A4\x03\uD4A4" + - "\x03\uD4A7\x03\uD4A8\x03\uD4AB\x03\uD4AE\x03\uD4B0\x03\uD4BB\x03\uD4BD" + - "\x03\uD4BD\x03\uD4BF\x03\uD4C5\x03\uD4C7\x03\uD507\x03\uD509\x03\uD50C" + - "\x03\uD50F\x03\uD516\x03\uD518\x03\uD51E\x03\uD520\x03\uD53B\x03\uD53D" + - "\x03\uD540\x03\uD542\x03\uD546\x03\uD548\x03\uD548\x03\uD54C\x03\uD552" + - "\x03\uD554\x03\uD6A7\x03\uD6AA\x03\uD6C2\x03\uD6C4\x03\uD6DC\x03\uD6DE" + - "\x03\uD6FC\x03\uD6FE\x03\uD716\x03\uD718\x03\uD736\x03\uD738\x03\uD750" + - "\x03\uD752\x03\uD770\x03\uD772\x03\uD78A\x03\uD78C\x03\uD7AA\x03\uD7AC" + - "\x03\uD7C4\x03\uD7C6\x03\uD7CD\x03\uE802\x03\uE8C6\x03\uE902\x03\uE945" + - "\x03\uEE02\x03\uEE05\x03\uEE07\x03\uEE21\x03\uEE23\x03\uEE24\x03\uEE26" + - "\x03\uEE26\x03\uEE29\x03\uEE29\x03\uEE2B\x03\uEE34\x03\uEE36\x03\uEE39" + - "\x03\uEE3B\x03\uEE3B\x03\uEE3D\x03\uEE3D\x03\uEE44\x03\uEE44\x03\uEE49" + - "\x03\uEE49\x03\uEE4B\x03\uEE4B\x03\uEE4D\x03\uEE4D\x03\uEE4F\x03\uEE51" + - "\x03\uEE53\x03\uEE54\x03\uEE56\x03\uEE56\x03\uEE59\x03\uEE59\x03\uEE5B" + - "\x03\uEE5B\x03\uEE5D\x03\uEE5D\x03\uEE5F\x03\uEE5F\x03\uEE61\x03\uEE61" + - "\x03\uEE63\x03\uEE64\x03\uEE66\x03\uEE66\x03\uEE69\x03\uEE6C\x03\uEE6E" + - "\x03\uEE74\x03\uEE76\x03\uEE79\x03\uEE7B\x03\uEE7E\x03\uEE80\x03\uEE80" + - "\x03\uEE82\x03\uEE8B\x03\uEE8D\x03\uEE9D\x03\uEEA3\x03\uEEA5\x03\uEEA7" + - "\x03\uEEAB\x03\uEEAD\x03\uEEBD\x03\x02\x04\uA6D8\x04\uA702\x04\uB736\x04" + - "\uB742\x04\uB81F\x04\uB822\x04\uCEA3\x04\uF802\x04\uFA1F\x04\u02A7\x02" + - "&\x02&\x022\x02;\x02C\x02\\\x02a\x02a\x02c\x02|\x02\xAC\x02\xAC\x02\xB7" + - "\x02\xB7\x02\xB9\x02\xB9\x02\xBC\x02\xBC\x02\xC2\x02\xD8\x02\xDA\x02\xF8" + - "\x02\xFA\x02\u02C3\x02\u02C8\x02\u02D3\x02\u02E2\x02\u02E6\x02\u02EE\x02" + - "\u02EE\x02\u02F0\x02\u02F0\x02\u0302\x02\u0376\x02\u0378\x02\u0379\x02" + - "\u037C\x02\u037F\x02\u0381\x02\u0381\x02\u0388\x02\u038C\x02\u038E\x02" + + "\x12\x04\x13\t\x13\x04\x14\t\x14\x04\x15\t\x15\x04\x16\t\x16\x03\x02\x03" + + "\x02\x03\x02\x03\x02\x03\x02\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03" + + "\x03\x03\x04\x03\x04\x03\x04\x03\x04\x03\x04\x03\x05\x03\x05\x03\x05\x03" + + "\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x05\x03\x06\x03\x06\x03" + + "\x07\x03\x07\x03\b\x03\b\x03\t\x03\t\x03\n\x03\n\x03\v\x03\v\x03\f\x03" + + "\f\x03\f\x03\f\x03\f\x03\f\x03\f\x03\f\x05\f\\\n\f\x03\r\x03\r\x03\r\x07" + + "\ra\n\r\f\r\x0E\rd\v\r\x03\x0E\x03\x0E\x03\x0E\x07\x0Ei\n\x0E\f\x0E\x0E" + + "\x0El\v\x0E\x03\x0F\x05\x0Fo\n\x0F\x03\x0F\x03\x0F\x03\x0F\x06\x0Ft\n" + + "\x0F\r\x0F\x0E\x0Fu\x05\x0Fx\n\x0F\x03\x0F\x05\x0F{\n\x0F\x03\x10\x03" + + "\x10\x03\x10\x07\x10\x80\n\x10\f\x10\x0E\x10\x83\v\x10\x05\x10\x85\n\x10" + + "\x03\x11\x03\x11\x05\x11\x89\n\x11\x03\x11\x03\x11\x03\x12\x06\x12\x8E" + + "\n\x12\r\x12\x0E\x12\x8F\x03\x12\x03\x12\x03\x13\x03\x13\x07\x13\x96\n" + + "\x13\f\x13\x0E\x13\x99\v\x13\x03\x14\x03\x14\x03\x14\x03\x14\x07\x14\x9F" + + "\n\x14\f\x14\x0E\x14\xA2\v\x14\x03\x14\x03\x14\x03\x15\x03\x15\x03\x15" + + "\x03\x15\x07\x15\xAA\n\x15\f\x15\x0E\x15\xAD\v\x15\x03\x15\x03\x15\x03" + + "\x15\x03\x15\x03\x15\x03\x16\x03\x16\x03\xAB\x02\x02\x17\x03\x02\x03\x05" + + "\x02\x04\x07\x02\x05\t\x02\x06\v\x02\x07\r\x02\b\x0F\x02\t\x11\x02\n\x13" + + "\x02\v\x15\x02\f\x17\x02\r\x19\x02\x02\x1B\x02\x02\x1D\x02\x0E\x1F\x02" + + "\x02!\x02\x02#\x02\x0F%\x02\x10\'\x02\x11)\x02\x12+\x02\x13\x03\x02\n" + + "\x03\x02$$\x03\x02))\x03\x022;\x03\x023;\x04\x02GGgg\x04\x02--//\r\x02" + + "\v\x0F\"\"\x87\x87\xA2\xA2\u1682\u1682\u2002\u200C\u202A\u202B\u2031\u2031" + + "\u2061\u2061\u3002\u3002\uFF01\uFF01\x04\x02\f\f\x0F\x0F\x04\u023F\x02" + + "&\x02&\x02C\x02\\\x02a\x02a\x02c\x02|\x02\xAC\x02\xAC\x02\xB7\x02\xB7" + + "\x02\xBC\x02\xBC\x02\xC2\x02\xD8\x02\xDA\x02\xF8\x02\xFA\x02\u02C3\x02" + + "\u02C8\x02\u02D3\x02\u02E2\x02\u02E6\x02\u02EE\x02\u02EE\x02\u02F0\x02" + + "\u02F0\x02\u0372\x02\u0376\x02\u0378\x02\u0379\x02\u037C\x02\u037F\x02" + + "\u0381\x02\u0381\x02\u0388\x02\u0388\x02\u038A\x02\u038C\x02\u038E\x02" + "\u038E\x02\u0390\x02\u03A3\x02\u03A5\x02\u03F7\x02\u03F9\x02\u0483\x02" + - "\u0485\x02\u0489\x02\u048C\x02\u0531\x02\u0533\x02\u0558\x02\u055B\x02" + - "\u055B\x02\u0563\x02\u0589\x02\u0593\x02\u05BF\x02\u05C1\x02\u05C1\x02" + - "\u05C3\x02\u05C4\x02\u05C6\x02\u05C7\x02\u05C9\x02\u05C9\x02\u05D2\x02" + - "\u05EC\x02\u05F2\x02\u05F4\x02\u0612\x02\u061C\x02\u0622\x02\u066B\x02" + - "\u0670\x02\u06D5\x02\u06D7\x02\u06DE\x02\u06E1\x02\u06EA\x02\u06EC\x02" + - "\u06FE\x02\u0701\x02\u0701\x02\u0712\x02\u074C\x02\u074F\x02\u07B3\x02" + - "\u07C2\x02\u07F7\x02\u07FC\x02\u07FC\x02\u0802\x02\u082F\x02\u0842\x02" + - "\u085D\x02\u08A2\x02\u08B6\x02\u08B8\x02\u08BF\x02\u08D6\x02\u08E3\x02" + - "\u08E5\x02\u0965\x02\u0968\x02\u0971\x02\u0973\x02\u0985\x02\u0987\x02" + - "\u098E\x02\u0991\x02\u0992\x02\u0995\x02\u09AA\x02\u09AC\x02\u09B2\x02" + - "\u09B4\x02\u09B4\x02\u09B8\x02\u09BB\x02\u09BE\x02\u09C6\x02\u09C9\x02" + - "\u09CA\x02\u09CD\x02\u09D0\x02\u09D9\x02\u09D9\x02\u09DE\x02\u09DF\x02" + - "\u09E1\x02\u09E5\x02\u09E8\x02\u09F3\x02\u0A03\x02\u0A05\x02\u0A07\x02" + - "\u0A0C\x02\u0A11\x02\u0A12\x02\u0A15\x02\u0A2A\x02\u0A2C\x02\u0A32\x02" + - "\u0A34\x02\u0A35\x02\u0A37\x02\u0A38\x02\u0A3A\x02\u0A3B\x02\u0A3E\x02" + - "\u0A3E\x02\u0A40\x02\u0A44\x02\u0A49\x02\u0A4A\x02\u0A4D\x02\u0A4F\x02" + - "\u0A53\x02\u0A53\x02\u0A5B\x02\u0A5E\x02\u0A60\x02\u0A60\x02\u0A68\x02" + - "\u0A77\x02\u0A83\x02\u0A85\x02\u0A87\x02\u0A8F\x02\u0A91\x02\u0A93\x02" + + "\u048C\x02\u0531\x02\u0533\x02\u0558\x02\u055B\x02\u055B\x02\u0563\x02" + + "\u0589\x02\u05D2\x02\u05EC\x02\u05F2\x02\u05F4\x02\u0622\x02\u064C\x02" + + "\u0670\x02\u0671\x02\u0673\x02\u06D5\x02\u06D7\x02\u06D7\x02\u06E7\x02" + + "\u06E8\x02\u06F0\x02\u06F1\x02\u06FC\x02\u06FE\x02\u0701\x02\u0701\x02" + + "\u0712\x02\u0712\x02\u0714\x02\u0731\x02\u074F\x02\u07A7\x02\u07B3\x02" + + "\u07B3\x02\u07CC\x02\u07EC\x02\u07F6\x02\u07F7\x02\u07FC\x02\u07FC\x02" + + "\u0802\x02\u0817\x02\u081C\x02\u081C\x02\u0826\x02\u0826\x02\u082A\x02" + + "\u082A\x02\u0842\x02\u085A\x02\u08A2\x02\u08B6\x02\u08B8\x02\u08BF\x02" + + "\u0906\x02\u093B\x02\u093F\x02\u093F\x02\u0952\x02\u0952\x02\u095A\x02" + + "\u0963\x02\u0973\x02\u0982\x02\u0987\x02\u098E\x02\u0991\x02\u0992\x02" + + "\u0995\x02\u09AA\x02\u09AC\x02\u09B2\x02\u09B4\x02\u09B4\x02\u09B8\x02" + + "\u09BB\x02\u09BF\x02\u09BF\x02\u09D0\x02\u09D0\x02\u09DE\x02\u09DF\x02" + + "\u09E1\x02\u09E3\x02\u09F2\x02\u09F3\x02\u0A07\x02\u0A0C\x02\u0A11\x02" + + "\u0A12\x02\u0A15\x02\u0A2A\x02\u0A2C\x02\u0A32\x02\u0A34\x02\u0A35\x02" + + "\u0A37\x02\u0A38\x02\u0A3A\x02\u0A3B\x02\u0A5B\x02\u0A5E\x02\u0A60\x02" + + "\u0A60\x02\u0A74\x02\u0A76\x02\u0A87\x02\u0A8F\x02\u0A91\x02\u0A93\x02" + "\u0A95\x02\u0AAA\x02\u0AAC\x02\u0AB2\x02\u0AB4\x02\u0AB5\x02\u0AB7\x02" + - "\u0ABB\x02\u0ABE\x02\u0AC7\x02\u0AC9\x02\u0ACB\x02\u0ACD\x02\u0ACF\x02" + - "\u0AD2\x02\u0AD2\x02\u0AE2\x02\u0AE5\x02\u0AE8\x02\u0AF1\x02\u0AFB\x02" + - "\u0AFB\x02\u0B03\x02\u0B05\x02\u0B07\x02\u0B0E\x02\u0B11\x02\u0B12\x02" + - "\u0B15\x02\u0B2A\x02\u0B2C\x02\u0B32\x02\u0B34\x02\u0B35\x02\u0B37\x02" + - "\u0B3B\x02\u0B3E\x02\u0B46\x02\u0B49\x02\u0B4A\x02\u0B4D\x02\u0B4F\x02" + - "\u0B58\x02\u0B59\x02\u0B5E\x02\u0B5F\x02\u0B61\x02\u0B65\x02\u0B68\x02" + - "\u0B71\x02\u0B73\x02\u0B73\x02\u0B84\x02\u0B85\x02\u0B87\x02\u0B8C\x02" + - "\u0B90\x02\u0B92\x02\u0B94\x02\u0B97\x02\u0B9B\x02\u0B9C\x02\u0B9E\x02" + - "\u0B9E\x02\u0BA0\x02\u0BA1\x02\u0BA5\x02\u0BA6\x02\u0BAA\x02\u0BAC\x02" + - "\u0BB0\x02\u0BBB\x02\u0BC0\x02\u0BC4\x02\u0BC8\x02\u0BCA\x02\u0BCC\x02" + - "\u0BCF\x02\u0BD2\x02\u0BD2\x02\u0BD9\x02\u0BD9\x02\u0BE8\x02\u0BF1\x02" + - "\u0C02\x02\u0C05\x02\u0C07\x02\u0C0E\x02\u0C10\x02\u0C12\x02\u0C14\x02" + - "\u0C2A\x02\u0C2C\x02\u0C3B\x02\u0C3F\x02\u0C46\x02\u0C48\x02\u0C4A\x02" + - "\u0C4C\x02\u0C4F\x02\u0C57\x02\u0C58\x02\u0C5A\x02\u0C5C\x02\u0C62\x02" + - "\u0C65\x02\u0C68\x02\u0C71\x02\u0C82\x02\u0C85\x02\u0C87\x02\u0C8E\x02" + - "\u0C90\x02\u0C92\x02\u0C94\x02\u0CAA\x02\u0CAC\x02\u0CB5\x02\u0CB7\x02" + - "\u0CBB\x02\u0CBE\x02\u0CC6\x02\u0CC8\x02\u0CCA\x02\u0CCC\x02\u0CCF\x02" + - "\u0CD7\x02\u0CD8\x02\u0CE0\x02\u0CE0\x02\u0CE2\x02\u0CE5\x02\u0CE8\x02" + - "\u0CF1\x02\u0CF3\x02\u0CF4\x02\u0D03\x02\u0D05\x02\u0D07\x02\u0D0E\x02" + - "\u0D10\x02\u0D12\x02\u0D14\x02\u0D3C\x02\u0D3F\x02\u0D46\x02\u0D48\x02" + - "\u0D4A\x02\u0D4C\x02\u0D50\x02\u0D56\x02\u0D59\x02\u0D61\x02\u0D65\x02" + - "\u0D68\x02\u0D71\x02\u0D7C\x02\u0D81\x02\u0D84\x02\u0D85\x02\u0D87\x02" + - "\u0D98\x02\u0D9C\x02\u0DB3\x02\u0DB5\x02\u0DBD\x02\u0DBF\x02\u0DBF\x02" + - "\u0DC2\x02\u0DC8\x02\u0DCC\x02\u0DCC\x02\u0DD1\x02\u0DD6\x02\u0DD8\x02" + - "\u0DD8\x02\u0DDA\x02\u0DE1\x02\u0DE8\x02\u0DF1\x02\u0DF4\x02\u0DF5\x02" + - "\u0E03\x02\u0E3C\x02\u0E42\x02\u0E50\x02\u0E52\x02\u0E5B\x02\u0E83\x02" + - "\u0E84\x02\u0E86\x02\u0E86\x02\u0E89\x02\u0E8A\x02\u0E8C\x02\u0E8C\x02" + - "\u0E8F\x02\u0E8F\x02\u0E96\x02\u0E99\x02\u0E9B\x02\u0EA1\x02\u0EA3\x02" + - "\u0EA5\x02\u0EA7\x02\u0EA7\x02\u0EA9\x02\u0EA9\x02\u0EAC\x02\u0EAD\x02" + - "\u0EAF\x02\u0EBB\x02\u0EBD\x02\u0EBF\x02\u0EC2\x02\u0EC6\x02\u0EC8\x02" + - "\u0EC8\x02\u0ECA\x02\u0ECF\x02\u0ED2\x02\u0EDB\x02\u0EDE\x02\u0EE1\x02" + - "\u0F02\x02\u0F02\x02\u0F1A\x02\u0F1B\x02\u0F22\x02\u0F2B\x02\u0F37\x02" + - "\u0F37\x02\u0F39\x02\u0F39\x02\u0F3B\x02\u0F3B\x02\u0F40\x02\u0F49\x02" + - "\u0F4B\x02\u0F6E\x02\u0F73\x02\u0F86\x02\u0F88\x02\u0F99\x02\u0F9B\x02" + - "\u0FBE\x02\u0FC8\x02\u0FC8\x02\u1002\x02\u104B\x02\u1052\x02\u109F\x02" + - "\u10A2\x02\u10C7\x02\u10C9\x02\u10C9\x02\u10CF\x02\u10CF\x02\u10D2\x02" + - "\u10FC\x02\u10FE\x02\u124A\x02\u124C\x02\u124F\x02\u1252\x02\u1258\x02" + - "\u125A\x02\u125A\x02\u125C\x02\u125F\x02\u1262\x02\u128A\x02\u128C\x02" + - "\u128F\x02\u1292\x02\u12B2\x02\u12B4\x02\u12B7\x02\u12BA\x02\u12C0\x02" + - "\u12C2\x02\u12C2\x02\u12C4\x02\u12C7\x02\u12CA\x02\u12D8\x02\u12DA\x02" + - "\u1312\x02\u1314\x02\u1317\x02\u131A\x02\u135C\x02\u135F\x02\u1361\x02" + - "\u136B\x02\u1373\x02\u1382\x02\u1391\x02\u13A2\x02\u13F7\x02\u13FA\x02" + - "\u13FF\x02\u1403\x02\u166E\x02\u1671\x02\u1681\x02\u1683\x02\u169C\x02" + - "\u16A2\x02\u16EC\x02\u16F0\x02\u16FA\x02\u1702\x02\u170E\x02\u1710\x02" + - "\u1716\x02\u1722\x02\u1736\x02\u1742\x02\u1755\x02\u1762\x02\u176E\x02" + - "\u1770\x02\u1772\x02\u1774\x02\u1775\x02\u1782\x02\u17D5\x02\u17D9\x02" + - "\u17D9\x02\u17DE\x02\u17DF\x02\u17E2\x02\u17EB\x02\u180D\x02\u180F\x02" + - "\u1812\x02\u181B\x02\u1822\x02\u1879\x02\u1882\x02\u18AC\x02\u18B2\x02" + - "\u18F7\x02\u1902\x02\u1920\x02\u1922\x02\u192D\x02\u1932\x02\u193D\x02" + - "\u1948\x02\u196F\x02\u1972\x02\u1976\x02\u1982\x02\u19AD\x02\u19B2\x02" + - "\u19CB\x02\u19D2\x02\u19DC\x02\u1A02\x02\u1A1D\x02\u1A22\x02\u1A60\x02" + - "\u1A62\x02\u1A7E\x02\u1A81\x02\u1A8B\x02\u1A92\x02\u1A9B\x02\u1AA9\x02" + - "\u1AA9\x02\u1AB2\x02\u1ABF\x02\u1B02\x02\u1B4D\x02\u1B52\x02\u1B5B\x02" + - "\u1B6D\x02\u1B75\x02\u1B82\x02\u1BF5\x02\u1C02\x02\u1C39\x02\u1C42\x02" + - "\u1C4B\x02\u1C4F\x02\u1C7F\x02\u1C82\x02\u1C8A\x02\u1CD2\x02\u1CD4\x02" + - "\u1CD6\x02\u1CF8\x02\u1CFA\x02\u1CFB\x02\u1D02\x02\u1DF7\x02\u1DFD\x02" + - "\u1F17\x02\u1F1A\x02\u1F1F\x02\u1F22\x02\u1F47\x02\u1F4A\x02\u1F4F\x02" + - "\u1F52\x02\u1F59\x02\u1F5B\x02\u1F5B\x02\u1F5D\x02\u1F5D\x02\u1F5F\x02" + - "\u1F5F\x02\u1F61\x02\u1F7F\x02\u1F82\x02\u1FB6\x02\u1FB8\x02\u1FBE\x02" + - "\u1FC0\x02\u1FC0\x02\u1FC4\x02\u1FC6\x02\u1FC8\x02\u1FCE\x02\u1FD2\x02" + - "\u1FD5\x02\u1FD8\x02\u1FDD\x02\u1FE2\x02\u1FEE\x02\u1FF4\x02\u1FF6\x02" + - "\u1FF8\x02\u1FFE\x02\u2041\x02\u2042\x02\u2056\x02\u2056\x02\u2073\x02" + - "\u2073\x02\u2081\x02\u2081\x02\u2092\x02\u209E\x02\u20D2\x02\u20DE\x02" + - "\u20E3\x02\u20E3\x02\u20E7\x02\u20F2\x02\u2104\x02\u2104\x02\u2109\x02" + - "\u2109\x02\u210C\x02\u2115\x02\u2117\x02\u2117\x02\u211A\x02\u211F\x02" + - "\u2126\x02\u2126\x02\u2128\x02\u2128\x02\u212A\x02\u212A\x02\u212C\x02" + - "\u213B\x02\u213E\x02\u2141\x02\u2147\x02\u214B\x02\u2150\x02\u2150\x02" + - "\u2162\x02\u218A\x02\u2C02\x02\u2C30\x02\u2C32\x02\u2C60\x02\u2C62\x02" + - "\u2CE6\x02\u2CED\x02\u2CF5\x02\u2D02\x02\u2D27\x02\u2D29\x02\u2D29\x02" + - "\u2D2F\x02\u2D2F\x02\u2D32\x02\u2D69\x02\u2D71\x02\u2D71\x02\u2D81\x02" + + "\u0ABB\x02\u0ABF\x02\u0ABF\x02\u0AD2\x02\u0AD2\x02\u0AE2\x02\u0AE3\x02" + + "\u0AFB\x02\u0AFB\x02\u0B07\x02\u0B0E\x02\u0B11\x02\u0B12\x02\u0B15\x02" + + "\u0B2A\x02\u0B2C\x02\u0B32\x02\u0B34\x02\u0B35\x02\u0B37\x02\u0B3B\x02" + + "\u0B3F\x02\u0B3F\x02\u0B5E\x02\u0B5F\x02\u0B61\x02\u0B63\x02\u0B73\x02" + + "\u0B73\x02\u0B85\x02\u0B85\x02\u0B87\x02\u0B8C\x02\u0B90\x02\u0B92\x02" + + "\u0B94\x02\u0B97\x02\u0B9B\x02\u0B9C\x02\u0B9E\x02\u0B9E\x02\u0BA0\x02" + + "\u0BA1\x02\u0BA5\x02\u0BA6\x02\u0BAA\x02\u0BAC\x02\u0BB0\x02\u0BBB\x02" + + "\u0BD2\x02\u0BD2\x02\u0C07\x02\u0C0E\x02\u0C10\x02\u0C12\x02\u0C14\x02" + + "\u0C2A\x02\u0C2C\x02\u0C3B\x02\u0C3F\x02\u0C3F\x02\u0C5A\x02\u0C5C\x02" + + "\u0C62\x02\u0C63\x02\u0C82\x02\u0C82\x02\u0C87\x02\u0C8E\x02\u0C90\x02" + + "\u0C92\x02\u0C94\x02\u0CAA\x02\u0CAC\x02\u0CB5\x02\u0CB7\x02\u0CBB\x02" + + "\u0CBF\x02\u0CBF\x02\u0CE0\x02\u0CE0\x02\u0CE2\x02\u0CE3\x02\u0CF3\x02" + + "\u0CF4\x02\u0D07\x02\u0D0E\x02\u0D10\x02\u0D12\x02\u0D14\x02\u0D3C\x02" + + "\u0D3F\x02\u0D3F\x02\u0D50\x02\u0D50\x02\u0D56\x02\u0D58\x02\u0D61\x02" + + "\u0D63\x02\u0D7C\x02\u0D81\x02\u0D87\x02\u0D98\x02\u0D9C\x02\u0DB3\x02" + + "\u0DB5\x02\u0DBD\x02\u0DBF\x02\u0DBF\x02\u0DC2\x02\u0DC8\x02\u0E03\x02" + + "\u0E32\x02\u0E34\x02\u0E35\x02\u0E42\x02\u0E48\x02\u0E83\x02\u0E84\x02" + + "\u0E86\x02\u0E86\x02\u0E89\x02\u0E8A\x02\u0E8C\x02\u0E8C\x02\u0E8F\x02" + + "\u0E8F\x02\u0E96\x02\u0E99\x02\u0E9B\x02\u0EA1\x02\u0EA3\x02\u0EA5\x02" + + "\u0EA7\x02\u0EA7\x02\u0EA9\x02\u0EA9\x02\u0EAC\x02\u0EAD\x02\u0EAF\x02" + + "\u0EB2\x02\u0EB4\x02\u0EB5\x02\u0EBF\x02\u0EBF\x02\u0EC2\x02\u0EC6\x02" + + "\u0EC8\x02\u0EC8\x02\u0EDE\x02\u0EE1\x02\u0F02\x02\u0F02\x02\u0F42\x02" + + "\u0F49\x02\u0F4B\x02\u0F6E\x02\u0F8A\x02\u0F8E\x02\u1002\x02\u102C\x02" + + "\u1041\x02\u1041\x02\u1052\x02\u1057\x02\u105C\x02\u105F\x02\u1063\x02" + + "\u1063\x02\u1067\x02\u1068\x02\u1070\x02\u1072\x02\u1077\x02\u1083\x02" + + "\u1090\x02\u1090\x02\u10A2\x02\u10C7\x02\u10C9\x02\u10C9\x02\u10CF\x02" + + "\u10CF\x02\u10D2\x02\u10FC\x02\u10FE\x02\u124A\x02\u124C\x02\u124F\x02" + + "\u1252\x02\u1258\x02\u125A\x02\u125A\x02\u125C\x02\u125F\x02\u1262\x02" + + "\u128A\x02\u128C\x02\u128F\x02\u1292\x02\u12B2\x02\u12B4\x02\u12B7\x02" + + "\u12BA\x02\u12C0\x02\u12C2\x02\u12C2\x02\u12C4\x02\u12C7\x02\u12CA\x02" + + "\u12D8\x02\u12DA\x02\u1312\x02\u1314\x02\u1317\x02\u131A\x02\u135C\x02" + + "\u1382\x02\u1391\x02\u13A2\x02\u13F7\x02\u13FA\x02\u13FF\x02\u1403\x02" + + "\u166E\x02\u1671\x02\u1681\x02\u1683\x02\u169C\x02\u16A2\x02\u16EC\x02" + + "\u16F0\x02\u16FA\x02\u1702\x02\u170E\x02\u1710\x02\u1713\x02\u1722\x02" + + "\u1733\x02\u1742\x02\u1753\x02\u1762\x02\u176E\x02\u1770\x02\u1772\x02" + + "\u1782\x02\u17B5\x02\u17D9\x02\u17D9\x02\u17DE\x02\u17DE\x02\u1822\x02" + + "\u1879\x02\u1882\x02\u18AA\x02\u18AC\x02\u18AC\x02\u18B2\x02\u18F7\x02" + + "\u1902\x02\u1920\x02\u1952\x02\u196F\x02\u1972\x02\u1976\x02\u1982\x02" + + "\u19AD\x02\u19B2\x02\u19CB\x02\u1A02\x02\u1A18\x02\u1A22\x02\u1A56\x02" + + "\u1AA9\x02\u1AA9\x02\u1B07\x02\u1B35\x02\u1B47\x02\u1B4D\x02\u1B85\x02" + + "\u1BA2\x02\u1BB0\x02\u1BB1\x02\u1BBC\x02\u1BE7\x02\u1C02\x02\u1C25\x02" + + "\u1C4F\x02\u1C51\x02\u1C5C\x02\u1C7F\x02\u1C82\x02\u1C8A\x02\u1CEB\x02" + + "\u1CEE\x02\u1CF0\x02\u1CF3\x02\u1CF7\x02\u1CF8\x02\u1D02\x02\u1DC1\x02" + + "\u1E02\x02\u1F17\x02\u1F1A\x02\u1F1F\x02\u1F22\x02\u1F47\x02\u1F4A\x02" + + "\u1F4F\x02\u1F52\x02\u1F59\x02\u1F5B\x02\u1F5B\x02\u1F5D\x02\u1F5D\x02" + + "\u1F5F\x02\u1F5F\x02\u1F61\x02\u1F7F\x02\u1F82\x02\u1FB6\x02\u1FB8\x02" + + "\u1FBE\x02\u1FC0\x02\u1FC0\x02\u1FC4\x02\u1FC6\x02\u1FC8\x02\u1FCE\x02" + + "\u1FD2\x02\u1FD5\x02\u1FD8\x02\u1FDD\x02\u1FE2\x02\u1FEE\x02\u1FF4\x02" + + "\u1FF6\x02\u1FF8\x02\u1FFE\x02\u2073\x02\u2073\x02\u2081\x02\u2081\x02" + + "\u2092\x02\u209E\x02\u2104\x02\u2104\x02\u2109\x02\u2109\x02\u210C\x02" + + "\u2115\x02\u2117\x02\u2117\x02\u211A\x02\u211F\x02\u2126\x02\u2126\x02" + + "\u2128\x02\u2128\x02\u212A\x02\u212A\x02\u212C\x02\u213B\x02\u213E\x02" + + "\u2141\x02\u2147\x02\u214B\x02\u2150\x02\u2150\x02\u2162\x02\u218A\x02" + + "\u2C02\x02\u2C30\x02\u2C32\x02\u2C60\x02\u2C62\x02\u2CE6\x02\u2CED\x02" + + "\u2CF0\x02\u2CF4\x02\u2CF5\x02\u2D02\x02\u2D27\x02\u2D29\x02\u2D29\x02" + + "\u2D2F\x02\u2D2F\x02\u2D32\x02\u2D69\x02\u2D71\x02\u2D71\x02\u2D82\x02" + "\u2D98\x02\u2DA2\x02\u2DA8\x02\u2DAA\x02\u2DB0\x02\u2DB2\x02\u2DB8\x02" + "\u2DBA\x02\u2DC0\x02\u2DC2\x02\u2DC8\x02\u2DCA\x02\u2DD0\x02\u2DD2\x02" + - "\u2DD8\x02\u2DDA\x02\u2DE0\x02\u2DE2\x02\u2E01\x02\u3007\x02\u3009\x02" + - "\u3023\x02\u3031\x02\u3033\x02\u3037\x02\u303A\x02\u303E\x02\u3043\x02" + - "\u3098\x02\u309B\x02\u30A1\x02\u30A3\x02\u30FC\x02\u30FE\x02\u3101\x02" + - "\u3107\x02\u312F\x02\u3133\x02\u3190\x02\u31A2\x02\u31BC\x02\u31F2\x02" + - "\u3201\x02\u3402\x02\u4DB7\x02\u4E02\x02\u9FD7\x02\uA002\x02\uA48E\x02" + - "\uA4D2\x02\uA4FF\x02\uA502\x02\uA60E\x02\uA612\x02\uA62D\x02\uA642\x02" + - "\uA671\x02\uA676\x02\uA67F\x02\uA681\x02\uA6F3\x02\uA719\x02\uA721\x02" + + "\u2DD8\x02\u2DDA\x02\u2DE0\x02\u3007\x02\u3009\x02\u3023\x02\u302B\x02" + + "\u3033\x02\u3037\x02\u303A\x02\u303E\x02\u3043\x02\u3098\x02\u309D\x02" + + "\u30A1\x02\u30A3\x02\u30FC\x02\u30FE\x02\u3101\x02\u3107\x02\u312F\x02" + + "\u3133\x02\u3190\x02\u31A2\x02\u31BC\x02\u31F2\x02\u3201\x02\u3402\x02" + + "\u4DB7\x02\u4E02\x02\u9FD7\x02\uA002\x02\uA48E\x02\uA4D2\x02\uA4FF\x02" + + "\uA502\x02\uA60E\x02\uA612\x02\uA621\x02\uA62C\x02\uA62D\x02\uA642\x02" + + "\uA670\x02\uA681\x02\uA69F\x02\uA6A2\x02\uA6F1\x02\uA719\x02\uA721\x02" + "\uA724\x02\uA78A\x02\uA78D\x02\uA7B0\x02\uA7B2\x02\uA7B9\x02\uA7F9\x02" + - "\uA829\x02\uA842\x02\uA875\x02\uA882\x02\uA8C7\x02\uA8D2\x02\uA8DB\x02" + - "\uA8E2\x02\uA8F9\x02\uA8FD\x02\uA8FD\x02\uA8FF\x02\uA8FF\x02\uA902\x02" + - "\uA92F\x02\uA932\x02\uA955\x02\uA962\x02\uA97E\x02\uA982\x02\uA9C2\x02" + - "\uA9D1\x02\uA9DB\x02\uA9E2\x02\uAA00\x02\uAA02\x02\uAA38\x02\uAA42\x02" + - "\uAA4F\x02\uAA52\x02\uAA5B\x02\uAA62\x02\uAA78\x02\uAA7C\x02\uAAC4\x02" + - "\uAADD\x02\uAADF\x02\uAAE2\x02\uAAF1\x02\uAAF4\x02\uAAF8\x02\uAB03\x02" + - "\uAB08\x02\uAB0B\x02\uAB10\x02\uAB13\x02\uAB18\x02\uAB22\x02\uAB28\x02" + - "\uAB2A\x02\uAB30\x02\uAB32\x02\uAB5C\x02\uAB5E\x02\uAB67\x02\uAB72\x02" + - "\uABEC\x02\uABEE\x02\uABEF\x02\uABF2\x02\uABFB\x02\uAC02\x02\uD7A5\x02" + - "\uD7B2\x02\uD7C8\x02\uD7CD\x02\uD7FD\x02\uF902\x02\uFA6F\x02\uFA72\x02" + - "\uFADB\x02\uFB02\x02\uFB08\x02\uFB15\x02\uFB19\x02\uFB1F\x02\uFB2A\x02" + - "\uFB2C\x02\uFB38\x02\uFB3A\x02\uFB3E\x02\uFB40\x02\uFB40\x02\uFB42\x02" + - "\uFB43\x02\uFB45\x02\uFB46\x02\uFB48\x02\uFBB3\x02\uFBD5\x02\uFD3F\x02" + - "\uFD52\x02\uFD91\x02\uFD94\x02\uFDC9\x02\uFDF2\x02\uFDFD\x02\uFE02\x02" + - "\uFE11\x02\uFE22\x02\uFE31\x02\uFE35\x02\uFE36\x02\uFE4F\x02\uFE51\x02" + - "\uFE72\x02\uFE76\x02\uFE78\x02\uFEFE\x02\uFF12\x02\uFF1B\x02\uFF23\x02" + - "\uFF3C\x02\uFF41\x02\uFF41\x02\uFF43\x02\uFF5C\x02\uFF68\x02\uFFC0\x02" + - "\uFFC4\x02\uFFC9\x02\uFFCC\x02\uFFD1\x02\uFFD4\x02\uFFD9\x02\uFFDC\x02" + - "\uFFDE\x02\x02\x03\r\x03\x0F\x03(\x03*\x03<\x03>\x03?\x03A\x03O\x03R\x03" + - "_\x03\x82\x03\xFC\x03\u0142\x03\u0176\x03\u01FF\x03\u01FF\x03\u0282\x03" + - "\u029E\x03\u02A2\x03\u02D2\x03\u02E2\x03\u02E2\x03\u0302\x03\u0321\x03" + - "\u0332\x03\u034C\x03\u0352\x03\u037C\x03\u0382\x03\u039F\x03\u03A2\x03" + - "\u03C5\x03\u03CA\x03\u03D1\x03\u03D3\x03\u03D7\x03\u0402\x03\u049F\x03" + - "\u04A2\x03\u04AB\x03\u04B2\x03\u04D5\x03\u04DA\x03\u04FD\x03\u0502\x03" + + "\uA803\x02\uA805\x02\uA807\x02\uA809\x02\uA80C\x02\uA80E\x02\uA824\x02" + + "\uA842\x02\uA875\x02\uA884\x02\uA8B5\x02\uA8F4\x02\uA8F9\x02\uA8FD\x02" + + "\uA8FD\x02\uA8FF\x02\uA8FF\x02\uA90C\x02\uA927\x02\uA932\x02\uA948\x02" + + "\uA962\x02\uA97E\x02\uA986\x02\uA9B4\x02\uA9D1\x02\uA9D1\x02\uA9E2\x02" + + "\uA9E6\x02\uA9E8\x02\uA9F1\x02\uA9FC\x02\uAA00\x02\uAA02\x02\uAA2A\x02" + + "\uAA42\x02\uAA44\x02\uAA46\x02\uAA4D\x02\uAA62\x02\uAA78\x02\uAA7C\x02" + + "\uAA7C\x02\uAA80\x02\uAAB1\x02\uAAB3\x02\uAAB3\x02\uAAB7\x02\uAAB8\x02" + + "\uAABB\x02\uAABF\x02\uAAC2\x02\uAAC2\x02\uAAC4\x02\uAAC4\x02\uAADD\x02" + + "\uAADF\x02\uAAE2\x02\uAAEC\x02\uAAF4\x02\uAAF6\x02\uAB03\x02\uAB08\x02" + + "\uAB0B\x02\uAB10\x02\uAB13\x02\uAB18\x02\uAB22\x02\uAB28\x02\uAB2A\x02" + + "\uAB30\x02\uAB32\x02\uAB5C\x02\uAB5E\x02\uAB67\x02\uAB72\x02\uABE4\x02" + + "\uAC02\x02\uD7A5\x02\uD7B2\x02\uD7C8\x02\uD7CD\x02\uD7FD\x02\uF902\x02" + + "\uFA6F\x02\uFA72\x02\uFADB\x02\uFB02\x02\uFB08\x02\uFB15\x02\uFB19\x02" + + "\uFB1F\x02\uFB1F\x02\uFB21\x02\uFB2A\x02\uFB2C\x02\uFB38\x02\uFB3A\x02" + + "\uFB3E\x02\uFB40\x02\uFB40\x02\uFB42\x02\uFB43\x02\uFB45\x02\uFB46\x02" + + "\uFB48\x02\uFBB3\x02\uFBD5\x02\uFD3F\x02\uFD52\x02\uFD91\x02\uFD94\x02" + + "\uFDC9\x02\uFDF2\x02\uFDFD\x02\uFE72\x02\uFE76\x02\uFE78\x02\uFEFE\x02" + + "\uFF23\x02\uFF3C\x02\uFF43\x02\uFF5C\x02\uFF68\x02\uFFC0\x02\uFFC4\x02" + + "\uFFC9\x02\uFFCC\x02\uFFD1\x02\uFFD4\x02\uFFD9\x02\uFFDC\x02\uFFDE\x02" + + "\x02\x03\r\x03\x0F\x03(\x03*\x03<\x03>\x03?\x03A\x03O\x03R\x03_\x03\x82" + + "\x03\xFC\x03\u0142\x03\u0176\x03\u0282\x03\u029E\x03\u02A2\x03\u02D2\x03" + + "\u0302\x03\u0321\x03\u0332\x03\u034C\x03\u0352\x03\u0377\x03\u0382\x03" + + "\u039F\x03\u03A2\x03\u03C5\x03\u03CA\x03\u03D1\x03\u03D3\x03\u03D7\x03" + + "\u0402\x03\u049F\x03\u04B2\x03\u04D5\x03\u04DA\x03\u04FD\x03\u0502\x03" + "\u0529\x03\u0532\x03\u0565\x03\u0602\x03\u0738\x03\u0742\x03\u0757\x03" + "\u0762\x03\u0769\x03\u0802\x03\u0807\x03\u080A\x03\u080A\x03\u080C\x03" + "\u0837\x03\u0839\x03\u083A\x03\u083E\x03\u083E\x03\u0841\x03\u0857\x03" + "\u0862\x03\u0878\x03\u0882\x03\u08A0\x03\u08E2\x03\u08F4\x03\u08F6\x03" + "\u08F7\x03\u0902\x03\u0917\x03\u0922\x03\u093B\x03\u0982\x03\u09B9\x03" + - "\u09C0\x03\u09C1\x03\u0A02\x03\u0A05\x03\u0A07\x03\u0A08\x03\u0A0E\x03" + - "\u0A15\x03\u0A17\x03\u0A19\x03\u0A1B\x03\u0A35\x03\u0A3A\x03\u0A3C\x03" + - "\u0A41\x03\u0A41\x03\u0A62\x03\u0A7E\x03\u0A82\x03\u0A9E\x03\u0AC2\x03" + - "\u0AC9\x03\u0ACB\x03\u0AE8\x03\u0B02\x03\u0B37\x03\u0B42\x03\u0B57\x03" + - "\u0B62\x03\u0B74\x03\u0B82\x03\u0B93\x03\u0C02\x03\u0C4A\x03\u0C82\x03" + - "\u0CB4\x03\u0CC2\x03\u0CF4\x03\u1002\x03\u1048\x03\u1068\x03\u1071\x03" + - "\u1081\x03\u10BC\x03\u10D2\x03\u10EA\x03\u10F2\x03\u10FB\x03\u1102\x03" + - "\u1136\x03\u1138\x03\u1141\x03\u1152\x03\u1175\x03\u1178\x03\u1178\x03" + - "\u1182\x03\u11C6\x03\u11CC\x03\u11CE\x03\u11D2\x03\u11DC\x03\u11DE\x03" + - "\u11DE\x03\u1202\x03\u1213\x03\u1215\x03\u1239\x03\u1240\x03\u1240\x03" + + "\u09C0\x03\u09C1\x03\u0A02\x03\u0A02\x03\u0A12\x03\u0A15\x03\u0A17\x03" + + "\u0A19\x03\u0A1B\x03\u0A35\x03\u0A62\x03\u0A7E\x03\u0A82\x03\u0A9E\x03" + + "\u0AC2\x03\u0AC9\x03\u0ACB\x03\u0AE6\x03\u0B02\x03\u0B37\x03\u0B42\x03" + + "\u0B57\x03\u0B62\x03\u0B74\x03\u0B82\x03\u0B93\x03\u0C02\x03\u0C4A\x03" + + "\u0C82\x03\u0CB4\x03\u0CC2\x03\u0CF4\x03\u1005\x03\u1039\x03\u1085\x03" + + "\u10B1\x03\u10D2\x03\u10EA\x03\u1105\x03\u1128\x03\u1152\x03\u1174\x03" + + "\u1178\x03\u1178\x03\u1185\x03\u11B4\x03\u11C3\x03\u11C6\x03\u11DC\x03" + + "\u11DC\x03\u11DE\x03\u11DE\x03\u1202\x03\u1213\x03\u1215\x03\u122D\x03" + "\u1282\x03\u1288\x03\u128A\x03\u128A\x03\u128C\x03\u128F\x03\u1291\x03" + - "\u129F\x03\u12A1\x03\u12AA\x03\u12B2\x03\u12EC\x03\u12F2\x03\u12FB\x03" + - "\u1302\x03\u1305\x03\u1307\x03\u130E\x03\u1311\x03\u1312\x03\u1315\x03" + - "\u132A\x03\u132C\x03\u1332\x03\u1334\x03\u1335\x03\u1337\x03\u133B\x03" + - "\u133E\x03\u1346\x03\u1349\x03\u134A\x03\u134D\x03\u134F\x03\u1352\x03" + - "\u1352\x03\u1359\x03\u1359\x03\u135F\x03\u1365\x03\u1368\x03\u136E\x03" + - "\u1372\x03\u1376\x03\u1402\x03\u144C\x03\u1452\x03\u145B\x03\u1482\x03" + - "\u14C7\x03\u14C9\x03\u14C9\x03\u14D2\x03\u14DB\x03\u1582\x03\u15B7\x03" + - "\u15BA\x03\u15C2\x03\u15DA\x03\u15DF\x03\u1602\x03\u1642\x03\u1646\x03" + - "\u1646\x03\u1652\x03\u165B\x03\u1682\x03\u16B9\x03\u16C2\x03\u16CB\x03" + - "\u1702\x03\u171B\x03\u171F\x03\u172D\x03\u1732\x03\u173B\x03\u18A2\x03" + - "\u18EB\x03\u1901\x03\u1901\x03\u1AC2\x03\u1AFA\x03\u1C02\x03\u1C0A\x03" + - "\u1C0C\x03\u1C38\x03\u1C3A\x03\u1C42\x03"; + "\u129F\x03\u12A1\x03\u12AA\x03\u12B2\x03\u12E0\x03\u1307\x03\u130E\x03" + + "\u1311\x03\u1312\x03\u1315\x03\u132A\x03\u132C\x03\u1332\x03\u1334\x03" + + "\u1335\x03\u1337\x03\u133B\x03\u133F\x03\u133F\x03\u1352\x03\u1352\x03" + + "\u135F\x03\u1363\x03\u1402\x03\u1436\x03\u1449\x03\u144C\x03\u1482\x03" + + "\u14B1\x03\u14C6\x03\u14C7\x03\u14C9\x03\u14C9\x03\u1582\x03\u15B0\x03" + + "\u15DA\x03\u15DD\x03\u1602\x03\u1631\x03\u1646\x03\u1646\x03\u1682\x03" + + "\u16AC\x03\u1702\x03\u171B\x03\u18A2\x03\u18E1\x03\u1901\x03\u1901\x03" + + "\u1AC2\x03\u1AFA\x03\u1C02\x03\u1C0A\x03\u1C0C\x03\u1C30\x03\u1C42\x03" + + "\u1C42\x03\u1C74\x03\u1C91\x03\u2002\x03\u239B\x03\u2402\x03\u2470\x03" + + "\u2482\x03\u2545\x03\u3002\x03\u3430\x03\u4402\x03\u4648\x03\u6802\x03" + + "\u6A3A\x03\u6A42\x03\u6A60\x03\u6AD2\x03\u6AEF\x03\u6B02\x03\u6B31\x03" + + "\u6B42\x03\u6B45\x03\u6B65\x03\u6B79\x03\u6B7F\x03\u6B91\x03\u6F02\x03" + + "\u6F46\x03\u6F52\x03\u6F52\x03\u6F95\x03\u6FA1\x03\u6FE2\x03\u6FE2\x03" + + "\u7002\x03\u87EE\x03\u8802\x03\u8AF4\x03\uB002\x03\uB003\x03\uBC02\x03" + + "\uBC6C\x03\uBC72\x03\uBC7E\x03\uBC82\x03\uBC8A\x03\uBC92\x03\uBC9B\x03" + + "\uD402\x03\uD456\x03\uD458\x03\uD49E\x03\uD4A0\x03\uD4A1\x03\uD4A4\x03" + + "\uD4A4\x03\uD4A7\x03\uD4A8\x03\uD4AB\x03\uD4AE\x03\uD4B0\x03\uD4BB\x03" + + "\uD4BD\x03\uD4BD\x03\uD4BF\x03\uD4C5\x03\uD4C7\x03\uD507\x03\uD509\x03" + + "\uD50C\x03\uD50F\x03\uD516\x03\uD518\x03\uD51E\x03\uD520\x03\uD53B\x03" + + "\uD53D\x03\uD540\x03\uD542\x03\uD546\x03\uD548\x03\uD548\x03\uD54C\x03" + + "\uD552\x03\uD554\x03\uD6A7\x03\uD6AA\x03\uD6C2\x03\uD6C4\x03\uD6DC\x03" + + "\uD6DE\x03\uD6FC\x03\uD6FE\x03\uD716\x03\uD718\x03\uD736\x03\uD738\x03" + + "\uD750\x03\uD752\x03\uD770\x03\uD772\x03\uD78A\x03\uD78C\x03\uD7AA\x03" + + "\uD7AC\x03\uD7C4\x03\uD7C6\x03\uD7CD\x03\uE802\x03\uE8C6\x03\uE902\x03" + + "\uE945\x03\uEE02\x03\uEE05\x03\uEE07\x03\uEE21\x03\uEE23\x03\uEE24\x03" + + "\uEE26\x03\uEE26\x03\uEE29\x03\uEE29\x03\uEE2B\x03\uEE34\x03\uEE36\x03" + + "\uEE39\x03\uEE3B\x03\uEE3B\x03\uEE3D\x03\uEE3D\x03\uEE44\x03\uEE44\x03" + + "\uEE49\x03\uEE49\x03\uEE4B\x03\uEE4B\x03\uEE4D\x03\uEE4D\x03\uEE4F\x03" + + "\uEE51\x03\uEE53\x03\uEE54\x03\uEE56\x03\uEE56\x03\uEE59\x03\uEE59\x03" + + "\uEE5B\x03\uEE5B\x03\uEE5D\x03\uEE5D\x03\uEE5F\x03\uEE5F\x03\uEE61\x03" + + "\uEE61\x03\uEE63\x03\uEE64\x03\uEE66\x03\uEE66\x03\uEE69\x03\uEE6C\x03" + + "\uEE6E\x03\uEE74\x03\uEE76\x03\uEE79\x03\uEE7B\x03\uEE7E\x03\uEE80\x03" + + "\uEE80\x03\uEE82\x03\uEE8B\x03\uEE8D\x03\uEE9D\x03\uEEA3\x03\uEEA5\x03" + + "\uEEA7\x03\uEEAB\x03\uEEAD\x03\uEEBD\x03\x02\x04\uA6D8\x04\uA702\x04\uB736" + + "\x04\uB742\x04\uB81F\x04\uB822\x04\uCEA3\x04\uF802\x04\uFA1F\x04\u02A7" + + "\x02&\x02&\x022\x02;\x02C\x02\\\x02a\x02a\x02c\x02|\x02\xAC\x02\xAC\x02" + + "\xB7\x02\xB7\x02\xB9\x02\xB9\x02\xBC\x02\xBC\x02\xC2\x02\xD8\x02\xDA\x02" + + "\xF8\x02\xFA\x02\u02C3\x02\u02C8\x02\u02D3\x02\u02E2\x02\u02E6\x02\u02EE" + + "\x02\u02EE\x02\u02F0\x02\u02F0\x02\u0302\x02\u0376\x02\u0378\x02\u0379" + + "\x02\u037C\x02\u037F\x02\u0381\x02\u0381\x02\u0388\x02\u038C\x02\u038E" + + "\x02\u038E\x02\u0390\x02\u03A3\x02\u03A5\x02\u03F7\x02\u03F9\x02\u0483" + + "\x02\u0485\x02\u0489\x02\u048C\x02\u0531\x02\u0533\x02\u0558\x02\u055B" + + "\x02\u055B\x02\u0563\x02\u0589\x02\u0593\x02\u05BF\x02\u05C1\x02\u05C1" + + "\x02\u05C3\x02\u05C4\x02\u05C6\x02\u05C7\x02\u05C9\x02\u05C9\x02\u05D2" + + "\x02\u05EC\x02\u05F2\x02\u05F4\x02\u0612\x02\u061C\x02\u0622\x02\u066B" + + "\x02\u0670\x02\u06D5\x02\u06D7\x02\u06DE\x02\u06E1\x02\u06EA\x02\u06EC" + + "\x02\u06FE\x02\u0701\x02\u0701\x02\u0712\x02\u074C\x02\u074F\x02\u07B3" + + "\x02\u07C2\x02\u07F7\x02\u07FC\x02\u07FC\x02\u0802\x02\u082F\x02\u0842" + + "\x02\u085D\x02\u08A2\x02\u08B6\x02\u08B8\x02\u08BF\x02\u08D6\x02\u08E3" + + "\x02\u08E5\x02\u0965\x02\u0968\x02\u0971\x02\u0973\x02\u0985\x02\u0987" + + "\x02\u098E\x02\u0991\x02\u0992\x02\u0995\x02\u09AA\x02\u09AC\x02\u09B2" + + "\x02\u09B4\x02\u09B4\x02\u09B8\x02\u09BB\x02\u09BE\x02\u09C6\x02\u09C9" + + "\x02\u09CA\x02\u09CD\x02\u09D0\x02\u09D9\x02\u09D9\x02\u09DE\x02\u09DF" + + "\x02\u09E1\x02\u09E5\x02\u09E8\x02\u09F3\x02\u0A03\x02\u0A05\x02\u0A07" + + "\x02\u0A0C\x02\u0A11\x02\u0A12\x02\u0A15\x02\u0A2A\x02\u0A2C\x02\u0A32" + + "\x02\u0A34\x02\u0A35\x02\u0A37\x02\u0A38\x02\u0A3A\x02\u0A3B\x02\u0A3E" + + "\x02\u0A3E\x02\u0A40\x02\u0A44\x02\u0A49\x02\u0A4A\x02\u0A4D\x02\u0A4F" + + "\x02\u0A53\x02\u0A53\x02\u0A5B\x02\u0A5E\x02\u0A60\x02\u0A60\x02\u0A68" + + "\x02\u0A77\x02\u0A83\x02\u0A85\x02\u0A87\x02\u0A8F\x02\u0A91\x02\u0A93" + + "\x02\u0A95\x02\u0AAA\x02\u0AAC\x02\u0AB2\x02\u0AB4\x02\u0AB5\x02\u0AB7" + + "\x02\u0ABB\x02\u0ABE\x02\u0AC7\x02\u0AC9\x02\u0ACB\x02\u0ACD\x02\u0ACF" + + "\x02\u0AD2\x02\u0AD2\x02\u0AE2\x02\u0AE5\x02\u0AE8\x02\u0AF1\x02\u0AFB" + + "\x02\u0AFB\x02\u0B03\x02\u0B05\x02\u0B07\x02\u0B0E\x02\u0B11\x02\u0B12" + + "\x02\u0B15\x02\u0B2A\x02\u0B2C\x02\u0B32\x02\u0B34\x02\u0B35\x02\u0B37" + + "\x02\u0B3B\x02\u0B3E\x02\u0B46\x02\u0B49\x02\u0B4A\x02\u0B4D\x02\u0B4F" + + "\x02\u0B58\x02\u0B59\x02\u0B5E\x02\u0B5F\x02\u0B61\x02\u0B65\x02\u0B68" + + "\x02\u0B71\x02\u0B73\x02\u0B73\x02\u0B84\x02\u0B85\x02\u0B87\x02\u0B8C" + + "\x02\u0B90\x02\u0B92\x02\u0B94\x02\u0B97\x02\u0B9B\x02\u0B9C\x02\u0B9E" + + "\x02\u0B9E\x02\u0BA0\x02\u0BA1\x02\u0BA5\x02\u0BA6\x02\u0BAA\x02\u0BAC" + + "\x02\u0BB0\x02\u0BBB\x02\u0BC0\x02\u0BC4\x02\u0BC8\x02\u0BCA\x02\u0BCC" + + "\x02\u0BCF\x02\u0BD2\x02\u0BD2\x02\u0BD9\x02\u0BD9\x02\u0BE8\x02\u0BF1" + + "\x02\u0C02\x02\u0C05\x02\u0C07\x02\u0C0E\x02\u0C10\x02\u0C12\x02\u0C14" + + "\x02\u0C2A\x02\u0C2C\x02\u0C3B\x02\u0C3F\x02\u0C46\x02\u0C48\x02\u0C4A" + + "\x02\u0C4C\x02\u0C4F\x02\u0C57\x02\u0C58\x02\u0C5A\x02\u0C5C\x02\u0C62" + + "\x02\u0C65\x02\u0C68\x02\u0C71\x02\u0C82\x02\u0C85\x02\u0C87\x02\u0C8E" + + "\x02\u0C90\x02\u0C92\x02\u0C94\x02\u0CAA\x02\u0CAC\x02\u0CB5\x02\u0CB7" + + "\x02\u0CBB\x02\u0CBE\x02\u0CC6\x02\u0CC8\x02\u0CCA\x02\u0CCC\x02\u0CCF" + + "\x02\u0CD7\x02\u0CD8\x02\u0CE0\x02\u0CE0\x02\u0CE2\x02\u0CE5\x02\u0CE8" + + "\x02\u0CF1\x02\u0CF3\x02\u0CF4\x02\u0D03\x02\u0D05\x02\u0D07\x02\u0D0E" + + "\x02\u0D10\x02\u0D12\x02\u0D14\x02\u0D3C\x02\u0D3F\x02\u0D46\x02\u0D48" + + "\x02\u0D4A\x02\u0D4C\x02\u0D50\x02\u0D56\x02\u0D59\x02\u0D61\x02\u0D65" + + "\x02\u0D68\x02\u0D71\x02\u0D7C\x02\u0D81\x02\u0D84\x02\u0D85\x02\u0D87" + + "\x02\u0D98\x02\u0D9C\x02\u0DB3\x02\u0DB5\x02\u0DBD\x02\u0DBF\x02\u0DBF" + + "\x02\u0DC2\x02\u0DC8\x02\u0DCC\x02\u0DCC\x02\u0DD1\x02\u0DD6\x02\u0DD8" + + "\x02\u0DD8\x02\u0DDA\x02\u0DE1\x02\u0DE8\x02\u0DF1\x02\u0DF4\x02\u0DF5" + + "\x02\u0E03\x02\u0E3C\x02\u0E42\x02\u0E50\x02\u0E52\x02\u0E5B\x02\u0E83" + + "\x02\u0E84\x02\u0E86\x02\u0E86\x02\u0E89\x02\u0E8A\x02\u0E8C\x02\u0E8C" + + "\x02\u0E8F\x02\u0E8F\x02\u0E96\x02\u0E99\x02\u0E9B\x02\u0EA1\x02\u0EA3" + + "\x02\u0EA5\x02\u0EA7\x02\u0EA7\x02\u0EA9\x02\u0EA9\x02\u0EAC\x02\u0EAD" + + "\x02\u0EAF\x02\u0EBB\x02\u0EBD\x02\u0EBF\x02\u0EC2\x02\u0EC6\x02\u0EC8" + + "\x02\u0EC8\x02\u0ECA\x02\u0ECF\x02\u0ED2\x02\u0EDB\x02\u0EDE\x02\u0EE1" + + "\x02\u0F02\x02\u0F02\x02\u0F1A\x02\u0F1B\x02\u0F22\x02\u0F2B\x02\u0F37" + + "\x02\u0F37\x02\u0F39\x02\u0F39\x02\u0F3B\x02\u0F3B\x02\u0F40\x02\u0F49" + + "\x02\u0F4B\x02\u0F6E\x02\u0F73\x02\u0F86\x02\u0F88\x02\u0F99\x02\u0F9B" + + "\x02\u0FBE\x02\u0FC8\x02\u0FC8\x02\u1002\x02\u104B\x02\u1052\x02\u109F" + + "\x02\u10A2\x02\u10C7\x02\u10C9\x02\u10C9\x02\u10CF\x02\u10CF\x02\u10D2" + + "\x02\u10FC\x02\u10FE\x02\u124A\x02\u124C\x02\u124F\x02\u1252\x02\u1258" + + "\x02\u125A\x02\u125A\x02\u125C\x02\u125F\x02\u1262\x02\u128A\x02\u128C" + + "\x02\u128F\x02\u1292\x02\u12B2\x02\u12B4\x02\u12B7\x02\u12BA\x02\u12C0" + + "\x02\u12C2\x02\u12C2\x02\u12C4\x02\u12C7\x02\u12CA\x02\u12D8\x02\u12DA" + + "\x02\u1312\x02\u1314\x02\u1317\x02\u131A\x02\u135C\x02\u135F\x02\u1361" + + "\x02\u136B\x02\u1373\x02\u1382\x02\u1391\x02\u13A2\x02\u13F7\x02\u13FA" + + "\x02\u13FF\x02\u1403\x02\u166E\x02\u1671\x02\u1681\x02\u1683\x02\u169C" + + "\x02\u16A2\x02\u16EC\x02\u16F0\x02\u16FA\x02\u1702\x02\u170E\x02\u1710" + + "\x02\u1716\x02\u1722\x02\u1736\x02\u1742\x02\u1755\x02\u1762\x02\u176E" + + "\x02\u1770\x02\u1772\x02\u1774\x02\u1775\x02\u1782\x02\u17D5\x02\u17D9" + + "\x02\u17D9\x02\u17DE\x02\u17DF\x02\u17E2\x02\u17EB\x02\u180D\x02\u180F" + + "\x02\u1812\x02\u181B\x02\u1822\x02\u1879\x02\u1882\x02\u18AC\x02\u18B2" + + "\x02\u18F7\x02\u1902\x02\u1920\x02\u1922\x02\u192D\x02\u1932\x02\u193D" + + "\x02\u1948\x02\u196F\x02\u1972\x02\u1976\x02\u1982\x02\u19AD\x02\u19B2" + + "\x02\u19CB\x02\u19D2\x02\u19DC\x02\u1A02\x02\u1A1D\x02\u1A22\x02\u1A60" + + "\x02\u1A62\x02\u1A7E\x02\u1A81\x02\u1A8B\x02\u1A92\x02\u1A9B\x02\u1AA9" + + "\x02\u1AA9\x02\u1AB2\x02\u1ABF\x02\u1B02\x02\u1B4D\x02\u1B52\x02\u1B5B" + + "\x02\u1B6D\x02\u1B75\x02\u1B82\x02\u1BF5\x02\u1C02\x02\u1C39\x02\u1C42" + + "\x02\u1C4B\x02\u1C4F\x02\u1C7F\x02\u1C82\x02\u1C8A\x02\u1CD2\x02\u1CD4" + + "\x02\u1CD6\x02\u1CF8\x02\u1CFA\x02\u1CFB\x02\u1D02\x02\u1DF7\x02\u1DFD" + + "\x02\u1F17\x02\u1F1A\x02\u1F1F\x02\u1F22\x02\u1F47\x02\u1F4A\x02\u1F4F" + + "\x02\u1F52\x02\u1F59\x02\u1F5B\x02\u1F5B\x02\u1F5D\x02\u1F5D\x02\u1F5F" + + "\x02\u1F5F\x02\u1F61\x02\u1F7F\x02\u1F82\x02\u1FB6\x02\u1FB8\x02\u1FBE" + + "\x02\u1FC0\x02\u1FC0\x02\u1FC4\x02\u1FC6\x02\u1FC8\x02\u1FCE\x02\u1FD2" + + "\x02\u1FD5\x02\u1FD8\x02\u1FDD\x02\u1FE2\x02\u1FEE\x02\u1FF4\x02\u1FF6" + + "\x02\u1FF8\x02\u1FFE\x02\u2041\x02\u2042\x02\u2056\x02\u2056\x02\u2073" + + "\x02\u2073\x02\u2081\x02\u2081\x02\u2092\x02\u209E\x02\u20D2\x02\u20DE" + + "\x02\u20E3\x02\u20E3\x02\u20E7\x02\u20F2\x02\u2104\x02\u2104\x02\u2109" + + "\x02\u2109\x02\u210C\x02\u2115\x02\u2117\x02\u2117\x02\u211A\x02\u211F" + + "\x02\u2126\x02\u2126\x02\u2128\x02\u2128\x02\u212A\x02\u212A\x02\u212C" + + "\x02\u213B\x02\u213E\x02\u2141\x02\u2147\x02\u214B\x02\u2150\x02\u2150" + + "\x02\u2162\x02\u218A\x02\u2C02\x02\u2C30\x02\u2C32\x02\u2C60\x02\u2C62" + + "\x02\u2CE6\x02\u2CED\x02\u2CF5\x02\u2D02\x02\u2D27\x02\u2D29\x02\u2D29" + + "\x02\u2D2F\x02\u2D2F\x02\u2D32\x02\u2D69\x02\u2D71\x02\u2D71\x02\u2D81" + + "\x02\u2D98\x02\u2DA2\x02\u2DA8\x02\u2DAA\x02\u2DB0\x02\u2DB2\x02\u2DB8" + + "\x02\u2DBA\x02\u2DC0\x02\u2DC2\x02\u2DC8\x02\u2DCA\x02\u2DD0\x02\u2DD2" + + "\x02\u2DD8\x02\u2DDA\x02\u2DE0\x02\u2DE2\x02\u2E01\x02\u3007\x02\u3009" + + "\x02\u3023\x02\u3031\x02\u3033\x02\u3037\x02\u303A\x02\u303E\x02\u3043" + + "\x02\u3098\x02\u309B\x02\u30A1\x02\u30A3\x02\u30FC\x02\u30FE\x02\u3101" + + "\x02\u3107\x02\u312F\x02\u3133\x02\u3190\x02\u31A2\x02\u31BC\x02\u31F2" + + "\x02\u3201\x02\u3402\x02\u4DB7\x02\u4E02\x02\u9FD7\x02\uA002\x02\uA48E" + + "\x02\uA4D2\x02\uA4FF\x02\uA502\x02\uA60E\x02\uA612\x02\uA62D\x02\uA642" + + "\x02\uA671\x02\uA676\x02\uA67F\x02\uA681\x02\uA6F3\x02\uA719\x02\uA721" + + "\x02\uA724\x02\uA78A\x02\uA78D\x02\uA7B0\x02\uA7B2\x02\uA7B9\x02\uA7F9" + + "\x02\uA829\x02\uA842\x02\uA875\x02\uA882\x02\uA8C7\x02\uA8D2\x02\uA8DB" + + "\x02\uA8E2\x02\uA8F9\x02\uA8FD\x02\uA8FD\x02\uA8FF\x02\uA8FF\x02\uA902" + + "\x02\uA92F\x02\uA932\x02\uA955\x02\uA962\x02\uA97E\x02\uA982\x02\uA9C2" + + "\x02\uA9D1\x02\uA9DB\x02\uA9E2\x02\uAA00\x02\uAA02\x02\uAA38\x02\uAA42" + + "\x02\uAA4F\x02\uAA52\x02\uAA5B\x02\uAA62\x02\uAA78\x02\uAA7C\x02\uAAC4" + + "\x02\uAADD\x02\uAADF\x02\uAAE2\x02\uAAF1\x02\uAAF4\x02\uAAF8\x02\uAB03" + + "\x02\uAB08\x02\uAB0B\x02\uAB10\x02\uAB13\x02\uAB18\x02\uAB22\x02\uAB28" + + "\x02\uAB2A\x02\uAB30\x02\uAB32\x02\uAB5C\x02\uAB5E\x02\uAB67\x02\uAB72" + + "\x02\uABEC\x02\uABEE\x02\uABEF\x02\uABF2\x02\uABFB\x02\uAC02\x02\uD7A5" + + "\x02\uD7B2\x02\uD7C8\x02\uD7CD\x02\uD7FD\x02\uF902\x02\uFA6F\x02\uFA72" + + "\x02\uFADB\x02\uFB02\x02\uFB08\x02\uFB15\x02\uFB19\x02\uFB1F\x02\uFB2A" + + "\x02\uFB2C\x02\uFB38\x02\uFB3A\x02\uFB3E\x02\uFB40\x02\uFB40\x02\uFB42" + + "\x02\uFB43\x02\uFB45\x02\uFB46\x02\uFB48\x02\uFBB3\x02\uFBD5\x02\uFD3F" + + "\x02\uFD52\x02\uFD91\x02\uFD94\x02\uFDC9\x02\uFDF2\x02\uFDFD\x02\uFE02" + + "\x02\uFE11\x02\uFE22\x02\uFE31\x02\uFE35\x02\uFE36\x02\uFE4F\x02\uFE51" + + "\x02\uFE72\x02\uFE76\x02\uFE78\x02\uFEFE\x02\uFF12\x02\uFF1B\x02\uFF23" + + "\x02\uFF3C\x02\uFF41\x02\uFF41\x02\uFF43\x02\uFF5C\x02\uFF68\x02\uFFC0" + + "\x02\uFFC4\x02\uFFC9\x02\uFFCC\x02\uFFD1\x02\uFFD4\x02\uFFD9\x02\uFFDC" + + "\x02\uFFDE\x02\x02\x03\r\x03\x0F\x03(\x03*\x03<\x03>\x03?\x03A\x03O\x03" + + "R\x03_\x03\x82\x03\xFC\x03\u0142\x03\u0176\x03\u01FF\x03\u01FF\x03\u0282" + + "\x03\u029E\x03\u02A2\x03\u02D2\x03\u02E2\x03\u02E2\x03\u0302\x03\u0321" + + "\x03\u0332\x03\u034C\x03\u0352\x03\u037C\x03\u0382\x03\u039F\x03\u03A2" + + "\x03\u03C5\x03\u03CA\x03\u03D1\x03\u03D3\x03\u03D7\x03\u0402\x03\u049F" + + "\x03\u04A2\x03\u04AB\x03\u04B2\x03\u04D5\x03\u04DA\x03\u04FD\x03\u0502" + + "\x03\u0529\x03\u0532\x03\u0565\x03\u0602\x03\u0738\x03\u0742\x03\u0757" + + "\x03\u0762\x03\u0769\x03\u0802\x03\u0807\x03\u080A\x03\u080A\x03\u080C" + + "\x03\u0837\x03\u0839\x03\u083A\x03\u083E\x03\u083E\x03\u0841\x03\u0857" + + "\x03\u0862\x03\u0878\x03\u0882\x03\u08A0\x03\u08E2\x03\u08F4\x03\u08F6" + + "\x03\u08F7\x03\u0902\x03\u0917\x03\u0922\x03\u093B\x03\u0982\x03\u09B9" + + "\x03\u09C0\x03\u09C1\x03\u0A02\x03\u0A05\x03\u0A07\x03\u0A08\x03\u0A0E" + + "\x03\u0A15\x03\u0A17\x03\u0A19\x03\u0A1B\x03\u0A35\x03\u0A3A\x03\u0A3C" + + "\x03\u0A41\x03\u0A41\x03\u0A62\x03\u0A7E\x03\u0A82\x03\u0A9E\x03\u0AC2" + + "\x03\u0AC9\x03\u0ACB\x03\u0AE8\x03\u0B02\x03\u0B37\x03\u0B42\x03\u0B57" + + "\x03\u0B62\x03\u0B74\x03\u0B82\x03\u0B93\x03\u0C02\x03\u0C4A\x03\u0C82" + + "\x03\u0CB4\x03\u0CC2\x03\u0CF4\x03\u1002\x03\u1048\x03\u1068\x03\u1071" + + "\x03\u1081\x03\u10BC\x03\u10D2\x03\u10EA\x03\u10F2\x03\u10FB\x03\u1102" + + "\x03\u1136\x03\u1138\x03\u1141\x03\u1152\x03\u1175\x03\u1178\x03\u1178" + + "\x03\u1182\x03\u11C6\x03\u11CC\x03\u11CE\x03\u11D2\x03\u11DC\x03\u11DE" + + "\x03\u11DE\x03\u1202\x03\u1213\x03\u1215\x03\u1239\x03\u1240\x03\u1240" + + "\x03\u1282\x03\u1288\x03\u128A\x03\u128A\x03\u128C\x03\u128F\x03\u1291" + + "\x03\u129F\x03\u12A1\x03\u12AA\x03\u12B2\x03\u12EC\x03\u12F2\x03\u12FB" + + "\x03\u1302\x03\u1305\x03\u1307\x03\u130E\x03\u1311\x03\u1312\x03\u1315" + + "\x03\u132A\x03\u132C\x03\u1332\x03\u1334\x03\u1335\x03\u1337\x03\u133B" + + "\x03\u133E\x03\u1346\x03\u1349\x03\u134A\x03\u134D\x03\u134F\x03\u1352" + + "\x03\u1352\x03\u1359\x03\u1359\x03\u135F\x03\u1365\x03\u1368\x03\u136E" + + "\x03\u1372\x03\u1376\x03\u1402\x03\u144C\x03\u1452\x03\u145B\x03\u1482" + + "\x03\u14C7\x03\u14C9\x03\u14C9\x03\u14D2\x03\u14DB\x03\u1582\x03\u15B7" + + "\x03\u15BA\x03\u15C2\x03\u15DA\x03\u15DF\x03\u1602\x03\u1642\x03\u1646" + + "\x03\u1646\x03\u1652\x03\u165B\x03\u1682\x03\u16B9\x03\u16C2\x03"; private static readonly _serializedATNSegment1: string = - "\u1C52\x03\u1C5B\x03\u1C74\x03\u1C91\x03\u1C94\x03\u1CA9\x03\u1CAB\x03" + - "\u1CB8\x03\u2002\x03\u239B\x03\u2402\x03\u2470\x03\u2482\x03\u2545\x03" + - "\u3002\x03\u3430\x03\u4402\x03\u4648\x03\u6802\x03\u6A3A\x03\u6A42\x03" + - "\u6A60\x03\u6A62\x03\u6A6B\x03\u6AD2\x03\u6AEF\x03\u6AF2\x03\u6AF6\x03" + - "\u6B02\x03\u6B38\x03\u6B42\x03\u6B45\x03\u6B52\x03\u6B5B\x03\u6B65\x03" + - "\u6B79\x03\u6B7F\x03\u6B91\x03\u6F02\x03\u6F46\x03\u6F52\x03\u6F80\x03" + - "\u6F91\x03\u6FA1\x03\u6FE2\x03\u6FE2\x03\u7002\x03\u87EE\x03\u8802\x03" + - "\u8AF4\x03\uB002\x03\uB003\x03\uBC02\x03\uBC6C\x03\uBC72\x03\uBC7E\x03" + - "\uBC82\x03\uBC8A\x03\uBC92\x03\uBC9B\x03\uBC9F\x03\uBCA0\x03\uD167\x03" + - "\uD16B\x03\uD16F\x03\uD174\x03\uD17D\x03\uD184\x03\uD187\x03\uD18D\x03" + - "\uD1AC\x03\uD1AF\x03\uD244\x03\uD246\x03\uD402\x03\uD456\x03\uD458\x03" + - "\uD49E\x03\uD4A0\x03\uD4A1\x03\uD4A4\x03\uD4A4\x03\uD4A7\x03\uD4A8\x03" + - "\uD4AB\x03\uD4AE\x03\uD4B0\x03\uD4BB\x03\uD4BD\x03\uD4BD\x03\uD4BF\x03" + - "\uD4C5\x03\uD4C7\x03\uD507\x03\uD509\x03\uD50C\x03\uD50F\x03\uD516\x03" + - "\uD518\x03\uD51E\x03\uD520\x03\uD53B\x03\uD53D\x03\uD540\x03\uD542\x03" + - "\uD546\x03\uD548\x03\uD548\x03\uD54C\x03\uD552\x03\uD554\x03\uD6A7\x03" + - "\uD6AA\x03\uD6C2\x03\uD6C4\x03\uD6DC\x03\uD6DE\x03\uD6FC\x03\uD6FE\x03" + - "\uD716\x03\uD718\x03\uD736\x03\uD738\x03\uD750\x03\uD752\x03\uD770\x03" + - "\uD772\x03\uD78A\x03\uD78C\x03\uD7AA\x03\uD7AC\x03\uD7C4\x03\uD7C6\x03" + - "\uD7CD\x03\uD7D0\x03\uD801\x03\uDA02\x03\uDA38\x03\uDA3D\x03\uDA6E\x03" + - "\uDA77\x03\uDA77\x03\uDA86\x03\uDA86\x03\uDA9D\x03\uDAA1\x03\uDAA3\x03" + - "\uDAB1\x03\uE002\x03\uE008\x03\uE00A\x03\uE01A\x03\uE01D\x03\uE023\x03" + - "\uE025\x03\uE026\x03\uE028\x03\uE02C\x03\uE802\x03\uE8C6\x03\uE8D2\x03" + - "\uE8D8\x03\uE902\x03\uE94C\x03\uE952\x03\uE95B\x03\uEE02\x03\uEE05\x03" + - "\uEE07\x03\uEE21\x03\uEE23\x03\uEE24\x03\uEE26\x03\uEE26\x03\uEE29\x03" + - "\uEE29\x03\uEE2B\x03\uEE34\x03\uEE36\x03\uEE39\x03\uEE3B\x03\uEE3B\x03" + - "\uEE3D\x03\uEE3D\x03\uEE44\x03\uEE44\x03\uEE49\x03\uEE49\x03\uEE4B\x03" + - "\uEE4B\x03\uEE4D\x03\uEE4D\x03\uEE4F\x03\uEE51\x03\uEE53\x03\uEE54\x03" + - "\uEE56\x03\uEE56\x03\uEE59\x03\uEE59\x03\uEE5B\x03\uEE5B\x03\uEE5D\x03" + - "\uEE5D\x03\uEE5F\x03\uEE5F\x03\uEE61\x03\uEE61\x03\uEE63\x03\uEE64\x03" + - "\uEE66\x03\uEE66\x03\uEE69\x03\uEE6C\x03\uEE6E\x03\uEE74\x03\uEE76\x03" + - "\uEE79\x03\uEE7B\x03\uEE7E\x03\uEE80\x03\uEE80\x03\uEE82\x03\uEE8B\x03" + - "\uEE8D\x03\uEE9D\x03\uEEA3\x03\uEEA5\x03\uEEA7\x03\uEEAB\x03\uEEAD\x03" + - "\uEEBD\x03\x02\x04\uA6D8\x04\uA702\x04\uB736\x04\uB742\x04\uB81F\x04\uB822" + - "\x04\uCEA3\x04\uF802\x04\uFA1F\x04\u0102\x10\u01F1\x10\xAF\x02\x03\x03" + - "\x02\x02\x02\x02\x05\x03\x02\x02\x02\x02\x07\x03\x02\x02\x02\x02\t\x03" + - "\x02\x02\x02\x02\v\x03\x02\x02\x02\x02\r\x03\x02\x02\x02\x02\x0F\x03\x02" + - "\x02\x02\x02\x11\x03\x02\x02\x02\x02\x13\x03\x02\x02\x02\x02\x15\x03\x02" + - "\x02\x02\x02\x17\x03\x02\x02\x02\x02\x1D\x03\x02\x02\x02\x02#\x03\x02" + - "\x02\x02\x02%\x03\x02\x02\x02\x02\'\x03\x02\x02\x02\x02)\x03\x02\x02\x02" + - "\x03+\x03\x02\x02\x02\x050\x03\x02\x02\x02\x076\x03\x02\x02\x02\t;\x03" + - "\x02\x02\x02\vE\x03\x02\x02\x02\rG\x03\x02\x02\x02\x0FI\x03\x02\x02\x02" + - "\x11K\x03\x02\x02\x02\x13M\x03\x02\x02\x02\x15O\x03\x02\x02\x02\x17Y\x03" + - "\x02\x02\x02\x19`\x03\x02\x02\x02\x1Bh\x03\x02\x02\x02\x1Dl\x03\x02\x02" + - "\x02\x1F\x82\x03\x02\x02\x02!\x84\x03\x02\x02\x02#\x8B\x03\x02\x02\x02" + - "%\x91\x03\x02\x02\x02\'\x98\x03\x02\x02\x02)\xA3\x03\x02\x02\x02+,\x07" + - "v\x02\x02,-\x07t\x02\x02-.\x07w\x02\x02./\x07g\x02\x02/\x04\x03\x02\x02" + - "\x0201\x07h\x02\x0212\x07c\x02\x0223\x07n\x02\x0234\x07u\x02\x0245\x07" + - "g\x02\x025\x06\x03\x02\x02\x0267\x07p\x02\x0278\x07w\x02\x0289\x07n\x02" + - "\x029:\x07n\x02\x02:\b\x03\x02\x02\x02;<\x07w\x02\x02<=\x07p\x02\x02=" + - ">\x07f\x02\x02>?\x07g\x02\x02?@\x07h\x02\x02@A\x07k\x02\x02AB\x07p\x02" + - "\x02BC\x07g\x02\x02CD\x07f\x02\x02D\n\x03\x02\x02\x02EF\x07.\x02\x02F" + - "\f\x03\x02\x02\x02GH\x07]\x02\x02H\x0E\x03\x02\x02\x02IJ\x07_\x02\x02" + - "J\x10\x03\x02\x02\x02KL\x07\x7F\x02\x02L\x12\x03\x02\x02\x02MN\x07}\x02" + - "\x02N\x14\x03\x02\x02\x02OP\x07<\x02\x02P\x16\x03\x02\x02\x02QR\x07$\x02" + - "\x02RS\x05\x19\r\x02ST\x07$\x02\x02TZ\x03\x02\x02\x02UV\x07)\x02\x02V" + - "W\x05\x1B\x0E\x02WX\x07)\x02\x02XZ\x03\x02\x02\x02YQ\x03\x02\x02\x02Y" + - "U\x03\x02\x02\x02Z\x18\x03\x02\x02\x02[\\\x07^\x02\x02\\_\x07$\x02\x02" + - "]_\n\x02\x02\x02^[\x03\x02\x02\x02^]\x03\x02\x02\x02_b\x03\x02\x02\x02" + - "`^\x03\x02\x02\x02`a\x03\x02\x02\x02a\x1A\x03\x02\x02\x02b`\x03\x02\x02" + - "\x02cd\x07^\x02\x02dg\x07)\x02\x02eg\n\x03\x02\x02fc\x03\x02\x02\x02f" + - "e\x03\x02\x02\x02gj\x03\x02\x02\x02hf\x03\x02\x02\x02hi\x03\x02\x02\x02" + - "i\x1C\x03\x02\x02\x02jh\x03\x02\x02\x02km\x07/\x02\x02lk\x03\x02\x02\x02" + - "lm\x03\x02\x02\x02mn\x03\x02\x02\x02nu\x05\x1F\x10\x02oq\x070\x02\x02" + - "pr\t\x04\x02\x02qp\x03\x02\x02\x02rs\x03\x02\x02\x02sq\x03\x02\x02\x02" + - "st\x03\x02\x02\x02tv\x03\x02\x02\x02uo\x03\x02\x02\x02uv\x03\x02\x02\x02" + - "vx\x03\x02\x02\x02wy\x05!\x11\x02xw\x03\x02\x02\x02xy\x03\x02\x02\x02" + - "y\x1E\x03\x02\x02\x02z\x83\x072\x02\x02{\x7F\t\x05\x02\x02|~\t\x04\x02" + - "\x02}|\x03\x02\x02\x02~\x81\x03\x02\x02\x02\x7F}\x03\x02\x02\x02\x7F\x80" + - "\x03\x02\x02\x02\x80\x83\x03\x02\x02\x02\x81\x7F\x03\x02\x02\x02\x82z" + - "\x03\x02\x02\x02\x82{\x03\x02\x02\x02\x83 \x03\x02\x02\x02\x84\x86\t\x06" + - "\x02\x02\x85\x87\t\x07\x02\x02\x86\x85\x03\x02\x02\x02\x86\x87\x03\x02" + - "\x02\x02\x87\x88\x03\x02\x02\x02\x88\x89\x05\x1F\x10\x02\x89\"\x03\x02" + - "\x02\x02\x8A\x8C\t\b\x02\x02\x8B\x8A\x03\x02\x02\x02\x8C\x8D\x03\x02\x02" + - "\x02\x8D\x8B\x03\x02\x02\x02\x8D\x8E\x03\x02\x02\x02\x8E\x8F\x03\x02\x02" + - "\x02\x8F\x90\b\x12\x02\x02\x90$\x03\x02\x02\x02\x91\x95\t\n\x02\x02\x92" + - "\x94\t\v\x02\x02\x93\x92\x03\x02\x02\x02\x94\x97\x03\x02\x02\x02\x95\x93" + - "\x03\x02\x02\x02\x95\x96\x03\x02\x02\x02\x96&\x03\x02\x02\x02\x97\x95" + - "\x03\x02\x02\x02\x98\x99\x071\x02\x02\x99\x9A\x071\x02\x02\x9A\x9E\x03" + - "\x02\x02\x02\x9B\x9D\n\t\x02\x02\x9C\x9B\x03\x02\x02\x02\x9D\xA0\x03\x02" + - "\x02\x02\x9E\x9C\x03\x02\x02\x02\x9E\x9F\x03\x02\x02\x02\x9F\xA1\x03\x02" + - "\x02\x02\xA0\x9E\x03\x02\x02\x02\xA1\xA2\b\x14\x03\x02\xA2(\x03\x02\x02" + - "\x02\xA3\xA4\v\x02\x02\x02\xA4*\x03\x02\x02\x02\x12\x02Y^`fhlsux\x7F\x82" + - "\x86\x8D\x95\x9E\x04\b\x02\x02\x02\x03\x02"; + "\u16CB\x03\u1702\x03\u171B\x03\u171F\x03\u172D\x03\u1732\x03\u173B\x03" + + "\u18A2\x03\u18EB\x03\u1901\x03\u1901\x03\u1AC2\x03\u1AFA\x03\u1C02\x03" + + "\u1C0A\x03\u1C0C\x03\u1C38\x03\u1C3A\x03\u1C42\x03\u1C52\x03\u1C5B\x03" + + "\u1C74\x03\u1C91\x03\u1C94\x03\u1CA9\x03\u1CAB\x03\u1CB8\x03\u2002\x03" + + "\u239B\x03\u2402\x03\u2470\x03\u2482\x03\u2545\x03\u3002\x03\u3430\x03" + + "\u4402\x03\u4648\x03\u6802\x03\u6A3A\x03\u6A42\x03\u6A60\x03\u6A62\x03" + + "\u6A6B\x03\u6AD2\x03\u6AEF\x03\u6AF2\x03\u6AF6\x03\u6B02\x03\u6B38\x03" + + "\u6B42\x03\u6B45\x03\u6B52\x03\u6B5B\x03\u6B65\x03\u6B79\x03\u6B7F\x03" + + "\u6B91\x03\u6F02\x03\u6F46\x03\u6F52\x03\u6F80\x03\u6F91\x03\u6FA1\x03" + + "\u6FE2\x03\u6FE2\x03\u7002\x03\u87EE\x03\u8802\x03\u8AF4\x03\uB002\x03" + + "\uB003\x03\uBC02\x03\uBC6C\x03\uBC72\x03\uBC7E\x03\uBC82\x03\uBC8A\x03" + + "\uBC92\x03\uBC9B\x03\uBC9F\x03\uBCA0\x03\uD167\x03\uD16B\x03\uD16F\x03" + + "\uD174\x03\uD17D\x03\uD184\x03\uD187\x03\uD18D\x03\uD1AC\x03\uD1AF\x03" + + "\uD244\x03\uD246\x03\uD402\x03\uD456\x03\uD458\x03\uD49E\x03\uD4A0\x03" + + "\uD4A1\x03\uD4A4\x03\uD4A4\x03\uD4A7\x03\uD4A8\x03\uD4AB\x03\uD4AE\x03" + + "\uD4B0\x03\uD4BB\x03\uD4BD\x03\uD4BD\x03\uD4BF\x03\uD4C5\x03\uD4C7\x03" + + "\uD507\x03\uD509\x03\uD50C\x03\uD50F\x03\uD516\x03\uD518\x03\uD51E\x03" + + "\uD520\x03\uD53B\x03\uD53D\x03\uD540\x03\uD542\x03\uD546\x03\uD548\x03" + + "\uD548\x03\uD54C\x03\uD552\x03\uD554\x03\uD6A7\x03\uD6AA\x03\uD6C2\x03" + + "\uD6C4\x03\uD6DC\x03\uD6DE\x03\uD6FC\x03\uD6FE\x03\uD716\x03\uD718\x03" + + "\uD736\x03\uD738\x03\uD750\x03\uD752\x03\uD770\x03\uD772\x03\uD78A\x03" + + "\uD78C\x03\uD7AA\x03\uD7AC\x03\uD7C4\x03\uD7C6\x03\uD7CD\x03\uD7D0\x03" + + "\uD801\x03\uDA02\x03\uDA38\x03\uDA3D\x03\uDA6E\x03\uDA77\x03\uDA77\x03" + + "\uDA86\x03\uDA86\x03\uDA9D\x03\uDAA1\x03\uDAA3\x03\uDAB1\x03\uE002\x03" + + "\uE008\x03\uE00A\x03\uE01A\x03\uE01D\x03\uE023\x03\uE025\x03\uE026\x03" + + "\uE028\x03\uE02C\x03\uE802\x03\uE8C6\x03\uE8D2\x03\uE8D8\x03\uE902\x03" + + "\uE94C\x03\uE952\x03\uE95B\x03\uEE02\x03\uEE05\x03\uEE07\x03\uEE21\x03" + + "\uEE23\x03\uEE24\x03\uEE26\x03\uEE26\x03\uEE29\x03\uEE29\x03\uEE2B\x03" + + "\uEE34\x03\uEE36\x03\uEE39\x03\uEE3B\x03\uEE3B\x03\uEE3D\x03\uEE3D\x03" + + "\uEE44\x03\uEE44\x03\uEE49\x03\uEE49\x03\uEE4B\x03\uEE4B\x03\uEE4D\x03" + + "\uEE4D\x03\uEE4F\x03\uEE51\x03\uEE53\x03\uEE54\x03\uEE56\x03\uEE56\x03" + + "\uEE59\x03\uEE59\x03\uEE5B\x03\uEE5B\x03\uEE5D\x03\uEE5D\x03\uEE5F\x03" + + "\uEE5F\x03\uEE61\x03\uEE61\x03\uEE63\x03\uEE64\x03\uEE66\x03\uEE66\x03" + + "\uEE69\x03\uEE6C\x03\uEE6E\x03\uEE74\x03\uEE76\x03\uEE79\x03\uEE7B\x03" + + "\uEE7E\x03\uEE80\x03\uEE80\x03\uEE82\x03\uEE8B\x03\uEE8D\x03\uEE9D\x03" + + "\uEEA3\x03\uEEA5\x03\uEEA7\x03\uEEAB\x03\uEEAD\x03\uEEBD\x03\x02\x04\uA6D8" + + "\x04\uA702\x04\uB736\x04\uB742\x04\uB81F\x04\uB822\x04\uCEA3\x04\uF802" + + "\x04\uFA1F\x04\u0102\x10\u01F1\x10\xC0\x02\x03\x03\x02\x02\x02\x02\x05" + + "\x03\x02\x02\x02\x02\x07\x03\x02\x02\x02\x02\t\x03\x02\x02\x02\x02\v\x03" + + "\x02\x02\x02\x02\r\x03\x02\x02\x02\x02\x0F\x03\x02\x02\x02\x02\x11\x03" + + "\x02\x02\x02\x02\x13\x03\x02\x02\x02\x02\x15\x03\x02\x02\x02\x02\x17\x03" + + "\x02\x02\x02\x02\x1D\x03\x02\x02\x02\x02#\x03\x02\x02\x02\x02%\x03\x02" + + "\x02\x02\x02\'\x03\x02\x02\x02\x02)\x03\x02\x02\x02\x02+\x03\x02\x02\x02" + + "\x03-\x03\x02\x02\x02\x052\x03\x02\x02\x02\x078\x03\x02\x02\x02\t=\x03" + + "\x02\x02\x02\vG\x03\x02\x02\x02\rI\x03\x02\x02\x02\x0FK\x03\x02\x02\x02" + + "\x11M\x03\x02\x02\x02\x13O\x03\x02\x02\x02\x15Q\x03\x02\x02\x02\x17[\x03" + + "\x02\x02\x02\x19b\x03\x02\x02\x02\x1Bj\x03\x02\x02\x02\x1Dn\x03\x02\x02" + + "\x02\x1F\x84\x03\x02\x02\x02!\x86\x03\x02\x02\x02#\x8D\x03\x02\x02\x02" + + "%\x93\x03\x02\x02\x02\'\x9A\x03\x02\x02\x02)\xA5\x03\x02\x02\x02+\xB3" + + "\x03\x02\x02\x02-.\x07v\x02\x02./\x07t\x02\x02/0\x07w\x02\x0201\x07g\x02" + + "\x021\x04\x03\x02\x02\x0223\x07h\x02\x0234\x07c\x02\x0245\x07n\x02\x02" + + "56\x07u\x02\x0267\x07g\x02\x027\x06\x03\x02\x02\x0289\x07p\x02\x029:\x07" + + "w\x02\x02:;\x07n\x02\x02;<\x07n\x02\x02<\b\x03\x02\x02\x02=>\x07w\x02" + + "\x02>?\x07p\x02\x02?@\x07f\x02\x02@A\x07g\x02\x02AB\x07h\x02\x02BC\x07" + + "k\x02\x02CD\x07p\x02\x02DE\x07g\x02\x02EF\x07f\x02\x02F\n\x03\x02\x02" + + "\x02GH\x07.\x02\x02H\f\x03\x02\x02\x02IJ\x07]\x02\x02J\x0E\x03\x02\x02" + + "\x02KL\x07_\x02\x02L\x10\x03\x02\x02\x02MN\x07\x7F\x02\x02N\x12\x03\x02" + + "\x02\x02OP\x07}\x02\x02P\x14\x03\x02\x02\x02QR\x07<\x02\x02R\x16\x03\x02" + + "\x02\x02ST\x07$\x02\x02TU\x05\x19\r\x02UV\x07$\x02\x02V\\\x03\x02\x02" + + "\x02WX\x07)\x02\x02XY\x05\x1B\x0E\x02YZ\x07)\x02\x02Z\\\x03\x02\x02\x02" + + "[S\x03\x02\x02\x02[W\x03\x02\x02\x02\\\x18\x03\x02\x02\x02]^\x07^\x02" + + "\x02^a\x07$\x02\x02_a\n\x02\x02\x02`]\x03\x02\x02\x02`_\x03\x02\x02\x02" + + "ad\x03\x02\x02\x02b`\x03\x02\x02\x02bc\x03\x02\x02\x02c\x1A\x03\x02\x02" + + "\x02db\x03\x02\x02\x02ef\x07^\x02\x02fi\x07)\x02\x02gi\n\x03\x02\x02h" + + "e\x03\x02\x02\x02hg\x03\x02\x02\x02il\x03\x02\x02\x02jh\x03\x02\x02\x02" + + "jk\x03\x02\x02\x02k\x1C\x03\x02\x02\x02lj\x03\x02\x02\x02mo\x07/\x02\x02" + + "nm\x03\x02\x02\x02no\x03\x02\x02\x02op\x03\x02\x02\x02pw\x05\x1F\x10\x02" + + "qs\x070\x02\x02rt\t\x04\x02\x02sr\x03\x02\x02\x02tu\x03\x02\x02\x02us" + + "\x03\x02\x02\x02uv\x03\x02\x02\x02vx\x03\x02\x02\x02wq\x03\x02\x02\x02" + + "wx\x03\x02\x02\x02xz\x03\x02\x02\x02y{\x05!\x11\x02zy\x03\x02\x02\x02" + + "z{\x03\x02\x02\x02{\x1E\x03\x02\x02\x02|\x85\x072\x02\x02}\x81\t\x05\x02" + + "\x02~\x80\t\x04\x02\x02\x7F~\x03\x02\x02\x02\x80\x83\x03\x02\x02\x02\x81" + + "\x7F\x03\x02\x02\x02\x81\x82\x03\x02\x02\x02\x82\x85\x03\x02\x02\x02\x83" + + "\x81\x03\x02\x02\x02\x84|\x03\x02\x02\x02\x84}\x03\x02\x02\x02\x85 \x03" + + "\x02\x02\x02\x86\x88\t\x06\x02\x02\x87\x89\t\x07\x02\x02\x88\x87\x03\x02" + + "\x02\x02\x88\x89\x03\x02\x02\x02\x89\x8A\x03\x02\x02\x02\x8A\x8B\x05\x1F" + + "\x10\x02\x8B\"\x03\x02\x02\x02\x8C\x8E\t\b\x02\x02\x8D\x8C\x03\x02\x02" + + "\x02\x8E\x8F\x03\x02\x02\x02\x8F\x8D\x03\x02\x02\x02\x8F\x90\x03\x02\x02" + + "\x02\x90\x91\x03\x02\x02\x02\x91\x92\b\x12\x02\x02\x92$\x03\x02\x02\x02" + + "\x93\x97\t\n\x02\x02\x94\x96\t\v\x02\x02\x95\x94\x03\x02\x02\x02\x96\x99" + + "\x03\x02\x02\x02\x97\x95\x03\x02\x02\x02\x97\x98\x03\x02\x02\x02\x98&" + + "\x03\x02\x02\x02\x99\x97\x03\x02\x02\x02\x9A\x9B\x071\x02\x02\x9B\x9C" + + "\x071\x02\x02\x9C\xA0\x03\x02\x02\x02\x9D\x9F\n\t\x02\x02\x9E\x9D\x03" + + "\x02\x02\x02\x9F\xA2\x03\x02\x02\x02\xA0\x9E\x03\x02\x02\x02\xA0\xA1\x03" + + "\x02\x02\x02\xA1\xA3\x03\x02\x02\x02\xA2\xA0\x03\x02\x02\x02\xA3\xA4\b" + + "\x14\x03\x02\xA4(\x03\x02\x02\x02\xA5\xA6\x071\x02\x02\xA6\xA7\x07,\x02" + + "\x02\xA7\xAB\x03\x02\x02\x02\xA8\xAA\v\x02\x02\x02\xA9\xA8\x03\x02\x02" + + "\x02\xAA\xAD\x03\x02\x02\x02\xAB\xAC\x03\x02\x02\x02\xAB\xA9\x03\x02\x02" + + "\x02\xAC\xAE\x03\x02\x02\x02\xAD\xAB\x03\x02\x02\x02\xAE\xAF\x07,\x02" + + "\x02\xAF\xB0\x071\x02\x02\xB0\xB1\x03\x02\x02\x02\xB1\xB2\b\x15\x03\x02" + + "\xB2*\x03\x02\x02\x02\xB3\xB4\v\x02\x02\x02\xB4,\x03\x02\x02\x02\x13\x02" + + "[`bhjnuwz\x81\x84\x88\x8F\x97\xA0\xAB\x04\b\x02\x02\x02\x03\x02"; public static readonly _serializedATN: string = Utils.join( [ JSONLexer._serializedATNSegment0, diff --git a/src/parser/generated/JSONParser.ts b/src/parser/generated/JSONParser.ts index 7e715d6..b0a6e5d 100644 --- a/src/parser/generated/JSONParser.ts +++ b/src/parser/generated/JSONParser.ts @@ -42,7 +42,8 @@ export class JSONParser extends Parser { public static readonly WS = 13; public static readonly IDENTIFIER = 14; public static readonly LINE_COMMENT = 15; - public static readonly ErrorCharacter = 16; + public static readonly BLOCK_COMMENT = 16; + public static readonly ErrorCharacter = 17; public static readonly RULE_json = 0; public static readonly RULE_value = 1; public static readonly RULE_obj = 2; @@ -60,7 +61,7 @@ export class JSONParser extends Parser { private static readonly _SYMBOLIC_NAMES: Array = [ undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, "CLOSING_CURLIES", "OPENING_CURLIES", "COLON", "STRING", "NUMBER", - "WS", "IDENTIFIER", "LINE_COMMENT", "ErrorCharacter", + "WS", "IDENTIFIER", "LINE_COMMENT", "BLOCK_COMMENT", "ErrorCharacter", ]; public static readonly VOCABULARY: Vocabulary = new VocabularyImpl(JSONParser._LITERAL_NAMES, JSONParser._SYMBOLIC_NAMES, []); @@ -389,7 +390,7 @@ export class JSONParser extends Parser { } public static readonly _serializedATN: string = - "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x03\x12B\x04\x02" + + "\x03\uC91D\uCABA\u058D\uAFBA\u4F53\u0607\uEA8B\uC241\x03\x13B\x04\x02" + "\t\x02\x04\x03\t\x03\x04\x04\t\x04\x04\x05\t\x05\x04\x06\t\x06\x03\x02" + "\x03\x02\x03\x02\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03\x03" + "\x03\x03\x05\x03\x18\n\x03\x03\x04\x03\x04\x03\x04\x03\x04\x07\x04\x1E" + diff --git a/src/parser/parseArray.ts b/src/parser/parseArray.ts index a52b4fe..4f6e2b0 100644 --- a/src/parser/parseArray.ts +++ b/src/parser/parseArray.ts @@ -10,14 +10,27 @@ export type Pair = [string, unknown]; export const contextSymbol = Symbol("context"); export const predecessorLineStopSymbol = Symbol("predecessorLineStop"); -export interface CommentInfo { + +export interface LineCommentInfo { + type: 'inline'; text: string; line: number; column: number; } -// The array needs to consist of one type to be sorted: -// So only object, string, numbers are supported array items. +export interface BlockCommentInfo { + type: 'block'; + text: string; + startLine: number; + startColumn: number; + endLine: number; + endColumn: number; +} + +export type CommentInfo = LineCommentInfo | BlockCommentInfo; + +// The array needs to consist of one type to be sorted: +// So only object, string, numbers are supported array items. // [null], [undefined] or [true, false] doesn't make any sense // eslint-disable-next-line @typescript-eslint/ban-types export type ArrayItem = (object | String | Number) & {[contextSymbol]: ValueContext & { [predecessorLineStopSymbol]: number}} @@ -171,17 +184,37 @@ export default function parseArray(text: string): ParseResult { } const comments: CommentInfo[] = tokenStream.getTokens().filter(token => - token.channel === Token.HIDDEN_CHANNEL && token.type === JSONLexer.LINE_COMMENT - ).map(token => ({ - text: typeof token.text !== 'undefined' ? token.text : "", - line: token.line, - column: token.charPositionInLine - })) + token.channel === Token.HIDDEN_CHANNEL && (token.type === JSONLexer.LINE_COMMENT || token.type === JSONLexer.BLOCK_COMMENT) + ).map(token => { + if (token.type === JSONLexer.LINE_COMMENT) { + return { + type: 'inline', + text: typeof token.text !== 'undefined' ? token.text : "", + line: token.line, + column: token.charPositionInLine + } as LineCommentInfo; + } else { // JSONLexer.BLOCK_COMMENT + const text = typeof token.text !== 'undefined' ? token.text : ""; + const lines = text.split(/\r?\n/); + const endLine = token.line + lines.length - 1; + const endColumn = lines.length === 1 ? token.charPositionInLine + text.length : lines[lines.length - 1].length; + return { + type: 'block', + text: text, + startLine: token.line, + startColumn: token.charPositionInLine, + endLine: endLine, + endColumn: endColumn + } as BlockCommentInfo; + } + }) .sort((a, b) => { - if (a.line === b.line) { - throw new Error(`Found two comments on the same line: ${a.text} and ${b.text} on line ${a.line}`); + const aLine = a.type === 'inline' ? a.line : a.startLine; + const bLine = b.type === 'inline' ? b.line : b.startLine; + if (aLine === bLine) { + throw new Error(`Found two comments on the same line: ${a.text} and ${b.text} on line ${aLine}`); } - return a.line - b.line + return aLine - bLine }); diff --git a/src/serializeArray.ts b/src/serializeArray.ts index 7e9fae8..ec5d31d 100644 --- a/src/serializeArray.ts +++ b/src/serializeArray.ts @@ -120,7 +120,7 @@ class ArraySerializer { } private addInlineComment(line: number): string { - const comments = this.consumeComments(c => c.line === line); + const comments = this.consumeComments(c => (c.type === 'inline' && c.line === line) || (c.type == 'block' && c.startLine == line && c.endLine == line)); if (comments.length > 1) { throw new Error(`Found two inline comments in line ${line}`); } @@ -133,7 +133,13 @@ class ArraySerializer { end: number, indentLevel: number ): string { - const comments = this.consumeComments((c) => (c.line > start && c.line < end)) + const comments = this.consumeComments((c) => { + if (c.type === 'inline') { + return c.line > start && c.line < end; + } else { // block comment + return c.startLine > start && c.endLine < end; + } + }) .map( c => `${c.text}`).map(c => this.makeIndent(indentLevel + 1) + c); if (comments.length > 0) { return comments.join("\n") + "\n"; diff --git a/src/test/suite/commentHandling.vsc-test.ts b/src/test/suite/commentHandling.vsc-test.ts index d0d1f44..0a7dab9 100644 --- a/src/test/suite/commentHandling.vsc-test.ts +++ b/src/test/suite/commentHandling.vsc-test.ts @@ -4,7 +4,6 @@ import * as vscode from "vscode"; import {closeActiveEditor, openNewDocument} from './textEditorUtils'; import { triggerSortExpectSuccess } from './triggerSortExpectSuccess'; -import { expect } from 'chai'; import { undent } from './undent'; import { expectErrorMessage, setupSpies } from './setupSpies'; diff --git a/src/test/suite/parser/parseArray.test.ts b/src/test/suite/parser/parseArray.test.ts index 38d3684..59282b6 100644 --- a/src/test/suite/parser/parseArray.test.ts +++ b/src/test/suite/parser/parseArray.test.ts @@ -99,8 +99,8 @@ suite('parseArray', function() { const result = parseArray(json); expect(result.items.length).to.equal(2); const expectedComments: Partial[] = [ - { text: '// comment1', line: 2, column: 7 }, - { text: '// comment2', line: 3, column: 6 } + { type: 'inline', text: '// comment1', line: 2, column: 7 }, + { type: 'inline', text: '// comment2', line: 3, column: 6 } ]; expect(result.comments).to.deep.members(expectedComments); }); @@ -110,8 +110,8 @@ suite('parseArray', function() { const result = parseArray(json); expect(result.items.length).to.equal(1); const expectedComments: Partial[] = [ - { text: '// commentA', line: 2, column: 12 }, - { text: '// commentB', line: 3, column: 11 } + { type: 'inline', text: '// commentA', line: 2, column: 12 }, + { type: 'inline', text: '// commentB', line: 3, column: 11 } ]; expect(result.comments).to.deep.members(expectedComments); }); @@ -121,8 +121,8 @@ suite('parseArray', function() { const result = parseArray(json); expect(result.items.length).to.equal(2); const expectedComments: Partial[] = [ - { text: '// comment1', line: 2, column: 2 }, - { text: '// comment2', line: 4, column: 2 } + { type: 'inline', text: '// comment1', line: 2, column: 2 }, + { type: 'inline', text: '// comment2', line: 4, column: 2 } ]; expect(result.comments).to.deep.members(expectedComments); }); @@ -132,8 +132,8 @@ suite('parseArray', function() { const result = parseArray(json); expect(result.items.length).to.equal(1); const expectedComments: Partial[] = [ - { text: '// commentA', line: 3, column: 4 }, - { text: '// commentB', line: 5, column: 4 } + { type: 'inline', text: '// commentA', line: 3, column: 4 }, + { type: 'inline', text: '// commentB', line: 5, column: 4 } ]; expect(result.comments).to.deep.members(expectedComments); }); @@ -143,8 +143,8 @@ suite('parseArray', function() { const result = parseArray(json); expect(result.items.length).to.equal(2); const expectedComments: Partial[] = [ - { text: '// comment after last 1', line: 4, column: 2 }, - { text: '// comment after last 2', line: 5, column: 2 } + { type: 'inline', text: '// comment after last 1', line: 4, column: 2 }, + { type: 'inline', text: '// comment after last 2', line: 5, column: 2 } ]; expect(result.comments).to.deep.members(expectedComments); }); @@ -165,12 +165,12 @@ suite('parseArray', function() { // Check properties of each comment const expectedComments: Partial[] = [ - { text: '// before1', line: 2, column: 2 }, - { text: '// inline1', line: 3, column: 7 }, - { text: '// before2', line: 4, column: 2 }, - { text: '// inline2', line: 5, column: 7 }, - { text: '// after last1', line: 6, column: 2 }, - { text: '// after last2', line: 7, column: 2 } + { type: 'inline', text: '// before1', line: 2, column: 2 }, + { type: 'inline', text: '// inline1', line: 3, column: 7 }, + { type: 'inline', text: '// before2', line: 4, column: 2 }, + { type: 'inline', text: '// inline2', line: 5, column: 7 }, + { type: 'inline', text: '// after last1', line: 6, column: 2 }, + { type: 'inline', text: '// after last2', line: 7, column: 2 } ]; expect(result.comments).to.deep.members(expectedComments); @@ -182,8 +182,8 @@ suite('parseArray', function() { const result = parseArray(json); expect(result.items.length).to.equal(2); const expectedComments: Partial[] = [ - { text: '/* comment1 */', line: 2, column: 7 }, - { text: '/* comment2 */', line: 3, column: 6 } + { type: 'block', text: '/* comment1 */', startLine: 2, startColumn: 7, endLine: 2, endColumn: 21 }, + { type: 'block', text: '/* comment2 */', startLine: 3, startColumn: 6, endLine: 3, endColumn: 20 } ]; expect(result.comments).to.deep.members(expectedComments); }); @@ -193,8 +193,8 @@ suite('parseArray', function() { const result = parseArray(json); expect(result.items.length).to.equal(2); const expectedComments: Partial[] = [ - { text: '/*\n * comment1\n */', line: 2, column: 2 }, - { text: '/* comment2 */', line: 6, column: 2 } + { type: 'block', text: '/*\n * comment1\n */', startLine: 2, startColumn: 2, endLine: 4, endColumn: 5 }, + { type: 'block', text: '/* comment2 */', startLine: 6, startColumn: 2, endLine: 6, endColumn: 16 } ]; expect(result.comments).to.deep.members(expectedComments); }); @@ -204,8 +204,8 @@ suite('parseArray', function() { const result = parseArray(json); expect(result.items.length).to.equal(2); const expectedComments: Partial[] = [ - { text: '/* comment after last 1 */', line: 4, column: 2 }, - { text: '/*\n * comment after last 2\n */', line: 5, column: 2 } + { type: 'block', text: '/* comment after last 1 */', startLine: 4, startColumn: 2, endLine: 4, endColumn: 28 }, + { type: 'block', text: '/*\n * comment after last 2\n */', startLine: 5, startColumn: 2, endLine: 7, endColumn: 5 } ]; expect(result.comments).to.deep.members(expectedComments); }); @@ -227,15 +227,42 @@ suite('parseArray', function() { expect(result.comments.length).to.equal(7); const expectedComments: Partial[] = [ - { text: '// before1', line: 2, column: 2 }, - { text: '/* multi-line\n * comment 1 */', line: 3, column: 2 }, - { text: '// inline1', line: 5, column: 7 }, - { text: '/* multi-line comment 2 */', line: 6, column: 2 }, - { text: '// inline2', line: 7, column: 7 }, - { text: '// after last1', line: 8, column: 2 }, - { text: '/* after last2 */', line: 9, column: 2 } + { type: 'inline', text: '// before1', line: 2, column: 2 }, + { type: 'block', text: '/* multi-line\n * comment 1 */', startLine: 3, startColumn: 2, endLine: 4, endColumn: 17 }, + { type: 'inline', text: '// inline1', line: 5, column: 7 }, + { type: 'block', text: '/* multi-line comment 2 */', startLine: 6, startColumn: 2, endLine: 6, endColumn: 28 }, + { type: 'inline', text: '// inline2', line: 7, column: 7 }, + { type: 'inline', text: '// after last1', line: 8, column: 2 }, + { type: 'block', text: '/* after last2 */', startLine: 9, startColumn: 2, endLine: 9, endColumn: 19 } ]; expect(result.comments).to.deep.members(expectedComments); }); + + test('should handle nested comments in various configurations and collect them all', function() { + const json = undent` + [ + // Line comment with /* block inside */ + /* Block with // line inside */ + "a", + // Line /* with block */ inside + // Line // with another line comment inside + /* Block with + // line inside */ + "b" + ]`; + const result = parseArray(json); + expect(result.items.length).to.equal(2); + expect(result.comments.length).to.equal(5); + + const expectedComments: Partial[] = [ + { type: 'inline', text: '// Line comment with /* block inside */', line: 2, column: 2 }, + { type: 'block', text: '/* Block with // line inside */', startLine: 3, startColumn: 2, endLine: 3, endColumn: 33 }, + { type: 'inline', text: '// Line /* with block */ inside', line: 5, column: 2 }, + { type: 'inline', text: '// Line // with another line comment inside', line: 6, column: 2 }, + { type: 'block', text: '/* Block with\n // line inside */', startLine: 7, startColumn: 2, endLine: 8, endColumn: 19 } + ]; + + expect(result.comments).to.deep.members(expectedComments); + }); }); diff --git a/src/test/suite/processAndParseArray.test.ts b/src/test/suite/processAndParseArray.test.ts index 9e2eefe..7e85234 100644 --- a/src/test/suite/processAndParseArray.test.ts +++ b/src/test/suite/processAndParseArray.test.ts @@ -1,9 +1,8 @@ import processAndParseArray from '../../processAndParseArray'; import chai = require('chai'); import {FileExtension} from '../../fileExtension'; -import { convertToLiteralValues, CommentInfo } from '../../parser/parseArray'; // Removed metadataSymbol, added CommentInfo +import { convertToLiteralValues } from '../../parser/parseArray'; // Removed metadataSymbol, added CommentInfo import {suite, test} from 'mocha'; -import { Token } from 'antlr4ts'; const expect = chai.expect; From b949942160776285de76f9d1f82199aa336bd5aa Mon Sep 17 00:00:00 2001 From: Frederik Claus Date: Fri, 3 Oct 2025 20:49:26 +0200 Subject: [PATCH 03/10] Adds better serialization for block comments --- src/parser/parseArray.ts | 2 +- src/serializeArray.ts | 22 +++++++++++-- src/test/suite/serializeArray.test.ts | 47 +++++++++++++++++++++++++++ 3 files changed, 68 insertions(+), 3 deletions(-) diff --git a/src/parser/parseArray.ts b/src/parser/parseArray.ts index 4f6e2b0..dbeb866 100644 --- a/src/parser/parseArray.ts +++ b/src/parser/parseArray.ts @@ -175,7 +175,7 @@ export default function parseArray(text: string): ParseResult { parser.addErrorListener({ // eslint-disable-next-line @typescript-eslint/no-unused-vars syntaxError(recognizer: Recognizer, offendingSymbol, line, charPositionInLine, msg, e) { - errors.push(new Error(msg)); + errors.push(new Error(`Error in ${line}, ${charPositionInLine}: ${msg})`)); }, }); const jsonContext = parser.json(); diff --git a/src/serializeArray.ts b/src/serializeArray.ts index ec5d31d..1c9cf94 100644 --- a/src/serializeArray.ts +++ b/src/serializeArray.ts @@ -5,6 +5,9 @@ import { FileExtension } from './fileExtension'; import { TerminalNode } from 'antlr4ts/tree'; import { ParserRuleContext } from 'antlr4ts'; + +const NEWLINE = /\r?\n/; + class ArraySerializer { private makeIndent(indentLevel: number): string { @@ -140,7 +143,21 @@ class ArraySerializer { return c.startLine > start && c.endLine < end; } }) - .map( c => `${c.text}`).map(c => this.makeIndent(indentLevel + 1) + c); + .map( c => { + if (c.type == 'inline') { + return this.makeIndent(indentLevel + 1) + c.text; + } else { + const commonTrailingWhitespace = new RegExp(`^\\s{0,${c.startColumn}}`); + return c.text.split(NEWLINE).map((l, i) => { + if (i == 0) { + return this.makeIndent(indentLevel + 1) + l; + } else { + return this.makeIndent(indentLevel + 1) + l.replace(commonTrailingWhitespace, ""); + } + }).join("\n"); + } + + }) if (comments.length > 0) { return comments.join("\n") + "\n"; } else { @@ -163,13 +180,14 @@ class ArraySerializer { } } + export default function serializeArrayFromTree(parseResult: ParseResult, fileExtension: FileExtension, text: string, {indentLevel, newIndent}: {indentLevel: number, newIndent: string}): string { const { items, comments: allCommentTokens } = parseResult; if (fileExtension === FileExtension.JSONL) { - const lines = text.split(/\r?\n/); + const lines = text.split(NEWLINE); const serializedArrayItems = items.map(value => { const valueContext = value[contextSymbol]; const startToken = valueContext.start; diff --git a/src/test/suite/serializeArray.test.ts b/src/test/suite/serializeArray.test.ts index 88a49c9..d2e59cf 100644 --- a/src/test/suite/serializeArray.test.ts +++ b/src/test/suite/serializeArray.test.ts @@ -410,6 +410,53 @@ suite('serializeArray', function() { ] `; + expectSerializedArray(original, expected, {sortFn: (a, b) => a.id - b.id}); + }); + + test('indentation of block comments', function() { + const original = undent` + [ + /* + Normal indentation + */ + /* + Too much indentation + */ + /* + Too little indentation + */ + /* In this example, we're commenting out the addTwoNumbers + function, therefore preventing it from executing. Only the + multiplyTwoNumbers function will run */ + /** + * Initialize constant with an array of strings. + * Loop through each item in the array and print + * it to the console. + */ + ] + `; + const expected = undent` + [ + /* + Normal indentation + */ + /* + Too much indentation + */ + /* + Too little indentation + */ + /* In this example, we're commenting out the addTwoNumbers + function, therefore preventing it from executing. Only the + multiplyTwoNumbers function will run */ + /** + * Initialize constant with an array of strings. + * Loop through each item in the array and print + * it to the console. + */ + ] + `; + expectSerializedArray(original, expected, {sortFn: (a, b) => a.id - b.id}); }) From 7a40217763f4fc00a6afc32b694e58cad4aec897 Mon Sep 17 00:00:00 2001 From: Frederik Claus Date: Sat, 4 Oct 2025 13:01:11 +0200 Subject: [PATCH 04/10] Fixes test, docs --- CONTRIBUTING.md | 3 +++ README.md | 10 +++++++--- package.json | 2 +- src/test/suite/extension.vsc-test.ts | 2 +- src/test/suite/setupSpies.ts | 3 ++- 5 files changed, 14 insertions(+), 6 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b240e90..5f89d2b 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -6,5 +6,8 @@ - Record the whole window with the sidebar hidden - Resize gif with `gifsicle --resize 800x sortOrderExample.gif > sortOrderExample.gif` +# Debug extension tests +You can change `test` to `test.only` to execute only a single test + ## Current minimally supported VSCode version I only increase the minimally supported code version, if there is feature in a newer version that I need. The most current feature that is in use is `--profile-temp` which was introduced in [1.72](https://code.visualstudio.com/updates/v1_72#_extension-debugging-in-a-clean-environment) \ No newline at end of file diff --git a/README.md b/README.md index de86ba4..4c8308b 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,9 @@ -# Sort JSON/JS array +# Sort JSON/JSONL/JSONC/JS array ![test status badge](https://github.com/fvclaus/vsc-sort-json-array/actions/workflows/ci.yml/badge.svg?branch=master) VS Code Marketplace Installs -Sorts a JSON/JS array by common property or by custom function and replace the array in-place. The array can be selected (must include `[` and `]`). If no selection is present, the extension will try to find an array that is enclosed by the current cursor position. +Sorts a JSON/JSONL/JSONC/JS array by common property or by custom function and replace the array in-place. The array can be selected (must include `[` and `]`). If no selection is present, the extension will try to find an array that is enclosed by the current cursor position. ## Installation @@ -19,7 +19,7 @@ ext install fvclaus.sort-json-array ## What is supported? -This extension contains its own parser, because `JSON.parse` is too restrictive and `eval` doesn't support comments (which is an upcoming feature) and will strip out some information (for example how and if object properties are quoted). +This extension contains its own parser, because `JSON.parse` is too restrictive and `eval` doesn't support comments and will strip out some information (for example how and if object properties are quoted). The result is a support for a superset of JSON/JSONC/JSONL and a subset of JS. - Arrays: - `number[]`, `string[]` or `object[]` @@ -28,7 +28,11 @@ This extension contains its own parser, because `JSON.parse` is too restrictive - Object properties/key can be either unquoted, `'single'` or `"double"` quoted - Strings: `'single'` and `"double"` quoted - Numbers: Base 10 numbers with optional exponent +- Comments: + - `// Line comments` + - `/* Block comments stretching multiple lines` - JSONL: with the same rules as above. Selection of an arbitrary number of lines is supported. +- JSONC: Full support with the same rules as above ## Demo diff --git a/package.json b/package.json index 6b8dfa2..82a9329 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "sort-json-array", "displayName": "Sort JSON/JS array", "description": "Sorts JSON/JS arrays by value, object property or custom function", - "version": "4.2.0", + "version": "4.1.0", "publisher": "fvclaus", "license": "BSD-3-Clause", "engines": { diff --git a/src/test/suite/extension.vsc-test.ts b/src/test/suite/extension.vsc-test.ts index 3855f3c..26a582d 100644 --- a/src/test/suite/extension.vsc-test.ts +++ b/src/test/suite/extension.vsc-test.ts @@ -16,7 +16,7 @@ suite('Extension Test Suite', function() { }); test('Invalid json', async function() { - await triggerSortExpectFailure('[\'foo, 2, 3]', /Cannot parse selection as JSON array. Reason: no viable alternative at input '\['/) + await triggerSortExpectFailure('[\'foo, 2, 3]', /Cannot parse selection as JSON array. Reason: Error in 1, 1: no viable alternative at input '\['/) }); test('Valid json', async function() { diff --git a/src/test/suite/setupSpies.ts b/src/test/suite/setupSpies.ts index 2a5e67e..614858f 100644 --- a/src/test/suite/setupSpies.ts +++ b/src/test/suite/setupSpies.ts @@ -18,7 +18,8 @@ export function setupSpies(): {showErrorMessageSpy: typeof showErrorMessageSpy, export async function expectErrorMessage(msg: RegExp): Promise { expect(showErrorMessageSpy.called, 'Expected vscode.window.showErrorMessage to be called').to.be.true; - expect(showErrorMessageSpy.lastCall.args[0]).to.satisfy((actualErrorMessage: string) => msg.test(actualErrorMessage)); + const lastArg = showErrorMessageSpy.lastCall.args[0]; + expect(lastArg).to.satisfy((actualErrorMessage: string) => msg.test(actualErrorMessage), `${lastArg} does not match ${msg}`); const timeout = 5000; const interval = 10; const startTime = Date.now(); From 0f2504030182a6196b849f3e1f35599ffb9d99fa Mon Sep 17 00:00:00 2001 From: Frederik Claus Date: Sat, 4 Oct 2025 13:06:42 +0200 Subject: [PATCH 05/10] Tries to fix tests --- .github/workflows/ci.yml | 2 +- src/test/suite/sortOrder/sortObjects/sortObjects.vsc-test.ts | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ff8cc8e..e7aedcf 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -10,7 +10,7 @@ jobs: strategy: matrix: os: [ubuntu-latest, windows-latest] - vscode-version: ['1.72.0', '1.100.0'] + vscode-version: ['1.72.0', '1.104.0'] fail-fast: false runs-on: ${{ matrix.os }} diff --git a/src/test/suite/sortOrder/sortObjects/sortObjects.vsc-test.ts b/src/test/suite/sortOrder/sortObjects/sortObjects.vsc-test.ts index 19646cd..24a3cb3 100644 --- a/src/test/suite/sortOrder/sortObjects/sortObjects.vsc-test.ts +++ b/src/test/suite/sortOrder/sortObjects/sortObjects.vsc-test.ts @@ -10,9 +10,11 @@ import nextTick from '../../nextTick'; import {closeActiveEditor} from '../../textEditorUtils'; import { undent } from '../../undent'; import { selectQuickOpenItems } from '../../sortCustom/selectQuickOpenItem'; +import { sleep } from '../../sleep'; async function changeToCRLF(): Promise { - await vscode.commands.executeCommand("workbench.action.showCommands"); + await vscode.commands.executeCommand("workbench.action.showCommands");a + await sleep(1000); await selectQuickOpenItems("Change End of Line Sequence", "CRLF"); } From 7cca37d2a07e0b7da2dcc4cd81d54a067a43b15f Mon Sep 17 00:00:00 2001 From: Frederik Claus Date: Sat, 4 Oct 2025 13:07:28 +0200 Subject: [PATCH 06/10] syntax --- src/test/suite/sortOrder/sortObjects/sortObjects.vsc-test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/suite/sortOrder/sortObjects/sortObjects.vsc-test.ts b/src/test/suite/sortOrder/sortObjects/sortObjects.vsc-test.ts index 24a3cb3..63a2c96 100644 --- a/src/test/suite/sortOrder/sortObjects/sortObjects.vsc-test.ts +++ b/src/test/suite/sortOrder/sortObjects/sortObjects.vsc-test.ts @@ -13,7 +13,7 @@ import { selectQuickOpenItems } from '../../sortCustom/selectQuickOpenItem'; import { sleep } from '../../sleep'; async function changeToCRLF(): Promise { - await vscode.commands.executeCommand("workbench.action.showCommands");a + await vscode.commands.executeCommand("workbench.action.showCommands"); await sleep(1000); await selectQuickOpenItems("Change End of Line Sequence", "CRLF"); } From e6be958578175b27b571a0b677dec4b579a44778 Mon Sep 17 00:00:00 2001 From: Frederik Claus Date: Sat, 4 Oct 2025 13:09:54 +0200 Subject: [PATCH 07/10] Tries to fix tests --- src/test/suite/sortOrder/sortObjects/sortObjects.vsc-test.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/test/suite/sortOrder/sortObjects/sortObjects.vsc-test.ts b/src/test/suite/sortOrder/sortObjects/sortObjects.vsc-test.ts index 63a2c96..fe501a8 100644 --- a/src/test/suite/sortOrder/sortObjects/sortObjects.vsc-test.ts +++ b/src/test/suite/sortOrder/sortObjects/sortObjects.vsc-test.ts @@ -14,7 +14,8 @@ import { sleep } from '../../sleep'; async function changeToCRLF(): Promise { await vscode.commands.executeCommand("workbench.action.showCommands"); - await sleep(1000); + // Pipeline fails for 1.172.0 without sleep + await sleep(2000); await selectQuickOpenItems("Change End of Line Sequence", "CRLF"); } From 410950cd4c62c481c1714858ca7470c88385470c Mon Sep 17 00:00:00 2001 From: Frederik Claus Date: Sat, 4 Oct 2025 13:12:40 +0200 Subject: [PATCH 08/10] Tries to fix tests --- .github/workflows/ci.yml | 2 +- src/test/suite/sortOrder/sortObjects/sortObjects.vsc-test.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e7aedcf..0e82f90 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -10,7 +10,7 @@ jobs: strategy: matrix: os: [ubuntu-latest, windows-latest] - vscode-version: ['1.72.0', '1.104.0'] + vscode-version: ['1.82.0', '1.104.0'] fail-fast: false runs-on: ${{ matrix.os }} diff --git a/src/test/suite/sortOrder/sortObjects/sortObjects.vsc-test.ts b/src/test/suite/sortOrder/sortObjects/sortObjects.vsc-test.ts index fe501a8..ac4869e 100644 --- a/src/test/suite/sortOrder/sortObjects/sortObjects.vsc-test.ts +++ b/src/test/suite/sortOrder/sortObjects/sortObjects.vsc-test.ts @@ -15,7 +15,7 @@ import { sleep } from '../../sleep'; async function changeToCRLF(): Promise { await vscode.commands.executeCommand("workbench.action.showCommands"); // Pipeline fails for 1.172.0 without sleep - await sleep(2000); + // await sleep(2000); await selectQuickOpenItems("Change End of Line Sequence", "CRLF"); } From b35dcde6741b6dcecfb3c0ea311186da15fc737b Mon Sep 17 00:00:00 2001 From: Frederik Claus Date: Sat, 4 Oct 2025 13:15:18 +0200 Subject: [PATCH 09/10] Tries to fix tests --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0e82f90..be7698c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -10,7 +10,7 @@ jobs: strategy: matrix: os: [ubuntu-latest, windows-latest] - vscode-version: ['1.82.0', '1.104.0'] + vscode-version: ['1.90.0', '1.104.0'] fail-fast: false runs-on: ${{ matrix.os }} From 81725bca73f37f01d3a09936bade4b567ba37c0d Mon Sep 17 00:00:00 2001 From: Frederik Claus Date: Sat, 4 Oct 2025 13:22:30 +0200 Subject: [PATCH 10/10] Cleanup --- CONTRIBUTING.md | 2 +- README.md | 2 +- package.json | 12 ++++++------ 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 5f89d2b..47b3a84 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -10,4 +10,4 @@ You can change `test` to `test.only` to execute only a single test ## Current minimally supported VSCode version -I only increase the minimally supported code version, if there is feature in a newer version that I need. The most current feature that is in use is `--profile-temp` which was introduced in [1.72](https://code.visualstudio.com/updates/v1_72#_extension-debugging-in-a-clean-environment) \ No newline at end of file +Currently, the version is set at 1.190, because the tests in the pipeline failed for lower versions and it wasn't reproducible otherwise. Usually, I only increase the minimally supported code version, if there is feature in a newer version that I need. \ No newline at end of file diff --git a/README.md b/README.md index 4c8308b..27409a6 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ Sorts a JSON/JSONL/JSONC/JS array by common property or by custom function and r Install through VS Code extensions. Search for `sort js array` -[Visual Studio Code Market Place: Sort JSON/JS array](https://marketplace.visualstudio.com/items?itemName=fvclaus.sort-json-array) +[Visual Studio Code Market Place: Sort JSON/JSONL/JSONC/JS array](https://marketplace.visualstudio.com/items?itemName=fvclaus.sort-json-array) Can also be installed in VS Code: Launch VS Code Quick Open (Ctrl+P), paste the following command, and press enter. diff --git a/package.json b/package.json index 82a9329..b755442 100644 --- a/package.json +++ b/package.json @@ -1,12 +1,12 @@ { "name": "sort-json-array", - "displayName": "Sort JSON/JS array", - "description": "Sorts JSON/JS arrays by value, object property or custom function", + "displayName": "Sort JSON/JSONL/JSONC/JS array", + "description": "Sorts JSON/JSONL/JSONC/JS arrays by value, object property or custom function", "version": "4.1.0", "publisher": "fvclaus", "license": "BSD-3-Clause", "engines": { - "vscode": "^1.44.0", + "vscode": "^1.90.0", "node": ">=22.0.0" }, "bugs": { @@ -36,17 +36,17 @@ "commands": [ { "command": "extension.sortJsonArrayAscending", - "title": "Sort JSON/JS array ascending", + "title": "Sort JSON/JSONL/JSONC/JS array ascending", "enablement": "editorLangId == json || editorLangId == jsonc || editorLangId == jsonl || editorLangId == typescript || editorLangId == typescriptreact || editorLangId == javascript || editorLangId == javascriptreact || editorLangId == dart || editorLangId == coffeescript" }, { "command": "extension.sortJsonArrayDescending", - "title": "Sort JSON/JS array descending", + "title": "Sort JSON/JSONL/JSONC/JS array descending", "enablement": "editorLangId == json || editorLangId == jsonc || editorLangId == jsonl || editorLangId == typescript || editorLangId == typescriptreact || editorLangId == javascript || editorLangId == javascriptreact || editorLangId == dart || editorLangId == coffeescript" }, { "command": "extension.sortJsonArrayCustom", - "title": "Sort JSON/JS array custom", + "title": "Sort JSON/JSONL/JSONC/JS array custom", "enablement": "editorLangId == json || editorLangId == jsonc || editorLangId == jsonl || editorLangId == typescript || editorLangId == typescriptreact || editorLangId == javascript || editorLangId == javascriptreact || editorLangId == dart || editorLangId == coffeescript" } ],