#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
size_t scan(const char *s, int l, char *r) {
  const char *p = s;
  const char *q;
  while (1) {
    {
      char yych;
      if (((s + l) - p) < 2)
        ;
      yych = *p;
      if (yych != '?')
        goto yy4;
      yych = *++p;
      if (yych <= '9') {
        if (yych == '!')
          goto yy9;
        if (yych >= '0')
          goto yy6;
      } else {
        if (yych <= 'Z') {
          if (yych >= 'A')
            goto yy6;
        } else {
          if (yych <= '`')
            goto yy3;
          if (yych <= 'z')
            goto yy6;
        }
      }
    yy3:
    yy4:
      ++p;
      {
        *r++ = '0';
        *r++ = '\0';
        return p - s;
      }
    yy6:
      ++p;
      if ((s + l) <= p)
        ;
      yych = *p;
      if (yych <= '@') {
        if (yych <= '/')
          goto yy8;
        if (yych <= '9')
          goto yy6;
      } else {
        if (yych <= 'Z')
          goto yy6;
        if (yych <= '`')
          goto yy8;
        if (yych <= 'z')
          goto yy6;
      }
    yy8 : {
      *r++ = '2';
      continue;
    }
    yy9:
      ++p;
      if ((s + l) <= p)
        ;
      yych = *p;
      if (yych <= '@') {
        if (yych <= '/')
          goto yy11;
        if (yych <= '9')
          goto yy9;
      } else {
        if (yych <= 'Z')
          goto yy9;
        if (yych <= '`')
          goto yy11;
        if (yych <= 'z')
          goto yy9;
      }
    yy11 : {
      *r++ = '1';
      continue;
    }
    }
  }
}


