Coverage Report

Created: 2025-06-13 06:43

/src/php-src/ext/json/json_scanner.c
Line
Count
Source (jump to first uncovered line)
1
/* Generated by re2c 1.3 */
2
/*
3
  +----------------------------------------------------------------------+
4
  | Copyright (c) The PHP Group                                          |
5
  +----------------------------------------------------------------------+
6
  | This source file is subject to version 3.01 of the PHP license,      |
7
  | that is bundled with this package in the file LICENSE, and is        |
8
  | available through the world-wide-web at the following url:           |
9
  | https://www.php.net/license/3_01.txt                                 |
10
  | If you did not receive a copy of the PHP license and are unable to   |
11
  | obtain it through the world-wide-web, please send a note to          |
12
  | license@php.net so we can mail you a copy immediately.               |
13
  +----------------------------------------------------------------------+
14
  | Author: Jakub Zelenka <bukka@php.net>                                |
15
  +----------------------------------------------------------------------+
16
*/
17
18
#include "php.h"
19
#include "php_json_scanner.h"
20
#include "php_json_scanner_defs.h"
21
#include "php_json_parser.h"
22
#include "json_parser.tab.h"
23
24
13.3M
#define YYCTYPE     php_json_ctype
25
246M
#define YYCURSOR    s->cursor
26
#define YYLIMIT     s->limit
27
106M
#define YYMARKER    s->marker
28
#define YYCTXMARKER s->ctxmarker
29
30
26.6M
#define YYGETCONDITION()        s->state
31
128k
#define YYSETCONDITION(yystate) s->state = yystate
32
33
#define YYFILL(n)
34
35
125k
#define PHP_JSON_CONDITION_SET(condition) YYSETCONDITION(yyc##condition)
36
55.3M
#define PHP_JSON_CONDITION_GOTO(condition) goto yyc_##condition
37
#define PHP_JSON_CONDITION_SET_AND_GOTO(condition) \
38
58.7k
  PHP_JSON_CONDITION_SET(condition); \
39
58.7k
  PHP_JSON_CONDITION_GOTO(condition)
40
#define PHP_JSON_CONDITION_GOTO_STR_P2() \
41
345k
  do { \
42
345k
    if (s->utf8_invalid) { \
43
0
      PHP_JSON_CONDITION_GOTO(STR_P2_BIN); \
44
345k
    } else { \
45
345k
      PHP_JSON_CONDITION_GOTO(STR_P2_UTF); \
46
345k
    } \
47
345k
  } while(0)