x86 assembly (clang, -O0):
<scan>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %rdx,-0x18(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
add    %rcx,%rax
mov    -0x20(%rbp),%rcx
sub    %rcx,%rax
cmp    $0x2,%rax
jge    1138 <scan+0x38>
jmp    1138 <scan+0x38>
mov    -0x20(%rbp),%rax
mov    (%rax),%al
mov    %al,-0x29(%rbp)
movsbl -0x29(%rbp),%eax
cmp    $0x3f,%eax
je     1153 <scan+0x53>
jmp    11fa <scan+0xfa>
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x20(%rbp)
mov    0x1(%rax),%al
mov    %al,-0x29(%rbp)
movsbl -0x29(%rbp),%eax
cmp    $0x39,%eax
jg     119e <scan+0x9e>
movsbl -0x29(%rbp),%eax
cmp    $0x21,%eax
jne    1187 <scan+0x87>
jmp    12f3 <scan+0x1f3>
movsbl -0x29(%rbp),%eax
cmp    $0x30,%eax
jl     1199 <scan+0x99>
jmp    1237 <scan+0x137>
jmp    11f0 <scan+0xf0>
movsbl -0x29(%rbp),%eax
cmp    $0x5a,%eax
jg     11c2 <scan+0xc2>
movsbl -0x29(%rbp),%eax
cmp    $0x41,%eax
jl     11bd <scan+0xbd>
jmp    1237 <scan+0x137>
jmp    11eb <scan+0xeb>
movsbl -0x29(%rbp),%eax
cmp    $0x60,%eax
jg     11d4 <scan+0xd4>
jmp    11f5 <scan+0xf5>
movsbl -0x29(%rbp),%eax
cmp    $0x7a,%eax
jg     11e6 <scan+0xe6>
jmp    1237 <scan+0x137>
jmp    11eb <scan+0xeb>
jmp    11f0 <scan+0xf0>
jmp    11f5 <scan+0xf5>
jmp    11fa <scan+0xfa>
mov    -0x20(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x20(%rbp)
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x18(%rbp)
movb   $0x30,(%rax)
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x18(%rbp)
movb   $0x0,(%rax)
mov    -0x20(%rbp),%rax
mov    -0x8(%rbp),%rcx
sub    %rcx,%rax
pop    %rbp
ret
mov    -0x20(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x20(%rbp)
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
add    %rcx,%rax
cmp    -0x20(%rbp),%rax
ja     125d <scan+0x15d>
jmp    125d <scan+0x15d>
mov    -0x20(%rbp),%rax
mov    (%rax),%al
mov    %al,-0x29(%rbp)
movsbl -0x29(%rbp),%eax
cmp    $0x40,%eax
jg     129c <scan+0x19c>
movsbl -0x29(%rbp),%eax
cmp    $0x2f,%eax
jg     1285 <scan+0x185>
jmp    12dc <scan+0x1dc>
movsbl -0x29(%rbp),%eax
cmp    $0x39,%eax
jg     1297 <scan+0x197>
jmp    1237 <scan+0x137>
jmp    12d7 <scan+0x1d7>
movsbl -0x29(%rbp),%eax
cmp    $0x5a,%eax
jg     12ae <scan+0x1ae>
jmp    1237 <scan+0x137>
movsbl -0x29(%rbp),%eax
cmp    $0x60,%eax
jg     12c0 <scan+0x1c0>
jmp    12dc <scan+0x1dc>
movsbl -0x29(%rbp),%eax
cmp    $0x7a,%eax
jg     12d2 <scan+0x1d2>
jmp    1237 <scan+0x137>
jmp    12d7 <scan+0x1d7>
jmp    12dc <scan+0x1dc>
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x18(%rbp)
movb   $0x32,(%rax)
jmp    1117 <scan+0x17>
mov    -0x20(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x20(%rbp)
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
add    %rcx,%rax
cmp    -0x20(%rbp),%rax
ja     1319 <scan+0x219>
jmp    1319 <scan+0x219>
mov    -0x20(%rbp),%rax
mov    (%rax),%al
mov    %al,-0x29(%rbp)
movsbl -0x29(%rbp),%eax
cmp    $0x40,%eax
jg     1358 <scan+0x258>
movsbl -0x29(%rbp),%eax
cmp    $0x2f,%eax
jg     1341 <scan+0x241>
jmp    1398 <scan+0x298>
movsbl -0x29(%rbp),%eax
cmp    $0x39,%eax
jg     1353 <scan+0x253>
jmp    12f3 <scan+0x1f3>
jmp    1393 <scan+0x293>
movsbl -0x29(%rbp),%eax
cmp    $0x5a,%eax
jg     136a <scan+0x26a>
jmp    12f3 <scan+0x1f3>
movsbl -0x29(%rbp),%eax
cmp    $0x60,%eax
jg     137c <scan+0x27c>
jmp    1398 <scan+0x298>
movsbl -0x29(%rbp),%eax
cmp    $0x7a,%eax
jg     138e <scan+0x28e>
jmp    12f3 <scan+0x1f3>
jmp    1393 <scan+0x293>
jmp    1398 <scan+0x298>
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x18(%rbp)
movb   $0x31,(%rax)
jmp    1117 <scan+0x17>

x86 assembly (clang, -O2):
<scan>:
cmpb   $0x3f,(%rdi)
jne    11ca <scan+0xca>
mov    %rdi,%rax
jmp    1121 <scan+0x21>
xchg   %ax,%ax
mov    $0x32,%cl
mov    %cl,(%rdx)
add    $0x1,%rdx
cmpb   $0x3f,(%rax)
jne    11d2 <scan+0xd2>
lea    0x1(%rax),%rsi
mov    0x1(%rax),%cl
cmp    $0x39,%cl
jg     1170 <scan+0x70>
cmp    $0x21,%cl
jne    1180 <scan+0x80>
add    $0x2,%rax
jmp    114c <scan+0x4c>
nopl   0x0(%rax,%rax,1)
add    $0xd0,%cl
cmp    $0xa,%cl
jae    1161 <scan+0x61>
add    $0x1,%rax
movzbl (%rax),%ecx
cmp    $0x40,%cl
jle    1140 <scan+0x40>
cmp    $0x5b,%cl
jb     1148 <scan+0x48>
add    $0x9f,%cl
cmp    $0x19,%cl
jbe    1148 <scan+0x48>
mov    $0x31,%cl
jmp    1112 <scan+0x12>
cs nopw 0x0(%rax,%rax,1)
nop
cmp    $0x5a,%cl
ja     1190 <scan+0x90>
cmp    $0x40,%cl
ja     1198 <scan+0x98>
jmp    11cf <scan+0xcf>
nopl   0x0(%rax)
cmp    $0x2f,%cl
jg     1198 <scan+0x98>
jmp    11cf <scan+0xcf>
nopw   0x0(%rax,%rax,1)
add    $0x9f,%cl
cmp    $0x19,%cl
ja     11cf <scan+0xcf>
add    $0x2,%rax
jmp    11b0 <scan+0xb0>
xchg   %ax,%ax
add    $0xd0,%cl
cmp    $0xa,%cl
jae    1110 <scan+0x10>
add    $0x1,%rax
movzbl (%rax),%ecx
cmp    $0x40,%cl
jle    11a0 <scan+0xa0>
cmp    $0x5b,%cl
jb     11ac <scan+0xac>
add    $0x9f,%cl
cmp    $0x19,%cl
jbe    11ac <scan+0xac>
jmp    1110 <scan+0x10>
mov    %rdi,%rax
jmp    11d2 <scan+0xd2>
mov    %rsi,%rax
movw   $0x30,(%rdx)
sub    %rdi,%rax
add    $0x1,%rax
ret

LLVM IR (-O0):
define i64 @scan(i8* %0, i32 %1, i8* %2) {
%4 = alloca i8*
%5 = alloca i32
%6 = alloca i8*
%7 = alloca i8*
%8 = alloca i8*
%9 = alloca i8
store i8* %0, i8** %4
store i32 %1, i32* %5
store i8* %2, i8** %6
%10 = load i8*, i8** %4
store i8* %10, i8** %7
br label %11
11: ; preds = %3, %127, %174
%12 = load i8*, i8** %4
%13 = load i32, i32* %5
%14 = sext i32 %13 to i64
%15 = getelementptr inbounds i8, i8* %12, i64 %14
%16 = load i8*, i8** %7
%17 = ptrtoint i8* %15 to i64
%18 = ptrtoint i8* %16 to i64
%19 = sub i64 %17, %18
%20 = icmp slt i64 %19, 2
br i1 %20, label %21, label %22
21: ; preds = %11
br label %22
22: ; preds = %21, %11
%23 = load i8*, i8** %7
%24 = load i8, i8* %23
store i8 %24, i8* %9
%25 = load i8, i8* %9
%26 = sext i8 %25 to i32
%27 = icmp ne i32 %26, 63
br i1 %27, label %28, label %29
28: ; preds = %22
br label %71
29: ; preds = %22
%30 = load i8*, i8** %7
%31 = getelementptr inbounds i8, i8* %30, i32 1
store i8* %31, i8** %7
%32 = load i8, i8* %31
store i8 %32, i8* %9
%33 = load i8, i8* %9
%34 = sext i8 %33 to i32
%35 = icmp sle i32 %34, 57
br i1 %35, label %36, label %47
36: ; preds = %29
%37 = load i8, i8* %9
%38 = sext i8 %37 to i32
%39 = icmp eq i32 %38, 33
br i1 %39, label %40, label %41
40: ; preds = %36
br label %130
41: ; preds = %36
%42 = load i8, i8* %9
%43 = sext i8 %42 to i32
%44 = icmp sge i32 %43, 48
br i1 %44, label %45, label %46
45: ; preds = %41
br label %83
46: ; preds = %41
br label %69
47: ; preds = %29
%48 = load i8, i8* %9
%49 = sext i8 %48 to i32
%50 = icmp sle i32 %49, 90
br i1 %50, label %51, label %57
51: ; preds = %47
%52 = load i8, i8* %9
%53 = sext i8 %52 to i32
%54 = icmp sge i32 %53, 65
br i1 %54, label %55, label %56
55: ; preds = %51
br label %83
56: ; preds = %51
br label %68
57: ; preds = %47
%58 = load i8, i8* %9
%59 = sext i8 %58 to i32
%60 = icmp sle i32 %59, 96
br i1 %60, label %61, label %62
61: ; preds = %57
br label %70
62: ; preds = %57
%63 = load i8, i8* %9
%64 = sext i8 %63 to i32
%65 = icmp sle i32 %64, 122
br i1 %65, label %66, label %67
66: ; preds = %62
br label %83
67: ; preds = %62
br label %68
68: ; preds = %67, %56
br label %69
69: ; preds = %68, %46
br label %70
70: ; preds = %69, %61
br label %71
71: ; preds = %70, %28
%72 = load i8*, i8** %7
%73 = getelementptr inbounds i8, i8* %72, i32 1
store i8* %73, i8** %7
%74 = load i8*, i8** %6
%75 = getelementptr inbounds i8, i8* %74, i32 1
store i8* %75, i8** %6
store i8 48, i8* %74
%76 = load i8*, i8** %6
%77 = getelementptr inbounds i8, i8* %76, i32 1
store i8* %77, i8** %6
store i8 0, i8* %76
%78 = load i8*, i8** %7
%79 = load i8*, i8** %4
%80 = ptrtoint i8* %78 to i64
%81 = ptrtoint i8* %79 to i64
%82 = sub i64 %80, %81
ret i64 %82
83: ; preds = %124, %114, %108, %66, %55, %45
%84 = load i8*, i8** %7
%85 = getelementptr inbounds i8, i8* %84, i32 1
store i8* %85, i8** %7
%86 = load i8*, i8** %4
%87 = load i32, i32* %5
%88 = sext i32 %87 to i64
%89 = getelementptr inbounds i8, i8* %86, i64 %88
%90 = load i8*, i8** %7
%91 = icmp ule i8* %89, %90
br i1 %91, label %92, label %93
92: ; preds = %83
br label %93
93: ; preds = %92, %83
%94 = load i8*, i8** %7
%95 = load i8, i8* %94
store i8 %95, i8* %9
%96 = load i8, i8* %9
%97 = sext i8 %96 to i32
%98 = icmp sle i32 %97, 64
br i1 %98, label %99, label %110
99: ; preds = %93
%100 = load i8, i8* %9
%101 = sext i8 %100 to i32
%102 = icmp sle i32 %101, 47
br i1 %102, label %103, label %104
103: ; preds = %99
br label %127
104: ; preds = %99
%105 = load i8, i8* %9
%106 = sext i8 %105 to i32
%107 = icmp sle i32 %106, 57
br i1 %107, label %108, label %109
108: ; preds = %104
br label %83
109: ; preds = %104
br label %126
110: ; preds = %93
%111 = load i8, i8* %9
%112 = sext i8 %111 to i32
%113 = icmp sle i32 %112, 90
br i1 %113, label %114, label %115
114: ; preds = %110
br label %83
115: ; preds = %110
%116 = load i8, i8* %9
%117 = sext i8 %116 to i32
%118 = icmp sle i32 %117, 96
br i1 %118, label %119, label %120
119: ; preds = %115
br label %127
120: ; preds = %115
%121 = load i8, i8* %9
%122 = sext i8 %121 to i32
%123 = icmp sle i32 %122, 122
br i1 %123, label %124, label %125
124: ; preds = %120
br label %83
125: ; preds = %120
br label %126
126: ; preds = %125, %109
br label %127
127: ; preds = %126, %119, %103
%128 = load i8*, i8** %6
%129 = getelementptr inbounds i8, i8* %128, i32 1
store i8* %129, i8** %6
store i8 50, i8* %128
br label %11
130: ; preds = %171, %161, %155, %40
%131 = load i8*, i8** %7
%132 = getelementptr inbounds i8, i8* %131, i32 1
store i8* %132, i8** %7
%133 = load i8*, i8** %4
%134 = load i32, i32* %5
%135 = sext i32 %134 to i64
%136 = getelementptr inbounds i8, i8* %133, i64 %135
%137 = load i8*, i8** %7
%138 = icmp ule i8* %136, %137
br i1 %138, label %139, label %140
139: ; preds = %130
br label %140
140: ; preds = %139, %130
%141 = load i8*, i8** %7
%142 = load i8, i8* %141
store i8 %142, i8* %9
%143 = load i8, i8* %9
%144 = sext i8 %143 to i32
%145 = icmp sle i32 %144, 64
br i1 %145, label %146, label %157
146: ; preds = %140
%147 = load i8, i8* %9
%148 = sext i8 %147 to i32
%149 = icmp sle i32 %148, 47
br i1 %149, label %150, label %151
150: ; preds = %146
br label %174
151: ; preds = %146
%152 = load i8, i8* %9
%153 = sext i8 %152 to i32
%154 = icmp sle i32 %153, 57
br i1 %154, label %155, label %156
155: ; preds = %151
br label %130
156: ; preds = %151
br label %173
157: ; preds = %140
%158 = load i8, i8* %9
%159 = sext i8 %158 to i32
%160 = icmp sle i32 %159, 90
br i1 %160, label %161, label %162
161: ; preds = %157
br label %130
162: ; preds = %157
%163 = load i8, i8* %9
%164 = sext i8 %163 to i32
%165 = icmp sle i32 %164, 96
br i1 %165, label %166, label %167
166: ; preds = %162
br label %174
167: ; preds = %162
%168 = load i8, i8* %9
%169 = sext i8 %168 to i32
%170 = icmp sle i32 %169, 122
br i1 %170, label %171, label %172
171: ; preds = %167
br label %130
172: ; preds = %167
br label %173
173: ; preds = %172, %156
br label %174
174: ; preds = %173, %166, %150
%175 = load i8*, i8** %6
%176 = getelementptr inbounds i8, i8* %175, i32 1
store i8* %176, i8** %6
store i8 49, i8* %175
br label %11
}

LLVM IR (-O2):
define i64 @scan(i8* %0, i32 %1, i8* nocapture writeonly %2) {
%4 = load i8, i8* %0
%5 = icmp eq i8 %4, 63
br i1 %5, label %6, label %58
6: ; preds = %3, %52
%7 = phi i8* [ %54, %52 ], [ %0, %3 ]
%8 = phi i8* [ %55, %52 ], [ %2, %3 ]
%9 = getelementptr inbounds i8, i8* %7, i64 1
%10 = load i8, i8* %9
%11 = icmp slt i8 %10, 58
br i1 %11, label %12, label %16
12: ; preds = %6
%13 = icmp eq i8 %10, 33
br i1 %13, label %38, label %14
14: ; preds = %12
%15 = icmp sgt i8 %10, 47
br i1 %15, label %23, label %58
16: ; preds = %6
%17 = icmp ult i8 %10, 91
br i1 %17, label %18, label %20
18: ; preds = %16
%19 = icmp ugt i8 %10, 64
br i1 %19, label %23, label %58
20: ; preds = %16
%21 = add nsw i8 %10, -97
%22 = icmp ult i8 %21, 26
br i1 %22, label %23, label %58
23: ; preds = %14, %18, %20
br label %24
24: ; preds = %37, %23
%25 = phi i8* [ %9, %23 ], [ %26, %37 ]
%26 = getelementptr inbounds i8, i8* %25, i64 1
%27 = load i8, i8* %26
%28 = icmp slt i8 %27, 65
br i1 %28, label %29, label %32
29: ; preds = %24
%30 = add i8 %27, -48
%31 = icmp ult i8 %30, 10
br i1 %31, label %37, label %52
32: ; preds = %24
%33 = icmp ult i8 %27, 91
%34 = add nsw i8 %27, -97
%35 = icmp ult i8 %34, 26
%36 = or i1 %33, %35
br i1 %36, label %37, label %52
37: ; preds = %32, %29
br label %24
38: ; preds = %12, %51
%39 = phi i8* [ %40, %51 ], [ %9, %12 ]
%40 = getelementptr inbounds i8, i8* %39, i64 1
%41 = load i8, i8* %40
%42 = icmp slt i8 %41, 65
br i1 %42, label %43, label %46
43: ; preds = %38
%44 = add i8 %41, -48
%45 = icmp ult i8 %44, 10
br i1 %45, label %51, label %52
46: ; preds = %38
%47 = icmp ult i8 %41, 91
%48 = add nsw i8 %41, -97
%49 = icmp ult i8 %48, 26
%50 = or i1 %47, %49
br i1 %50, label %51, label %52
51: ; preds = %46, %43
br label %38
52: ; preds = %29, %32, %43, %46
%53 = phi i8 [ 49, %46 ], [ 49, %43 ], [ 50, %32 ], [ 50, %29 ]
%54 = phi i8* [ %40, %46 ], [ %40, %43 ], [ %26, %32 ], [ %26, %29 ]
%55 = getelementptr inbounds i8, i8* %8, i64 1
store i8 %53, i8* %8
%56 = load i8, i8* %54
%57 = icmp eq i8 %56, 63
br i1 %57, label %6, label %58
58: ; preds = %20, %18, %14, %52, %3
%59 = phi i8* [ %2, %3 ], [ %55, %52 ], [ %8, %14 ], [ %8, %18 ], [ %8, %20 ]
%60 = phi i8* [ %0, %3 ], [ %54, %52 ], [ %9, %14 ], [ %9, %18 ], [ %9, %20 ]
%61 = getelementptr inbounds i8, i8* %60, i64 1
%62 = getelementptr inbounds i8, i8* %59, i64 1
store i8 48, i8* %59
store i8 0, i8* %62
%63 = ptrtoint i8* %61 to i64
%64 = ptrtoint i8* %0 to i64
%65 = sub i64 %63, %64
ret i64 %65
}