48
49
50
43.8k
#define PHP_JSON_SCANNER_COPY_ESC() php_json_scanner_copy_string(s, 0)
51
300k
#define PHP_JSON_SCANNER_COPY_UTF() php_json_scanner_copy_string(s, 5)
52
1.64k
#define PHP_JSON_SCANNER_COPY_UTF_SP() php_json_scanner_copy_string(s, 11)
53
54
303k
#define PHP_JSON_INT_MAX_LENGTH (MAX_LENGTH_OF_LONG - 1)
55
56
57
static void php_json_scanner_copy_string(php_json_scanner *s, size_t esc_size)
58
345k
{
59
345k
  size_t len = (size_t)(s->cursor - s->str_start - esc_size - 1);
60
345k
  if (len) {
61
151k
    memcpy(s->pstr, s->str_start, len);
62
151k
    s->pstr += len;
63
151k
  }
64
345k
}
65
66
static int php_json_hex_to_int(unsigned char code)
67
874k
{
68
874k
  if (code >= '0' && code <= '9') {
69
391k
    return code - '0';
70
483k
  } else if (code >= 'A' && code <= 'F') {
71
387k
    return code - ('A' - 10);
72
387k
  } else if (code >= 'a' && code <= 'f') {
73
96.2k
    return code - ('a' - 10);
74
96.2k
  } else {
75
    /* this should never happened (just to suppress compiler warning) */
76
0
    return -1;
77
0
  }
78
874k
}
79
80
static int php_json_ucs2_to_int_ex(php_json_scanner *s, int size, int start)
81
303k
{
82
303k
  int i, code = 0;
83
303k
  php_json_ctype *pc = s->cursor - start;
84
1.17M
  for (i = 0; i < size; i++) {
85
874k
    code |= php_json_hex_to_int(*(pc--)) << (i * 4);
86
874k
  }
87
303k
  return code;
88
303k
}
89
90
static int php_json_ucs2_to_int(php_json_scanner *s, int size)
91
301k
{
92
301k
  return php_json_ucs2_to_int_ex(s, size, 1);
93
301k
}
94
95
void php_json_scanner_init(php_json_scanner *s, const char *str, size_t str_len, int options)
96
13.3k
{
97
13.3k
  s->cursor = (php_json_ctype *) str;
98
13.3k
  s->limit = (php_json_ctype *) str + str_len;
99
13.3k
  s->options = options;
100
13.3k
  PHP_JSON_CONDITION_SET(JS);
101
13.3k
}
102
103
int php_json_scan(php_json_scanner *s)
104
13.3M
{
105
13.3M
  ZVAL_NULL(&s->value);
106
107
13.3M
std:
108
13.3M
  s->token = s->cursor;
109
110
111
13.3M
  {
112
13.3M
    YYCTYPE yych;
113
13.3M
    unsigned int yyaccept = 0;
114
13.3M
    if (YYGETCONDITION() < 2) {
115
13.3M
      if (YYGETCONDITION() < 1) {
116
13.3M
        goto yyc_JS;
117
13.3M
      } else {
118
0
        goto yyc_STR_P1;
119
0
      }
120
13.3M
    } else {
121
0
      if (YYGETCONDITION() < 3) {
122
0
        goto yyc_STR_P2_BIN;
123
0
      } else {
124
0
        goto yyc_STR_P2_UTF;
125
0
      }
126
0
    }
127
/* *********************************** */
128
13.3M
yyc_JS:
129
13.3M
    {
130
13.3M
      static const unsigned char yybm[] = {
131
13.3M
          0,   0,   0,   0,   0,   0,   0,   0, 
132
13.3M
          0,  64,   0,   0,   0,  64,   0,   0, 
133
13.3M
          0,   0,   0,   0,   0,   0,   0,   0, 
134
13.3M
          0,   0,   0,   0,   0,   0,   0,   0, 
135
13.3M
         64,   0,   0,   0,   0,   0,   0,   0, 
136
13.3M
          0,   0,   0,   0,   0,   0,   0,   0, 
137
13.3M
        128, 128, 128, 128, 128, 128, 128, 128, 
138
13.3M
        128, 128,   0,   0,   0,   0,   0,   0, 
139
13.3M
          0,   0,   0,   0,   0,   0,   0,   0, 
140
13.3M
          0,   0,   0,   0,   0,   0,   0,   0, 
141
13.3M
          0,   0,   0,   0,   0,   0,   0,   0, 
142
13.3M
          0,   0,   0,   0,   0,   0,   0,   0, 
143
13.3M
          0,   0,   0,   0,   0,   0,   0,   0, 
144
13.3M
          0,   0,   0,   0,   0,   0,   0,   0, 
145
13.3M
          0,   0,   0,   0,   0,   0,   0,   0, 
146
13.3M
          0,   0,   0,   0,   0,   0,   0,   0, 
147
13.3M
          0,   0,   0,   0,   0,   0,   0,   0, 
148
13.3M
          0,   0,   0,   0,   0,   0,   0,   0, 
149
13.3M
          0,   0,   0,   0,   0,   0,   0,   0, 
150
13.3M
          0,   0,   0,   0,   0,   0,   0,   0, 
151
13.3M
          0,   0,   0,   0,   0,   0,   0,   0, 
152
13.3M
          0,   0,   0,   0,   0,   0,   0,   0, 
153
13.3M
          0,   0,   0,   0,   0,   0,   0,   0, 
154
13.3M
          0,   0,   0,   0,   0,   0,   0,   0, 
155
13.3M
          0,   0,   0,   0,   0,   0,   0,   0, 
156
13.3M
          0,   0,   0,   0,   0,   0,   0,   0, 
157
13.3M
          0,   0,   0,   0,   0,   0,   0,   0, 
158
13.3M
          0,   0,   0,   0,   0,   0,   0,   0, 
159
13.3M
          0,   0,   0,   0,   0,   0,   0,   0, 
160
13.3M
          0,   0,   0,   0,   0,   0,   0,   0, 
161
13.3M
          0,   0,   0,   0,   0,   0,   0,   0, 
162
13.3M
          0,   0,   0,   0,   0,   0,   0,   0, 
163
13.3M
      };
164
13.3M
      yych = *YYCURSOR;
165
13.3M
      if (yych <= ']') {
166
4.94M
        if (yych <= '"') {
167
68.3k
          if (yych <= '\f') {
168
8.78k
            if (yych <= 0x08) {
169
7.89k
              if (yych >= 0x01) goto yy5;
170
7.89k
            } else {
171
894
              if (yych <= '\t') goto yy7;
172
656
              if (yych <= '\n') goto yy10;
173
5
              goto yy5;
174
656
            }
175
59.5k
          } else {
176
59.5k
            if (yych <= 0x1F) {
177
484
              if (yych <= '\r') goto yy11;
178
39
              goto yy5;
179
59.0k
            } else {
180
59.0k
              if (yych <= ' ') goto yy7;
181
58.7k
              if (yych <= '!') goto yy12;
182
58.7k
              goto yy14;
183
58.7k
            }
184
59.5k
          }
185
4.87M
        } else {
186
4.87M
          if (yych <= '0') {
187
4.52M
            if (yych <= ',') {
188
4.48M
              if (yych <= '+') goto yy12;
189
4.48M
              goto yy16;
190
4.48M
            } else {
191
36.4k
              if (yych <= '-') goto yy18;
192
35.2k
              if (yych <= '/') goto yy12;
193
35.2k
              goto yy19;
194
35.2k
            }
195
4.52M
          } else {
196
351k
            if (yych <= 'Z') {
197
336k
              if (yych <= '9') goto yy21;
198
52.9k
              if (yych <= ':') goto yy23;
199
109
              goto yy12;
200
52.9k
            } else {
201
15.2k
              if (yych <= '[') goto yy25;
202
6.58k
              if (yych <= '\\') goto yy12;
203
6.54k
              goto yy27;
204
6.58k
            }
205
351k
          }
206
4.87M
        }
207
8.37M
      } else {
208
8.37M
        if (yych <= '}') {
209
8.37M
          if (yych <= 's') {
210
751
            if (yych <= 'f') {
211
473
              if (yych <= 'e') goto yy12;
212
274
              goto yy29;
213
473
            } else {
214
278
              if (yych == 'n') goto yy30;
215
21
              goto yy12;
216
278
            }
217
8.37M
          } else {
218
8.37M
            if (yych <= 'z') {
219
272
              if (yych <= 't') goto yy31;
220
15
              goto yy12;
221
8.37M
            } else {
222
8.37M
              if (yych <= '{') goto yy32;
223
4.18M
              if (yych <= '|') goto yy12;
224
4.18M
              goto yy34;
225
4.18M
            }
226
8.37M
          }
227
8.37M
        } else {
228
476
          if (yych <= 0xEC) {
229
262
            if (yych <= 0xC1) {
230
84
              if (yych <= 0x7F) goto yy12;
231
75
              goto yy36;
232
178
            } else {
233
178
              if (yych <= 0xDF) goto yy38;
234
98
              if (yych <= 0xE0) goto yy39;
235
53
              goto yy40;
236
98
            }
237
262
          } else {
238
214
            if (yych <= 0xF0) {
239
102
              if (yych <= 0xED) goto yy41;
240
65
              if (yych <= 0xEF) goto yy40;
241
50
              goto yy42;
242
112
            } else {
243
112
              if (yych <= 0xF3) goto yy43;
244
60
              if (yych <= 0xF4) goto yy44;
245
23
              goto yy36;
246
60
            }
247
214
          }
248
476
        }
249
8.37M
      }
250
7.86k
      ++YYCURSOR;
251
7.86k
      {
252
7.86k
    if (s->limit < s->cursor) {
253
7.84k
      return PHP_JSON_T_EOI;
254
7.84k
    } else {
255
21
      s->errcode = PHP_JSON_ERROR_CTRL_CHAR;
256
21
      return PHP_JSON_T_ERROR;
257
21
    }
258
7.86k
  }
259
75
yy5:
260
75
      ++YYCURSOR;
261
75
      {
262
75
    s->errcode = PHP_JSON_ERROR_CTRL_CHAR;
263
75
    return PHP_JSON_T_ERROR;
264
7.86k
  }
265
744
yy7:
266
744
      yych = *++YYCURSOR;
267
995
yy8:
268
995
      if (yybm[0+yych] & 64) {
269
196
        goto yy7;
270
196
      }
271
1.64k
yy9:
272
1.64k
      { goto std; }
273
845
yy10:
274
845
      ++YYCURSOR;
275
845
      goto yy9;
276
445
yy11:
277
445
      yych = *++YYCURSOR;
278
445
      if (yych == '\n') goto yy10;
279
251
      goto yy8;
280
547
yy12:
281
547
      ++YYCURSOR;
282
775
yy13:
283
775
      {
284
775
    s->errcode = PHP_JSON_ERROR_SYNTAX;
285
775
    return PHP_JSON_T_ERROR;
286
547
  }
287
58.7k
yy14:
288
58.7k
      ++YYCURSOR;
289
58.7k
      {
290
58.7k
    s->str_start = s->cursor;
291
58.7k
    s->str_esc = 0;
292
58.7k
    s->utf8_invalid = 0;
293
58.7k
    s->utf8_invalid_count = 0;
294
58.7k
    PHP_JSON_CONDITION_SET_AND_GOTO(STR_P1);
295
547
  }
296
4.48M
yy16:
297
4.48M
      ++YYCURSOR;
298
4.48M
      { return ','; }
299
1.15k
yy18:
300
1.15k
      yych = *++YYCURSOR;
301
1.15k
      if (yych <= '/') goto yy13;
302
1.13k
      if (yych <= '0') goto yy19;
303
807
      if (yych <= '9') goto yy21;
304
17
      goto yy13;
305
35.5k
yy19:
306
35.5k
      yyaccept = 0;
307
35.5k
      yych = *(YYMARKER = ++YYCURSOR);
308
35.5k
      if (yych <= 'D') {
309
31.7k
        if (yych == '.') goto yy45;
310
31.7k
      } else {
311
3.84k
        if (yych <= 'E') goto yy47;
312
3.51k
        if (yych == 'e') goto yy47;
313
3.51k
      }
314
299k
yy20:
315
299k
      {
316
299k
    bool bigint = 0, negative = s->token[0] == '-';
317
299k
    size_t digits = (size_t) (s->cursor - s->token - negative);
318
299k
    if (digits >= PHP_JSON_INT_MAX_LENGTH) {
319
3.05k
      if (digits == PHP_JSON_INT_MAX_LENGTH) {
320
1.02k
        int cmp = strncmp((char *) (s->token + negative), LONG_MIN_DIGITS, PHP_JSON_INT_MAX_LENGTH);
321
1.02k
        if (!(cmp < 0 || (cmp == 0 && negative))) {
322
586
          bigint = 1;
323
586
        }
324
2.03k
      } else {
325
2.03k
        bigint = 1;
326
2.03k
      }
327
3.05k
    }
328
299k
    if (!bigint) {
329
296k
      ZVAL_LONG(&s->value, ZEND_STRTOL((char *) s->token, NULL, 10));
330
296k
      return PHP_JSON_T_INT;
331
296k
    } else if (s->options & PHP_JSON_BIGINT_AS_STRING) {
332
0
      ZVAL_STRINGL(&s->value, (char *) s->token, (size_t)(s->cursor - s->token));
333
0
      return PHP_JSON_T_STRING;
334
2.61k
    } else {
335
2.61k
      ZVAL_DOUBLE(&s->value, zend_strtod((char *) s->token, NULL));
336
2.61k
      return PHP_JSON_T_DOUBLE;
337
2.61k
    }
338
299k
  }
339
31.3M
yy21:
340
31.3M
      yyaccept = 0;
341
31.3M
      yych = *(YYMARKER = ++YYCURSOR);
342
31.3M
      if (yybm[0+yych] & 128) {
343
31.0M
        goto yy21;
344
31.0M
      }
345
284k
      if (yych <= 'D') {
346
270k
        if (yych == '.') goto yy45;
347
263k
        goto yy20;
348
270k
      } else {
349
13.6k
        if (yych <= 'E') goto yy47;
350
12.1k
        if (yych == 'e') goto yy47;
351
2.60k
        goto yy20;
352
12.1k
      }
353
52.8k
yy23:
354
52.8k
      ++YYCURSOR;
355
52.8k
      { return ':'; }
356
8.67k
yy25:
357
8.67k
      ++YYCURSOR;
358
8.67k
      { return '['; }
359
6.54k
yy27:
360
6.54k
      ++YYCURSOR;
361
6.54k
      { return ']'; }
362
274
yy29:
363
274
      yyaccept = 1;
364
274
      yych = *(YYMARKER = ++YYCURSOR);
365
274
      if (yych == 'a') goto yy48;
366
11
      goto yy13;
367
257
yy30:
368
257
      yyaccept = 1;
369
257
      yych = *(YYMARKER = ++YYCURSOR);
370
257
      if (yych == 'u') goto yy49;
371
19
      goto yy13;
372
257
yy31:
373
257
      yyaccept = 1;
374
257
      yych = *(YYMARKER = ++YYCURSOR);
375
257
      if (yych == 'r') goto yy50;
376
21
      goto yy13;
377
4.19M
yy32:
378
4.19M
      ++YYCURSOR;
379
4.19M
      { return '{'; }
380
4.18M
yy34:
381
4.18M
      ++YYCURSOR;
382
4.18M
      { return '}'; }
383
98
yy36:
384
98
      ++YYCURSOR;
385
431
yy37:
386
431
      {
387
431
    s->errcode = PHP_JSON_ERROR_UTF8;
388
431
    return PHP_JSON_T_ERROR;
389
98
  }
390
80
yy38:
391
80
      yych = *++YYCURSOR;
392
80
      if (yych <= 0x7F) goto yy37;
393
32
      if (yych <= 0xBF) goto yy12;
394
11
      goto yy37;
395
45
yy39:
396
45
      yyaccept = 2;
397
45
      yych = *(YYMARKER = ++YYCURSOR);
398
45
      if (yych <= 0x9F) goto yy37;
399
22
      if (yych <= 0xBF) goto yy51;
400
5
      goto yy37;
401
68
yy40:
402
68
      yyaccept = 2;
403
68
      yych = *(YYMARKER = ++YYCURSOR);
404
68
      if (yych <= 0x7F) goto yy37;
405
46
      if (yych <= 0xBF) goto yy51;
406
15
      goto yy37;
407
37
yy41:
408
37
      yyaccept = 2;
409
37
      yych = *(YYMARKER = ++YYCURSOR);
410
37
      if (yych <= 0x7F) goto yy37;
411
34
      if (yych <= 0x9F) goto yy51;
412
19
      goto yy37;
413
50
yy42:
414
50
      yyaccept = 2;
415
50
      yych = *(YYMARKER = ++YYCURSOR);
416
50
      if (yych <= 0x8F) goto yy37;
417
33
      if (yych <= 0xBF) goto yy52;
418
11
      goto yy37;
419
52
yy43:
420
52
      yyaccept = 2;
421
52
      yych = *(YYMARKER = ++YYCURSOR);
422
52
      if (yych <= 0x7F) goto yy37;
423
45
      if (yych <= 0xBF) goto yy52;
424
17
      goto yy37;
425
37
yy44:
426
37
      yyaccept = 2;
427
37
      yych = *(YYMARKER = ++YYCURSOR);
428
37
      if (yych <= 0x7F) goto yy37;
429
32
      if (yych <= 0x8F) goto yy52;
430
19
      goto yy37;
431
8.61k
yy45:
432
8.61k
      yych = *++YYCURSOR;
433
8.61k
      if (yych <= '/') goto yy46;
434
8.57k
      if (yych <= '9') goto yy53;
435
554
yy46:
436
554
      YYCURSOR = YYMARKER;
437
554
      if (yyaccept <= 1) {
438
349
        if (yyaccept == 0) {
439
202
          goto yy20;
440
202
        } else {
441
147
          goto yy13;
442
147
        }
443
349
      } else {
444
205
        if (yyaccept == 2) {
445
111
          goto yy37;
446
111
        } else {
447
94
          goto yy55;
448
94
        }
449
205
      }
450
14.3k
yy47:
451
14.3k
      yych = *++YYCURSOR;
452
14.3k
      if (yych <= ',') {
453
467
        if (yych == '+') goto yy56;
454
145
        goto yy46;
455
13.8k
      } else {
456
13.8k
        if (yych <= '-') goto yy56;
457
8.59k
        if (yych <= '/') goto yy46;
458
8.58k
        if (yych <= '9') goto yy57;
459
38
        goto yy46;
460
8.58k
      }
461
263
yy48:
462
263
      yych = *++YYCURSOR;
463
263
      if (yych == 'l') goto yy59;
464
19
      goto yy46;
465
238
yy49:
466
238
      yych = *++YYCURSOR;
467
238
      if (yych == 'l') goto yy60;
468
21
      goto yy46;
469
236
yy50:
470
236
      yych = *++YYCURSOR;
471
236
      if (yych == 'u') goto yy61;
472
19
      goto yy46;
473
70
yy51:
474
70
      yych = *++YYCURSOR;
475
70
      if (yych <= 0x7F) goto yy46;
476
34
      if (yych <= 0xBF) goto yy12;
477
19
      goto yy46;
478
63
yy52:
479
63
      yych = *++YYCURSOR;
480
63
      if (yych <= 0x7F) goto yy46;
481
14
      if (yych <= 0xBF) goto yy51;
482
7
      goto yy46;
483
73.9M
yy53:
484
73.9M
      yyaccept = 3;
485
73.9M
      yych = *(YYMARKER = ++YYCURSOR);
486
73.9M
      if (yych <= 'D') {
487
73.9M
        if (yych <= '/') goto yy55;
488
73.9M
        if (yych <= '9') goto yy53;
489
73.9M
      } else {
490
2.46k
        if (yych <= 'E') goto yy47;
491
2.16k
        if (yych == 'e') goto yy47;
492
2.16k
      }
493
20.5k
yy55:
494
20.5k
      {
495
20.5k
    ZVAL_DOUBLE(&s->value, zend_strtod((char *) s->token, NULL));
496
20.5k
    return PHP_JSON_T_DOUBLE;
497
73.9M
  }
498
5.62k
yy56:
499
5.62k
      yych = *++YYCURSOR;
500
5.62k
      if (yych <= '/') goto yy46;
501
5.58k
      if (yych >= ':') goto yy46;
502
64.3k
yy57:
503
64.3k
      yych = *++YYCURSOR;
504
64.3k
      if (yych <= '/') goto yy55;
505
50.4k
      if (yych <= '9') goto yy57;
506
246
      goto yy55;
507
246
yy59:
508
244
      yych = *++YYCURSOR;
509
244
      if (yych == 's') goto yy62;
510
19
      goto yy46;
511
217
yy60:
512
217
      yych = *++YYCURSOR;
513
217
      if (yych == 'l') goto yy63;
514
21
      goto yy46;
515
217
yy61:
516
217
      yych = *++YYCURSOR;
517
217
      if (yych == 'e') goto yy65;
518
21
      goto yy46;
519
225
yy62:
520
225
      yych = *++YYCURSOR;
521
225
      if (yych == 'e') goto yy67;
522
27
      goto yy46;
523
196
yy63:
524
196
      ++YYCURSOR;
525
196
      {
526
196
    ZVAL_NULL(&s->value);
527
196
    return PHP_JSON_T_NUL;
528
225
  }
529
196
yy65:
530
196
      ++YYCURSOR;
531
196
      {
532
196
    ZVAL_TRUE(&s->value);
533
196
    return PHP_JSON_T_TRUE;
534
225
  }
535
198
yy67:
536
198
      ++YYCURSOR;
537
198
      {
538
198
    ZVAL_FALSE(&s->value);
539
198
    return PHP_JSON_T_FALSE;
540
225
  }
541
225
    }
542
/* *********************************** */
543
32.9M
yyc_STR_P1:
544
32.9M
    yych = *YYCURSOR;
545
32.9M
    if (yych <= 0xDF) {
546
32.9M
      if (yych <= '[') {
547
25.7M
        if (yych <= 0x1F) goto yy71;
548
25.7M
        if (yych == '"') goto yy75;
549
25.6M
        goto yy73;
550
25.7M
      } else {
551
7.24M
        if (yych <= '\\') goto yy77;
552
6.89M
        if (yych <= 0x7F) goto yy73;
553
321
        if (yych <= 0xC1) goto yy79;
554
290
        goto yy81;
555
321
      }
556
32.9M
    } else {
557
1.74k
      if (yych <= 0xEF) {
558
779
        if (yych <= 0xE0) goto yy82;
559
532
        if (yych == 0xED) goto yy84;
560
296
        goto yy83;
561
968
      } else {
562
968
        if (yych <= 0xF0) goto yy85;
563
580
        if (yych <= 0xF3) goto yy86;
564
258
        if (yych <= 0xF4) goto yy87;
565
11
        goto yy79;
566
258
      }
567
1.74k
    }
568
432
yy71:
569
432
    ++YYCURSOR;
570
432
    {
571
432
    s->errcode = PHP_JSON_ERROR_CTRL_CHAR;
572
432
    return PHP_JSON_T_ERROR;
573
32.9M
  }
574
32.5M
yy73:
575
32.5M
    ++YYCURSOR;
576
32.5M
    { PHP_JSON_CONDITION_GOTO(STR_P1); }
577
56.4k
yy75:
578
56.4k
    ++YYCURSOR;
579
56.4k
    {
580
56.4k
    zend_string *str;
581
56.4k
    size_t len = (size_t)(s->cursor - s->str_start - s->str_esc - 1 + s->utf8_invalid_count);
582
56.4k
    if (len == 0) {
583
20.3k
      PHP_JSON_CONDITION_SET(JS);
584
20.3k
      ZVAL_EMPTY_STRING(&s->value);
585
20.3k
      return PHP_JSON_T_ESTRING;
586
20.3k
    }
587
36.1k
    str = zend_string_alloc(len, 0);
588
36.1k
    ZSTR_VAL(str)[len] = '\0';
589
36.1k
    ZVAL_STR(&s->value, str);
590
36.1k
    if (s->str_esc || s->utf8_invalid) {
591
3.27k
      s->pstr = (php_json_ctype *) Z_STRVAL(s->value);
592
3.27k
      s->cursor = s->str_start;
593
3.27k
      PHP_JSON_CONDITION_GOTO_STR_P2();
594
32.8k
    } else {
595
32.8k
      memcpy(Z_STRVAL(s->value), s->str_start, len);
596
32.8k
      PHP_JSON_CONDITION_SET(JS);
597
32.8k
      return PHP_JSON_T_STRING;
598
32.8k
    }
599
36.1k
  }
600
349k
yy77:
601
349k
    yyaccept = 0;
602
349k
    yych = *(YYMARKER = ++YYCURSOR);
603
349k
    if (yych <= 'e') {
604
40.0k
      if (yych <= '/') {
605
35.4k
        if (yych == '"') goto yy88;
606
544
        if (yych >= '/') goto yy88;
607
4.55k
      } else {
608
4.55k
        if (yych <= '\\') {
609
4.11k
          if (yych >= '\\') goto yy88;
610
4.11k
        } else {
611
442
          if (yych == 'b') goto yy88;
612
442
        }
613
4.55k
      }
614
309k
    } else {
615
309k
      if (yych <= 'q') {
616
931
        if (yych <= 'f') goto yy88;
617
381
        if (yych == 'n') goto yy88;
618
308k
      } else {
619
308k
        if (yych <= 's') {
620
419
          if (yych <= 'r') goto yy88;
621
308k
        } else {
622
308k
          if (yych <= 't') goto yy88;
623
307k
          if (yych <= 'u') goto yy90;
624
307k
        }
625
308k
      }
626
309k
    }
627
1.16k
yy78:
628
1.16k
    {
629
1.16k
    s->errcode = PHP_JSON_ERROR_SYNTAX;
630
1.16k
    return PHP_JSON_T_ERROR;
631
349k
  }
632
42
yy79:
633
42
    ++YYCURSOR;
634
408
yy80:
635
408
    {
636
408
    if (s->options & (PHP_JSON_INVALID_UTF8_IGNORE | PHP_JSON_INVALID_UTF8_SUBSTITUTE)) {
637
0
      if (s->options & PHP_JSON_INVALID_UTF8_SUBSTITUTE) {
638
0
        if (s->utf8_invalid_count > INT_MAX - 2) {
639
0
          s->errcode = PHP_JSON_ERROR_UTF8;
640
0
          return PHP_JSON_T_ERROR;
641
0
        }
642
0
        s->utf8_invalid_count += 2;
643
0
      } else {
644
0
        s->utf8_invalid_count--;
645
0
      }
646
0
      s->utf8_invalid = 1;
647
0
      PHP_JSON_CONDITION_GOTO(STR_P1);
648
0
    }
649
408
    s->errcode = PHP_JSON_ERROR_UTF8;
650
408
    return PHP_JSON_T_ERROR;
651
408
  }
652
290
yy81:
653
290
    yych = *++YYCURSOR;
654
290
    if (yych <= 0x7F) goto yy80;
655
271
    if (yych <= 0xBF) goto yy73;
656
15
    goto yy80;
657
247
yy82:
658
247
    yyaccept = 1;
659
247
    yych = *(YYMARKER = ++YYCURSOR);
660
247
    if (yych <= 0x9F) goto yy80;
661
230
    if (yych <= 0xBF) goto yy92;
662
5
    goto yy80;
663
296
yy83:
664
296
    yyaccept = 1;
665
296
    yych = *(YYMARKER = ++YYCURSOR);
666
296
    if (yych <= 0x7F) goto yy80;
667
281
    if (yych <= 0xBF) goto yy92;
668
13
    goto yy80;
669
236
yy84:
670
236
    yyaccept = 1;
671
236
    yych = *(YYMARKER = ++YYCURSOR);
672
236
    if (yych <= 0x7F) goto yy80;
673
233
    if (yych <= 0x9F) goto yy92;
674
19
    goto yy80;
675
388
yy85:
676
388
    yyaccept = 1;
677
388
    yych = *(YYMARKER = ++YYCURSOR);
678
388
    if (yych <= 0x8F) goto yy80;
679
371
    if (yych <= 0xBF) goto yy93;
680
3
    goto yy80;
681
322
yy86:
682
322
    yyaccept = 1;
683
322
    yych = *(YYMARKER = ++YYCURSOR);
684
322
    if (yych <= 0x7F) goto yy80;
685
315
    if (yych <= 0xBF) goto yy93;
686
17
    goto yy80;
687
247
yy87:
688
247
    yyaccept = 1;
689
247
    yych = *(YYMARKER = ++YYCURSOR);
690
247
    if (yych <= 0x7F) goto yy80;
691
244
    if (yych <= 0x8F) goto yy93;
692
19
    goto yy80;
693
41.7k
yy88:
694
41.7k
    ++YYCURSOR;
695
41.7k
    {
696
41.7k
    s->str_esc++;
697
41.7k
    PHP_JSON_CONDITION_GOTO(STR_P1);
698
244
  }
699
307k
yy90:
700
307k
    yych = *++YYCURSOR;
701
307k
    if (yych <= 'D') {
702
304k
      if (yych <= '9') {
703
300k
        if (yych <= '/') goto yy91;
704
300k
        if (yych <= '0') goto yy94;
705
34.6k
        goto yy95;
706
300k
      } else {
707
3.33k
        if (yych <= '@') goto yy91;
708
3.32k
        if (yych <= 'C') goto yy95;
709
2.82k
        goto yy96;
710
3.32k
      }
711
304k
    } else {
712
3.44k
      if (yych <= 'c') {
713
828
        if (yych <= 'F') goto yy95;
714
324
        if (yych >= 'a') goto yy95;
715
2.61k
      } else {
716
2.61k
        if (yych <= 'd') goto yy96;
717
485
        if (yych <= 'f') goto yy95;
718
485
      }
719
3.44k
    }
720
1.46k
yy91:
721
1.46k
    YYCURSOR = YYMARKER;
722
1.46k
    if (yyaccept <= 1) {
723
1.24k
      if (yyaccept == 0) {
724
1.04k
        goto yy78;
725
1.04k
      } else {
726
194
        goto yy80;
727
194
      }
728
1.24k
    } else {
729
228
      goto yy114;
730
228
    }
731
1.51k
yy92:
732
1.51k
    yych = *++YYCURSOR;
733
1.51k
    if (yych <= 0x7F) goto yy91;
734
1.41k
    if (yych <= 0xBF) goto yy73;
735
13
    goto yy91;
736
891
yy93:
737
891
    yych = *++YYCURSOR;
738
891
    if (yych <= 0x7F) goto yy91;
739
821
    if (yych <= 0xBF) goto yy92;
740
13
    goto yy91;
741
266k
yy94:
742
266k
    yych = *++YYCURSOR;
743
266k
    if (yych <= '9') {
744
261k
      if (yych <= '/') goto yy91;
745
261k
      if (yych <= '0') goto yy97;
746
7.36k
      if (yych <= '7') goto yy98;
747
731
      goto yy99;
748
7.36k
    } else {
749
4.68k
      if (yych <= 'F') {
750
324
        if (yych <= '@') goto yy91;
751
319
        goto yy99;
752
4.36k
      } else {
753
4.36k
        if (yych <= '`') goto yy91;
754
4.36k
        if (yych <= 'f') goto yy99;
755
17
        goto yy91;
756
4.36k
      }
757
4.68k
    }
758
36.4k
yy95:
759
36.4k
    yych = *++YYCURSOR;
760
36.4k
    if (yych <= '@') {
761
5.81k
      if (yych <= '/') goto yy91;
762
5.73k
      if (yych <= '9') goto yy99;
763
7
      goto yy91;
764
30.6k
    } else {
765
30.6k
      if (yych <= 'F') goto yy99;
766
30.1k
      if (yych <= '`') goto yy91;
767
30.1k
      if (yych <= 'f') goto yy99;
768
15
      goto yy91;
769
30.1k
    }
770
4.95k
yy96:
771
4.95k
    yych = *++YYCURSOR;
772
4.95k
    if (yych <= 'B') {
773
3.24k
      if (yych <= '7') {
774
965
        if (yych <= '/') goto yy91;
775
929
        goto yy99;
776
2.27k
      } else {
777
2.27k
        if (yych <= '9') goto yy100;
778
1.46k
        if (yych <= '@') goto yy91;
779
1.44k
        goto yy100;
780
1.46k
      }
781
3.24k
    } else {
782
1.71k
      if (yych <= '`') {
783
105
        if (yych <= 'F') goto yy101;
784
11
        goto yy91;
785
1.60k
      } else {
786
1.60k
        if (yych <= 'b') goto yy100;
787
69
        if (yych <= 'f') goto yy101;
788
21
        goto yy91;
789
69
      }
790
1.71k
    }
791
254k
yy97:
792
254k
    yych = *++YYCURSOR;
793
254k
    if (yych <= '@') {
794
80.8k
      if (yych <= '/') goto yy91;
795
80.8k
      if (yych <= '7') goto yy102;
796
422
      if (yych <= '9') goto yy103;
797
7
      goto yy91;
798
173k
    } else {
799
173k
      if (yych <= 'F') goto yy103;
800
2.08k
      if (yych <= '`') goto yy91;
801
2.08k
      if (yych <= 'f') goto yy103;
802
15
      goto yy91;
803
2.08k
    }
804
6.63k
yy98:
805
6.63k
    yych = *++YYCURSOR;
806
6.63k
    if (yych <= '@') {
807
2.48k
      if (yych <= '/') goto yy91;
808
2.47k
      if (yych <= '9') goto yy103;
809
3
      goto yy91;
810
4.14k
    } else {
811
4.14k
      if (yych <= 'F') goto yy103;
812
1.73k
      if (yych <= '`') goto yy91;
813
1.72k
      if (yych <= 'f') goto yy103;
814
15
      goto yy91;
815
1.72k
    }
816
42.6k
yy99:
817
42.6k
    yych = *++YYCURSOR;
818
42.6k
    if (yych <= '@') {
819
36.4k
      if (yych <= '/') goto yy91;
820
36.2k
      if (yych <= '9') goto yy104;
821
7
      goto yy91;
822
36.2k
    } else {
823
6.28k
      if (yych <= 'F') goto yy104;
824
918
      if (yych <= '`') goto yy91;
825
905
      if (yych <= 'f') goto yy104;
826
17
      goto yy91;
827
905
    }
828
3.80k
yy100:
829
3.80k
    yych = *++YYCURSOR;
830
3.80k
    if (yych <= '@') {
831
1.03k
      if (yych <= '/') goto yy91;
832
988
      if (yych <= '9') goto yy105;
833
9
      goto yy91;
834
2.76k
    } else {
835
2.76k
      if (yych <= 'F') goto yy105;
836
1.81k
      if (yych <= '`') goto yy91;
837
1.79k
      if (yych <= 'f') goto yy105;
838
17
      goto yy91;
839
1.79k
    }
840
142
yy101:
841
142
    yych = *++YYCURSOR;
842
142
    if (yych <= '@') {
843
52
      if (yych <= '/') goto yy91;
844
30
      if (yych <= '9') goto yy106;
845
7
      goto yy91;
846
90
    } else {
847
90
      if (yych <= 'F') goto yy106;
848
55
      if (yych <= '`') goto yy91;
849
42
      if (yych <= 'f') goto yy106;
850
15
      goto yy91;
851
42
    }
852
80.4k
yy102:
853
80.4k
    yych = *++YYCURSOR;
854
80.4k
    if (yych <= '@') {
855
6.10k
      if (yych <= '/') goto yy91;
856
6.08k
      if (yych <= '9') goto yy107;
857
7
      goto yy91;
858
74.3k
    } else {
859
74.3k
      if (yych <= 'F') goto yy107;
860
50.5k
      if (yych <= '`') goto yy91;
861
50.5k
      if (yych <= 'f') goto yy107;
862
15
      goto yy91;
863
50.5k
    }
864
180k
yy103:
865
180k
    yych = *++YYCURSOR;
866
180k
    if (yych <= '@') {
867
5.13k
      if (yych <= '/') goto yy91;
868
5.04k
      if (yych <= '9') goto yy109;
869
3
      goto yy91;
870
175k
    } else {
871
175k
      if (yych <= 'F') goto yy109;
872
2.22k
      if (yych <= '`') goto yy91;
873
2.21k
      if (yych <= 'f') goto yy109;
874
9
      goto yy91;
875
2.21k
    }
876
42.5k
yy104:
877
42.5k
    yych = *++YYCURSOR;
878
42.5k
    if (yych <= '@') {
879
36.0k
      if (yych <= '/') goto yy91;
880
35.9k
      if (yych <= '9') goto yy111;
881
7
      goto yy91;
882
35.9k
    } else {
883
6.52k
      if (yych <= 'F') goto yy111;
884
1.30k
      if (yych <= '`') goto yy91;
885
1.29k
      if (yych <= 'f') goto yy111;
886
19
      goto yy91;
887
1.29k
    }
888
3.71k
yy105:
889
3.71k
    yych = *++YYCURSOR;
890
3.71k
    if (yych <= '@') {
891
813
      if (yych <= '/') goto yy91;
892
761
      if (yych <= '9') goto yy113;
893
7
      goto yy91;
894
2.90k
    } else {
895
2.90k
      if (yych <= 'F') goto yy113;
896
865
      if (yych <= '`') goto yy91;
897
854
      if (yych <= 'f') goto yy113;
898
19
      goto yy91;
899
854
    }
900
85
yy106:
901
85
    yych = *++YYCURSOR;
902
85
    if (yych <= '@') {
903
37
      if (yych <= '/') goto yy91;
904
16
      if (yych <= '9') goto yy115;
905
7
      goto yy91;
906
48
    } else {
907
48
      if (yych <= 'F') goto yy115;
908
41
      if (yych <= '`') goto yy91;
909
30
      if (yych <= 'f') goto yy115;
910
21
      goto yy91;
911
30
    }
912
80.3k
yy107:
913
80.3k
    ++YYCURSOR;
914
80.3k
    {
915
80.3k
    s->str_esc += 5;
916
80.3k
    PHP_JSON_CONDITION_GOTO(STR_P1);
917
85
  }
918
180k
yy109:
919
180k
    ++YYCURSOR;
920
180k
    {
921
180k
    s->str_esc += 4;
922
180k
    PHP_JSON_CONDITION_GOTO(STR_P1);
923
85
  }
924
42.4k
yy111:
925
42.4k
    ++YYCURSOR;
926
42.4k
    {
927
42.4k
    s->str_esc += 3;
928
42.4k
    PHP_JSON_CONDITION_GOTO(STR_P1);
929
85
  }
930
3.62k
yy113:
931
3.62k
    yyaccept = 2;
932
3.62k
    yych = *(YYMARKER = ++YYCURSOR);
933
3.62k
    if (yych == '\\') goto yy116;
934
325
yy114:
935
325
    {
936
325
    s->errcode = PHP_JSON_ERROR_UTF16;
937
325
    return PHP_JSON_T_ERROR;
938
3.62k
  }
939
25
yy115:
940
25
    ++YYCURSOR;
941
25
    goto yy114;
942
3.55k
yy116:
943
3.55k
    yych = *++YYCURSOR;
944
3.55k
    if (yych != 'u') goto yy91;
945
3.53k
    yych = *++YYCURSOR;
946
3.53k
    if (yych == 'D') goto yy118;
947
826
    if (yych != 'd') goto yy91;
948
3.52k
yy118:
949
3.52k
    yych = *++YYCURSOR;
950
3.52k
    if (yych <= 'B') goto yy91;
951
3.48k
    if (yych <= 'F') goto yy119;
952
1.78k
    if (yych <= 'b') goto yy91;
953
1.77k
    if (yych >= 'g') goto yy91;
954
3.47k
yy119:
955
3.47k
    yych = *++YYCURSOR;
956
3.47k
    if (yych <= '@') {
957
1.26k
      if (yych <= '/') goto yy91;
958
1.23k
      if (yych >= ':') goto yy91;
959
2.20k
    } else {
960
2.20k
      if (yych <= 'F') goto yy120;
961
1.19k
      if (yych <= '`') goto yy91;
962
1.18k
      if (yych >= 'g') goto yy91;
963
1.18k
    }
964
3.41k
yy120:
965
3.41k
    yych = *++YYCURSOR;
966
3.41k
    if (yych <= '@') {
967
1.42k
      if (yych <= '/') goto yy91;
968
1.37k
      if (yych >= ':') goto yy91;
969
1.98k
    } else {
970
1.98k
      if (yych <= 'F') goto yy121;
971
1.00k
      if (yych <= '`') goto yy91;
972
991
      if (yych >= 'g') goto yy91;
973
991
    }
974
3.32k
yy121:
975
3.32k
    ++YYCURSOR;
976
3.32k
    {
977
3.32k
    s->str_esc += 8;
978
3.32k
    PHP_JSON_CONDITION_GOTO(STR_P1);
979
3.41k
  }
980
/* *********************************** */
981
0
yyc_STR_P2_BIN:
982
0
    yych = *YYCURSOR;
983
0
    if (yych <= 0xDF) {
984
0
      if (yych <= '[') {
985
0
        if (yych == '"') goto yy127;
986
0
      } else {
987
0
        if (yych <= '\\') goto yy129;
988
0
        if (yych <= 0x7F) goto yy125;
989
0
        if (yych <= 0xC1) goto yy131;
990
0
        goto yy133;
991
0
      }
992
0
    } else {
993
0
      if (yych <= 0xEF) {
994
0
        if (yych <= 0xE0) goto yy134;
995
0
        if (yych == 0xED) goto yy136;
996
0
        goto yy135;
997
0
      } else {
998
0
        if (yych <= 0xF0) goto yy137;
999
0
        if (yych <= 0xF3) goto yy138;
1000
0
        if (yych <= 0xF4) goto yy139;
1001
0
        goto yy131;
1002
0
      }
1003
0
    }
1004
0
yy125:
1005
0
    ++YYCURSOR;
1006
0
    { PHP_JSON_CONDITION_GOTO(STR_P2_BIN); }
1007
0
yy127:
1008
0
    ++YYCURSOR;
1009
0
    YYSETCONDITION(yycJS);
1010
0
    {
1011
0
    PHP_JSON_SCANNER_COPY_ESC();
1012
0
    return PHP_JSON_T_STRING;
1013
0
  }
1014
0
yy129:
1015
0
    yyaccept = 0;
1016
0
    yych = *(YYMARKER = ++YYCURSOR);
1017
0
    if (yych == 'u') goto yy140;
1018
0
yy130:
1019
0
    {
1020
0
    unsigned char esc;
1021
0
    PHP_JSON_SCANNER_COPY_ESC();
1022
0
    switch (*s->cursor) {
1023
0
      case 'b':
1024
0
        esc = '\b';
1025
0
        break;
1026
0
      case 'f':
1027
0
        esc = '\f';       break;
1028
0
      case 'n':
1029
0
        esc = '\n';
1030
0
        break;
1031
0
      case 'r':
1032
0
        esc = '\r';
1033
0
        break;
1034
0
      case 't':
1035
0
        esc = '\t';
1036
0
        break;
1037
0
      case '\\':
1038
0
      case '/':
1039
0
      case '"':
1040
0
        esc = *s->cursor;
1041
0
        break;
1042
0
      default:
1043
0
        s->errcode = PHP_JSON_ERROR_SYNTAX;
1044
0
        return PHP_JSON_T_ERROR;
1045
0
    }
1046
0
    *(s->pstr++) = esc;
1047
0
    ++YYCURSOR;
1048
0
    s->str_start = s->cursor;
1049
0
    PHP_JSON_CONDITION_GOTO_STR_P2();
1050
0
  }
1051
0
yy131:
1052
0
    ++YYCURSOR;
1053
0
yy132:
1054
0
    {
1055
0
    if (s->utf8_invalid) {
1056
0
      PHP_JSON_SCANNER_COPY_ESC();
1057
0
      if (s->options & PHP_JSON_INVALID_UTF8_SUBSTITUTE) {
1058
0
        *(s->pstr++) = (unsigned char) (0xe0 | (0xfffd >> 12));
1059
0
        *(s->pstr++) = (unsigned char) (0x80 | ((0xfffd >> 6) & 0x3f));
1060
0
        *(s->pstr++) = (unsigned char) (0x80 | (0xfffd & 0x3f));
1061
0
      }
1062
0
      s->str_start = s->cursor;
1063
0
    }
1064
0
    PHP_JSON_CONDITION_GOTO(STR_P2_BIN);
1065
0
  }
1066
0
yy133:
1067
0
    yych = *++YYCURSOR;
1068
0
    if (yych <= 0x7F) goto yy132;
1069
0
    if (yych <= 0xBF) goto yy125;
1070
0
    goto yy132;
1071
0
yy134:
1072
0
    yyaccept = 1;
1073
0
    yych = *(YYMARKER = ++YYCURSOR);
1074
0
    if (yych <= 0x9F) goto yy132;
1075
0
    if (yych <= 0xBF) goto yy142;
1076
0
    goto yy132;
1077
0
yy135:
1078
0
    yyaccept = 1;
1079
0
    yych = *(YYMARKER = ++YYCURSOR);
1080
0
    if (yych <= 0x7F) goto yy132;
1081
0
    if (yych <= 0xBF) goto yy142;
1082
0
    goto yy132;
1083
0
yy136:
1084
0
    yyaccept = 1;
1085
0
    yych = *(YYMARKER = ++YYCURSOR);
1086
0
    if (yych <= 0x7F) goto yy132;
1087
0
    if (yych <= 0x9F) goto yy142;
1088
0
    goto yy132;
1089
0
yy137:
1090
0
    yyaccept = 1;
1091
0
    yych = *(YYMARKER = ++YYCURSOR);
1092
0
    if (yych <= 0x8F) goto yy132;
1093
0
    if (yych <= 0xBF) goto yy143;
1094
0
    goto yy132;
1095
0
yy138:
1096
0
    yyaccept = 1;
1097
0
    yych = *(YYMARKER = ++YYCURSOR);
1098
0
    if (yych <= 0x7F) goto yy132;
1099
0
    if (yych <= 0xBF) goto yy143;
1100
0
    goto yy132;
1101
0
yy139:
1102
0
    yyaccept = 1;
1103
0
    yych = *(YYMARKER = ++YYCURSOR);
1104
0
    if (yych <= 0x7F) goto yy132;
1105
0
    if (yych <= 0x8F) goto yy143;
1106
0
    goto yy132;
1107
0
yy140:
1108
0
    yych = *++YYCURSOR;
1109
0
    if (yych <= 'D') {
1110
0
      if (yych <= '9') {
1111
0
        if (yych <= '/') goto yy141;
1112
0
        if (yych <= '0') goto yy144;
1113
0
        goto yy145;
1114
0
      } else {
1115
0
        if (yych <= '@') goto yy141;
1116
0
        if (yych <= 'C') goto yy145;
1117
0
        goto yy146;
1118
0
      }
1119
0
    } else {
1120
0
      if (yych <= 'c') {
1121
0
        if (yych <= 'F') goto yy145;
1122
0
        if (yych >= 'a') goto yy145;
1123
0
      } else {
1124
0
        if (yych <= 'd') goto yy146;
1125
0
        if (yych <= 'f') goto yy145;
1126
0
      }
1127
0
    }
1128
0
yy141:
1129
0
    YYCURSOR = YYMARKER;
1130
0
    if (yyaccept == 0) {
1131
0
      goto yy130;
1132
0
    } else {
1133
0
      goto yy132;
1134
0
    }
1135
0
yy142:
1136
0
    yych = *++YYCURSOR;
1137
0
    if (yych <= 0x7F) goto yy141;
1138
0
    if (yych <= 0xBF) goto yy125;
1139
0
    goto yy141;
1140
0
yy143:
1141
0
    yych = *++YYCURSOR;
1142
0
    if (yych <= 0x7F) goto yy141;
1143
0
    if (yych <= 0xBF) goto yy142;
1144
0
    goto yy141;
1145
0
yy144:
1146
0
    yych = *++YYCURSOR;
1147
0
    if (yych <= '9') {
1148
0
      if (yych <= '/') goto yy141;
1149
0
      if (yych <= '0') goto yy147;
1150
0
      if (yych <= '7') goto yy148;
1151
0
      goto yy149;
1152
0
    } else {
1153
0
      if (yych <= 'F') {
1154
0
        if (yych <= '@') goto yy141;
1155
0
        goto yy149;
1156
0
      } else {
1157
0
        if (yych <= '`') goto yy141;
1158
0
        if (yych <= 'f') goto yy149;
1159
0
        goto yy141;
1160
0
      }
1161
0
    }
1162
0
yy145:
1163
0
    yych = *++YYCURSOR;
1164
0
    if (yych <= '@') {
1165
0
      if (yych <= '/') goto yy141;
1166
0
      if (yych <= '9') goto yy149;
1167
0
      goto yy141;
1168
0
    } else {
1169
0
      if (yych <= 'F') goto yy149;
1170
0
      if (yych <= '`') goto yy141;
1171
0
      if (yych <= 'f') goto yy149;
1172
0
      goto yy141;
1173
0
    }
1174
0
yy146:
1175
0
    yych = *++YYCURSOR;
1176
0
    if (yych <= '@') {
1177
0
      if (yych <= '/') goto yy141;
1178
0
      if (yych <= '7') goto yy149;
1179
0
      if (yych <= '9') goto yy150;
1180
0
      goto yy141;
1181
0
    } else {
1182
0
      if (yych <= 'B') goto yy150;
1183
0
      if (yych <= '`') goto yy141;
1184
0
      if (yych <= 'b') goto yy150;
1185
0
      goto yy141;
1186
0
    }
1187
0
yy147:
1188
0
    yych = *++YYCURSOR;
1189
0
    if (yych <= '@') {
1190
0
      if (yych <= '/') goto yy141;
1191
0
      if (yych <= '7') goto yy151;
1192
0
      if (yych <= '9') goto yy152;
1193
0
      goto yy141;
1194
0
    } else {
1195
0
      if (yych <= 'F') goto yy152;
1196
0
      if (yych <= '`') goto yy141;
1197
0
      if (yych <= 'f') goto yy152;
1198
0
      goto yy141;
1199
0
    }
1200
0
yy148:
1201
0
    yych = *++YYCURSOR;
1202
0
    if (yych <= '@') {
1203
0
      if (yych <= '/') goto yy141;
1204
0
      if (yych <= '9') goto yy152;
1205
0
      goto yy141;
1206
0
    } else {
1207
0
      if (yych <= 'F') goto yy152;
1208
0
      if (yych <= '`') goto yy141;
1209
0
      if (yych <= 'f') goto yy152;
1210
0
      goto yy141;
1211
0
    }
1212
0
yy149:
1213
0
    yych = *++YYCURSOR;
1214
0
    if (yych <= '@') {
1215
0
      if (yych <= '/') goto yy141;
1216
0
      if (yych <= '9') goto yy153;
1217
0
      goto yy141;
1218
0
    } else {
1219
0
      if (yych <= 'F') goto yy153;
1220
0
      if (yych <= '`') goto yy141;
1221
0
      if (yych <= 'f') goto yy153;
1222
0
      goto yy141;
1223
0
    }
1224
0
yy150:
1225
0
    yych = *++YYCURSOR;
1226
0
    if (yych <= '@') {
1227
0
      if (yych <= '/') goto yy141;
1228
0
      if (yych <= '9') goto yy154;
1229
0
      goto yy141;
1230
0
    } else {
1231
0
      if (yych <= 'F') goto yy154;
1232
0
      if (yych <= '`') goto yy141;
1233
0
      if (yych <= 'f') goto yy154;
1234
0
      goto yy141;
1235
0
    }
1236
0
yy151:
1237
0
    yych = *++YYCURSOR;
1238
0
    if (yych <= '@') {
1239
0
      if (yych <= '/') goto yy141;
1240
0
      if (yych <= '9') goto yy155;
1241
0
      goto yy141;
1242
0
    } else {
1243
0
      if (yych <= 'F') goto yy155;
1244
0
      if (yych <= '`') goto yy141;
1245
0
      if (yych <= 'f') goto yy155;
1246
0
      goto yy141;
1247
0
    }
1248
0
yy152:
1249
0
    yych = *++YYCURSOR;
1250
0
    if (yych <= '@') {
1251
0
      if (yych <= '/') goto yy141;
1252
0
      if (yych <= '9') goto yy157;
1253
0
      goto yy141;
1254
0
    } else {
1255
0
      if (yych <= 'F') goto yy157;
1256
0
      if (yych <= '`') goto yy141;
1257
0
      if (yych <= 'f') goto yy157;
1258
0
      goto yy141;
1259
0
    }
1260
0
yy153:
1261
0
    yych = *++YYCURSOR;
1262
0
    if (yych <= '@') {
1263
0
      if (yych <= '/') goto yy141;
1264
0
      if (yych <= '9') goto yy159;
1265
0
      goto yy141;
1266
0
    } else {
1267
0
      if (yych <= 'F') goto yy159;
1268
0
      if (yych <= '`') goto yy141;
1269
0
      if (yych <= 'f') goto yy159;
1270
0
      goto yy141;
1271
0
    }
1272
0
yy154:
1273
0
    yych = *++YYCURSOR;
1274
0
    if (yych <= '@') {
1275
0
      if (yych <= '/') goto yy141;
1276
0
      if (yych <= '9') goto yy161;
1277
0
      goto yy141;
1278
0
    } else {
1279
0
      if (yych <= 'F') goto yy161;
1280
0
      if (yych <= '`') goto yy141;
1281
0
      if (yych <= 'f') goto yy161;
1282
0
      goto yy141;
1283
0
    }
1284
0
yy155:
1285
0
    ++YYCURSOR;
1286
0
    {
1287
0
    int utf16 = php_json_ucs2_to_int(s, 2);
1288
0
    PHP_JSON_SCANNER_COPY_UTF();
1289
0
    *(s->pstr++) = (unsigned char) utf16;
1290
0
    s->str_start = s->cursor;
1291
0
    PHP_JSON_CONDITION_GOTO_STR_P2();
1292
0
  }
1293
0
yy157:
1294
0
    ++YYCURSOR;
1295
0
    {
1296
0
    int utf16 = php_json_ucs2_to_int(s, 3);
1297
0
    PHP_JSON_SCANNER_COPY_UTF();
1298
0
    *(s->pstr++) = (unsigned char) (0xc0 | (utf16 >> 6));
1299
0
    *(s->pstr++) = (unsigned char) (0x80 | (utf16 & 0x3f));
1300
0
    s->str_start = s->cursor;
1301
0
    PHP_JSON_CONDITION_GOTO_STR_P2();
1302
0
  }
1303
0
yy159:
1304
0
    ++YYCURSOR;
1305
0
    {
1306
0
    int utf16 = php_json_ucs2_to_int(s, 4);
1307
0
    PHP_JSON_SCANNER_COPY_UTF();
1308
0
    *(s->pstr++) = (unsigned char) (0xe0 | (utf16 >> 12));
1309
0
    *(s->pstr++) = (unsigned char) (0x80 | ((utf16 >> 6) & 0x3f));
1310
0
    *(s->pstr++) = (unsigned char) (0x80 | (utf16 & 0x3f));
1311
0
    s->str_start = s->cursor;
1312
0
    PHP_JSON_CONDITION_GOTO_STR_P2();
1313
0
  }
1314
0
yy161:
1315
0
    yych = *++YYCURSOR;
1316
0
    if (yych != '\\') goto yy141;
1317
0
    yych = *++YYCURSOR;
1318
0
    if (yych != 'u') goto yy141;
1319
0
    yych = *++YYCURSOR;
1320
0
    if (yych == 'D') goto yy164;
1321
0
    if (yych != 'd') goto yy141;
1322
0
yy164:
1323
0
    yych = *++YYCURSOR;
1324
0
    if (yych <= 'B') goto yy141;
1325
0
    if (yych <= 'F') goto yy165;
1326
0
    if (yych <= 'b') goto yy141;
1327
0
    if (yych >= 'g') goto yy141;
1328
0
yy165:
1329
0
    yych = *++YYCURSOR;
1330
0
    if (yych <= '@') {
1331
0
      if (yych <= '/') goto yy141;
1332
0
      if (yych >= ':') goto yy141;
1333
0
    } else {
1334
0
      if (yych <= 'F') goto yy166;
1335
0
      if (yych <= '`') goto yy141;
1336
0
      if (yych >= 'g') goto yy141;
1337
0
    }
1338
0
yy166:
1339
0
    yych = *++YYCURSOR;
1340
0
    if (yych <= '@') {
1341
0
      if (yych <= '/') goto yy141;
1342
0
      if (yych >= ':') goto yy141;
1343
0
    } else {
1344
0
      if (yych <= 'F') goto yy167;
1345
0
      if (yych <= '`') goto yy141;
1346
0
      if (yych >= 'g') goto yy141;
1347
0
    }
1348
0
yy167:
1349
0
    ++YYCURSOR;
1350
0
    {
1351
0
    int utf32, utf16_hi, utf16_lo;
1352
0
    utf16_hi = php_json_ucs2_to_int(s, 4);
1353
0
    utf16_lo = php_json_ucs2_to_int_ex(s, 4, 7);
1354
0
    utf32 = ((utf16_lo & 0x3FF) << 10) + (utf16_hi & 0x3FF) + 0x10000;
1355
0
    PHP_JSON_SCANNER_COPY_UTF_SP();
1356
0
    *(s->pstr++) = (unsigned char) (0xf0 | (utf32 >> 18));
1357
0
    *(s->pstr++) = (unsigned char) (0x80 | ((utf32 >> 12) & 0x3f));
1358
0
    *(s->pstr++) = (unsigned char) (0x80 | ((utf32 >> 6) & 0x3f));
1359
0
    *(s->pstr++) = (unsigned char) (0x80 | (utf32 & 0x3f));
1360
0
    s->str_start = s->cursor;
1361
0
    PHP_JSON_CONDITION_GOTO_STR_P2();
1362
0
  }
1363
/* *********************************** */
1364
22.7M
yyc_STR_P2_UTF:
1365
22.7M
    yych = *YYCURSOR;
1366
22.7M
    if (yych == '"') goto yy173;
1367
22.7M
    if (yych == '\\') goto yy175;
1368
22.4M
    ++YYCURSOR;
1369
22.4M
    { PHP_JSON_CONDITION_GOTO(STR_P2_UTF); }
1370
3.27k
yy173:
1371
3.27k
    ++YYCURSOR;
1372
3.27k
    YYSETCONDITION(yycJS);
1373
3.27k
    {
1374
3.27k
    PHP_JSON_SCANNER_COPY_ESC();
1375
3.27k
    return PHP_JSON_T_STRING;
1376
22.7M
  }
1377
342k
yy175:
1378
342k
    yych = *(YYMARKER = ++YYCURSOR);
1379
342k
    if (yych == 'u') goto yy177;
1380
40.5k
yy176:
1381
40.5k
    {
1382
40.5k
    unsigned char esc;
1383
40.5k
    PHP_JSON_SCANNER_COPY_ESC();
1384
40.5k
    switch (*s->cursor) {
1385
239
      case 'b':
1386
239
        esc = '\b';
1387
239
        break;
1388
486
      case 'f':
1389
486
        esc = '\f';       break;
1390
304
      case 'n':
1391
304
        esc = '\n';
1392
304
        break;
1393
224
      case 'r':
1394
224
        esc = '\r';
1395
224
        break;
1396
286
      case 't':
1397
286
        esc = '\t';
1398
286
        break;
1399
3.87k
      case '\\':
1400
4.33k
      case '/':
1401
39.0k
      case '"':
1402
39.0k
        esc = *s->cursor;
1403
39.0k
        break;
1404
0
      default:
1405
0
        s->errcode = PHP_JSON_ERROR_SYNTAX;
1406
0
        return PHP_JSON_T_ERROR;
1407
40.5k
    }
1408
40.5k
    *(s->pstr++) = esc;
1409
40.5k
    ++YYCURSOR;
1410
40.5k
    s->str_start = s->cursor;
1411
40.5k
    PHP_JSON_CONDITION_GOTO_STR_P2();
1412
40.5k
  }
1413
301k
yy177:
1414
301k
    yych = *++YYCURSOR;
1415
301k
    if (yych <= 'D') {
1416
300k
      if (yych <= '9') {
1417
298k
        if (yych <= '/') goto yy178;
1418
298k
        if (yych <= '0') goto yy179;
1419
34.3k
        goto yy180;
1420
298k
      } else {
1421
1.78k
        if (yych <= '@') goto yy178;
1422
1.78k
        if (yych <= 'C') goto yy180;
1423
1.56k
        goto yy181;
1424
1.78k
      }
1425
300k
    } else {
1426
1.41k
      if (yych <= 'c') {
1427
462
        if (yych <= 'F') goto yy180;
1428
215
        if (yych >= 'a') goto yy180;
1429
953
      } else {
1430
953
        if (yych <= 'd') goto yy181;
1431
289
        if (yych <= 'f') goto yy180;
1432
289
      }
1433
1.41k
    }
1434
0
yy178:
1435
0
    YYCURSOR = YYMARKER;
1436
0
    goto yy176;
1437
264k
yy179:
1438
264k
    yych = *++YYCURSOR;
1439
264k
    if (yych <= '9') {
1440
259k
      if (yych <= '/') goto yy178;
1441
259k
      if (yych <= '0') goto yy182;
1442
6.49k
      if (yych <= '7') goto yy183;
1443
371
      goto yy184;
1444
6.49k
    } else {
1445
4.51k
      if (yych <= 'F') {
1446
248
        if (yych <= '@') goto yy178;
1447
248
        goto yy184;
1448
4.26k
      } else {
1449
4.26k
        if (yych <= '`') goto yy178;
1450
4.26k
        if (yych <= 'f') goto yy184;
1451
0
        goto yy178;
1452
4.26k
      }
1453
4.51k
    }
1454
35.3k
yy180:
1455
35.3k
    yych = *++YYCURSOR;
1456
35.3k
    if (yych <= '@') {
1457
5.25k
      if (yych <= '/') goto yy178;
1458
5.25k
      if (yych <= '9') goto yy184;
1459
0
      goto yy178;
1460
30.1k
    } else {
1461
30.1k
      if (yych <= 'F') goto yy184;
1462
29.8k
      if (yych <= '`') goto yy178;
1463
29.8k
      if (yych <= 'f') goto yy184;
1464
0
      goto yy178;
1465
29.8k
    }
1466
2.22k
yy181:
1467
2.22k
    yych = *++YYCURSOR;
1468
2.22k
    if (yych <= '@') {
1469
969
      if (yych <= '/') goto yy178;
1470
969
      if (yych <= '7') goto yy184;
1471
385
      if (yych <= '9') goto yy185;
1472
0
      goto yy178;
1473
1.25k
    } else {
1474
1.25k
      if (yych <= 'B') goto yy185;
1475
423
      if (yych <= '`') goto yy178;
1476
423
      if (yych <= 'b') goto yy185;
1477
0
      goto yy178;
1478
423
    }
1479
253k
yy182:
1480
253k
    yych = *++YYCURSOR;
1481
253k
    if (yych <= '@') {
1482
80.4k
      if (yych <= '/') goto yy178;
1483
80.4k
      if (yych <= '7') goto yy186;
1484
317
      if (yych <= '9') goto yy187;
1485
0
      goto yy178;
1486
172k
    } else {
1487
172k
      if (yych <= 'F') goto yy187;
1488
1.95k
      if (yych <= '`') goto yy178;
1489
1.95k
      if (yych <= 'f') goto yy187;
1490
0
      goto yy178;
1491
1.95k
    }
1492
6.12k
yy183:
1493
6.12k
    yych = *++YYCURSOR;
1494
6.12k
    if (yych <= '@') {
1495
2.33k
      if (yych <= '/') goto yy178;
1496
2.33k
      if (yych <= '9') goto yy187;
1497
0
      goto yy178;
1498
3.79k
    } else {
1499
3.79k
      if (yych <= 'F') goto yy187;
1500
1.62k
      if (yych <= '`') goto yy178;
1501
1.62k
      if (yych <= 'f') goto yy187;
1502
0
      goto yy178;
1503
1.62k
    }
1504
40.8k
yy184:
1505
40.8k
    yych = *++YYCURSOR;
1506
40.8k
    if (yych <= '@') {
1507
35.1k
      if (yych <= '/') goto yy178;
1508
35.1k
      if (yych <= '9') goto yy188;
1509
0
      goto yy178;
1510
35.1k
    } else {
1511
5.67k
      if (yych <= 'F') goto yy188;
1512
668
      if (yych <= '`') goto yy178;
1513
668
      if (yych <= 'f') goto yy188;
1514
0
      goto yy178;
1515
668
    }
1516
1.64k
yy185:
1517
1.64k
    yych = *++YYCURSOR;
1518
1.64k
    if (yych <= '@') {
1519
540
      if (yych <= '/') goto yy178;
1520
540
      if (yych <= '9') goto yy189;
1521
0
      goto yy178;
1522
1.10k
    } else {
1523
1.10k
      if (yych <= 'F') goto yy189;
1524
725
      if (yych <= '`') goto yy178;
1525
725
      if (yych <= 'f') goto yy189;
1526
0
      goto yy178;
1527
725
    }
1528
80.1k
yy186:
1529
80.1k
    yych = *++YYCURSOR;
1530
80.1k
    if (yych <= '@') {
1531
5.98k
      if (yych <= '/') goto yy178;
1532
5.98k
      if (yych <= '9') goto yy190;
1533
0
      goto yy178;
1534
74.1k
    } else {
1535
74.1k
      if (yych <= 'F') goto yy190;
1536
50.4k
      if (yych <= '`') goto yy178;
1537
50.4k
      if (yych <= 'f') goto yy190;
1538
0
      goto yy178;
1539
50.4k
    }
1540
179k
yy187:
1541
179k
    yych = *++YYCURSOR;
1542
179k
    if (yych <= '@') {
1543
4.82k
      if (yych <= '/') goto yy178;
1544
4.82k
      if (yych <= '9') goto yy192;
1545
0
      goto yy178;
1546
174k
    } else {
1547
174k
      if (yych <= 'F') goto yy192;
1548
2.05k
      if (yych <= '`') goto yy178;
1549
2.05k
      if (yych <= 'f') goto yy192;
1550
0
      goto yy178;
1551
2.05k
    }
1552
40.8k
yy188:
1553
40.8k
    yych = *++YYCURSOR;
1554
40.8k
    if (yych <= '@') {
1555
35.1k
      if (yych <= '/') goto yy178;
1556
35.1k
      if (yych <= '9') goto yy194;
1557
0
      goto yy178;
1558
35.1k
    } else {
1559
5.68k
      if (yych <= 'F') goto yy194;
1560
926
      if (yych <= '`') goto yy178;
1561
926
      if (yych <= 'f') goto yy194;
1562
0
      goto yy178;
1563
926
    }
1564
1.64k
yy189:
1565
1.64k
    yych = *++YYCURSOR;
1566
1.64k
    if (yych <= '@') {
1567
379
      if (yych <= '/') goto yy178;
1568
379
      if (yych <= '9') goto yy196;
1569
0
      goto yy178;
1570
1.26k
    } else {
1571
1.26k
      if (yych <= 'F') goto yy196;
1572
266
      if (yych <= '`') goto yy178;
1573
266
      if (yych <= 'f') goto yy196;
1574
0
      goto yy178;
1575
266
    }
1576
80.1k
yy190:
1577
80.1k
    ++YYCURSOR;
1578
80.1k
    {
1579
80.1k
    int utf16 = php_json_ucs2_to_int(s, 2);
1580
80.1k
    PHP_JSON_SCANNER_COPY_UTF();
1581
80.1k
    *(s->pstr++) = (unsigned char) utf16;
1582
80.1k
    s->str_start = s->cursor;
1583
80.1k
    PHP_JSON_CONDITION_GOTO_STR_P2();
1584
80.1k
  }
1585
179k
yy192:
1586
179k
    ++YYCURSOR;
1587
179k
    {
1588
179k
    int utf16 = php_json_ucs2_to_int(s, 3);
1589
179k
    PHP_JSON_SCANNER_COPY_UTF();
1590
179k
    *(s->pstr++) = (unsigned char) (0xc0 | (utf16 >> 6));
1591
179k
    *(s->pstr++) = (unsigned char) (0x80 | (utf16 & 0x3f));
1592
179k
    s->str_start = s->cursor;
1593
179k
    PHP_JSON_CONDITION_GOTO_STR_P2();
1594
179k
  }
1595
40.8k
yy194:
1596
40.8k
    ++YYCURSOR;
1597
40.8k
    {
1598
40.8k
    int utf16 = php_json_ucs2_to_int(s, 4);
1599
40.8k
    PHP_JSON_SCANNER_COPY_UTF();
1600
40.8k
    *(s->pstr++) = (unsigned char) (0xe0 | (utf16 >> 12));
1601
40.8k
    *(s->pstr++) = (unsigned char) (0x80 | ((utf16 >> 6) & 0x3f));
1602
40.8k
    *(s->pstr++) = (unsigned char) (0x80 | (utf16 & 0x3f));
1603
40.8k
    s->str_start = s->cursor;
1604
40.8k
    PHP_JSON_CONDITION_GOTO_STR_P2();
1605
40.8k
  }
1606
1.64k
yy196:
1607
1.64k
    yych = *++YYCURSOR;
1608
1.64k
    if (yych != '\\') goto yy178;
1609
1.64k
    yych = *++YYCURSOR;
1610
1.64k
    if (yych != 'u') goto yy178;
1611
1.64k
    yych = *++YYCURSOR;
1612
1.64k
    if (yych == 'D') goto yy199;
1613
273
    if (yych != 'd') goto yy178;
1614
1.64k
yy199:
1615
1.64k
    yych = *++YYCURSOR;
1616
1.64k
    if (yych <= 'B') goto yy178;
1617
1.64k
    if (yych <= 'F') goto yy200;
1618
783
    if (yych <= 'b') goto yy178;
1619
783
    if (yych >= 'g') goto yy178;
1620
1.64k
yy200:
1621
1.64k
    yych = *++YYCURSOR;
1622
1.64k
    if (yych <= '@') {
1623
752
      if (yych <= '/') goto yy178;
1624
752
      if (yych >= ':') goto yy178;
1625
889
    } else {
1626
889
      if (yych <= 'F') goto yy201;
1627
434
      if (yych <= '`') goto yy178;
1628
434
      if (yych >= 'g') goto yy178;
1629
434
    }
1630
1.64k
yy201:
1631
1.64k
    yych = *++YYCURSOR;
1632
1.64k
    if (yych <= '@') {
1633
790
      if (yych <= '/') goto yy178;
1634
790
      if (yych >= ':') goto yy178;
1635
851
    } else {
1636
851
      if (yych <= 'F') goto yy202;
1637
356
      if (yych <= '`') goto yy178;
1638
356
      if (yych >= 'g') goto yy178;
1639
356
    }
1640
1.64k
yy202:
1641
1.64k
    ++YYCURSOR;
1642
1.64k
    {
1643
1.64k
    int utf32, utf16_hi, utf16_lo;
1644
1.64k
    utf16_hi = php_json_ucs2_to_int(s, 4);
1645
1.64k
    utf16_lo = php_json_ucs2_to_int_ex(s, 4, 7);
1646
1.64k
    utf32 = ((utf16_lo & 0x3FF) << 10) + (utf16_hi & 0x3FF) + 0x10000;
1647
1.64k
    PHP_JSON_SCANNER_COPY_UTF_SP();
1648
1.64k
    *(s->pstr++) = (unsigned char) (0xf0 | (utf32 >> 18));
1649
1.64k
    *(s->pstr++) = (unsigned char) (0x80 | ((utf32 >> 12) & 0x3f));
1650
1.64k
    *(s->pstr++) = (unsigned char) (0x80 | ((utf32 >> 6) & 0x3f));
1651
1.64k
    *(s->pstr++) = (unsigned char) (0x80 | (utf32 & 0x3f));
1652
1.64k
    s->str_start = s->cursor;
1653
1.64k
    PHP_JSON_CONDITION_GOTO_STR_P2();
1654
1.64k
  }
1655
1.64k
  }
1656
1657
1658
1.64k
}