#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 */
int strlen(char *);
void decode(char *ch) {
  int n = 0;
  int i = 0;
  int j = 0;
  n = strlen(ch);
  for (i = 0; i < n; i++) {
    if (ch[i] == '%') {
      i++;
      if (ch[i] >= 'a')
        ch[i] = ch[i] - 'a' + 10;
      else if (ch[i] >= 'A')
        ch[i] = ch[i] - 'A' + 10;
      else if (ch[i] >= '0')
        ch[i] = ch[i] - '0';
      if (ch[i + 1] >= 'a')
        ch[i + 1] = ch[i + 1] - 'a' + 10;
      else if (ch[i + 1] >= 'A')
        ch[i + 1] = ch[i + 1] - 'A' + 10;
      else if (ch[i + 1] >= '0')
        ch[i + 1] = ch[i + 1] - '0';
      ch[j] = ch[i] * 16 + ch[i + 1];
      j++;
      i++;
    } else {
      ch[j++] = ch[i];
    }
  }
  ch[j] = '\0';
}


x86 assembly (clang, -O0):
<decode>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
mov    %rdi,-0x8(%rbp)
movl   $0x0,-0xc(%rbp)
movl   $0x0,-0x10(%rbp)
movl   $0x0,-0x14(%rbp)
mov    -0x8(%rbp),%rdi
call   1030 <strlen@plt>
mov    %eax,-0xc(%rbp)
movl   $0x0,-0x10(%rbp)
mov    -0x10(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    136e <decode+0x25e>
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x25,%eax
jne    133b <decode+0x22b>
mov    -0x10(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x10(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x61,%eax
jl     11a7 <decode+0x97>
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
sub    $0x61,%eax
add    $0xa,%eax
mov    %al,%dl
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
jmp    121b <decode+0x10b>
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x41,%eax
jl     11e0 <decode+0xd0>
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
sub    $0x41,%eax
add    $0xa,%eax
mov    %al,%dl
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
jmp    1216 <decode+0x106>
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x30,%eax
jl     1211 <decode+0x101>
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
sub    $0x30,%eax
mov    %al,%dl
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
jmp    1216 <decode+0x106>
jmp    121b <decode+0x10b>
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x61,%eax
jl     1263 <decode+0x153>
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%eax
sub    $0x61,%eax
add    $0xa,%eax
mov    %al,%dl
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
jmp    12f5 <decode+0x1e5>
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x41,%eax
jl     12ab <decode+0x19b>
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%eax
sub    $0x41,%eax
add    $0xa,%eax
mov    %al,%dl
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
jmp    12f0 <decode+0x1e0>
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x30,%eax
jl     12eb <decode+0x1db>
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%eax
sub    $0x30,%eax
mov    %al,%dl
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
jmp    12f0 <decode+0x1e0>
jmp    12f5 <decode+0x1e5>
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
shl    $0x4,%eax
mov    -0x8(%rbp),%rcx
mov    -0x10(%rbp),%edx
add    $0x1,%edx
movslq %edx,%rdx
movsbl (%rcx,%rdx,1),%ecx
add    %ecx,%eax
mov    %al,%dl
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
mov    -0x10(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x10(%rbp)
jmp    135b <decode+0x24b>
mov    -0x8(%rbp),%rax
movslq -0x10(%rbp),%rcx
mov    (%rax,%rcx,1),%dl
mov    -0x8(%rbp),%rax
mov    -0x14(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x14(%rbp)
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
jmp    1360 <decode+0x250>
mov    -0x10(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x10(%rbp)
jmp    1144 <decode+0x34>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movb   $0x0,(%rax,%rcx,1)
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<decode>:
push   %r14
push   %rbx
push   %rax
mov    %rdi,%r14
call   1030 <strlen@plt>
xor    %edi,%edi
test   %eax,%eax
jle    11ad <decode+0x9d>
xor    %ecx,%ecx
jmp    114d <decode+0x3d>
nopw   0x0(%rax,%rax,1)
add    %dil,%bl
mov    %bl,(%r14,%rsi,1)
shl    $0x4,%dl
add    %bl,%dl
mov    %esi,%edi
mov    %dl,(%r14,%rcx,1)
add    $0x1,%rcx
add    $0x1,%edi
cmp    %eax,%edi
jge    11ab <decode+0x9b>
movslq %edi,%rsi
movzbl (%r14,%rsi,1),%edx
cmp    $0x25,%dl
jne    113e <decode+0x2e>
movzbl 0x1(%rsi,%r14,1),%edx
mov    $0xa9,%bl
cmp    $0x60,%dl
jg     1180 <decode+0x70>
mov    $0xc9,%bl
cmp    $0x40,%dl
jg     1180 <decode+0x70>
mov    $0xd0,%bl
cmp    $0x30,%dl
jl     1187 <decode+0x77>
cs nopw 0x0(%rax,%rax,1)
nop
add    %bl,%dl
mov    %dl,0x1(%r14,%rsi,1)
movzbl 0x2(%r14,%rsi,1),%ebx
add    $0x2,%rsi
mov    $0xa9,%dil
cmp    $0x60,%bl
jg     1130 <decode+0x20>
mov    $0xc9,%dil
cmp    $0x40,%bl
jg     1130 <decode+0x20>
mov    $0xd0,%dil
cmp    $0x30,%bl
jge    1130 <decode+0x20>
jmp    1137 <decode+0x27>
mov    %ecx,%edi
movb   $0x0,(%r14,%rdi,1)
add    $0x8,%rsp
pop    %rbx
pop    %r14
ret

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

LLVM IR (-O2):
define void @decode(i8* %0) {
%2 = tail call i32 @strlen(i8* %0)
%3 = icmp sgt i32 %2, 0
br i1 %3, label %4, label %51
4: ; preds = %1, %42
%5 = phi i64 [ %46, %42 ], [ 0, %1 ]
%6 = phi i32 [ %47, %42 ], [ 0, %1 ]
%7 = sext i32 %6 to i64
%8 = getelementptr inbounds i8, i8* %0, i64 %7
%9 = load i8, i8* %8
%10 = icmp eq i8 %9, 37
br i1 %10, label %11, label %42
11: ; preds = %4
%12 = add nsw i32 %6, 1
%13 = sext i32 %12 to i64
%14 = getelementptr inbounds i8, i8* %0, i64 %13
%15 = load i8, i8* %14
%16 = icmp sgt i8 %15, 96
br i1 %16, label %21, label %17
17: ; preds = %11
%18 = icmp sgt i8 %15, 64
br i1 %18, label %21, label %19
19: ; preds = %17
%20 = icmp sgt i8 %15, 47
br i1 %20, label %21, label %24
21: ; preds = %19, %17, %11
%22 = phi i8 [ -87, %11 ], [ -55, %17 ], [ -48, %19 ]
%23 = add nsw i8 %15, %22
store i8 %23, i8* %14
br label %24
24: ; preds = %21, %19
%25 = phi i8 [ %15, %19 ], [ %23, %21 ]
%26 = add nsw i32 %6, 2
%27 = sext i32 %26 to i64
%28 = getelementptr inbounds i8, i8* %0, i64 %27
%29 = load i8, i8* %28
%30 = icmp sgt i8 %29, 96
br i1 %30, label %35, label %31
31: ; preds = %24
%32 = icmp sgt i8 %29, 64
br i1 %32, label %35, label %33
33: ; preds = %31
%34 = icmp sgt i8 %29, 47
br i1 %34, label %35, label %38
35: ; preds = %33, %31, %24
%36 = phi i8 [ -87, %24 ], [ -55, %31 ], [ -48, %33 ]
%37 = add nsw i8 %29, %36
store i8 %37, i8* %28
br label %38
38: ; preds = %35, %33
%39 = phi i8 [ %29, %33 ], [ %37, %35 ]
%40 = shl i8 %25, 4
%41 = add i8 %40, %39
br label %42
42: ; preds = %4, %38
%43 = phi i8 [ %41, %38 ], [ %9, %4 ]
%44 = phi i32 [ %26, %38 ], [ %6, %4 ]
%45 = getelementptr inbounds i8, i8* %0, i64 %5
store i8 %43, i8* %45
%46 = add nuw i64 %5, 1
%47 = add nsw i32 %44, 1
%48 = icmp slt i32 %47, %2
br i1 %48, label %4, label %49
49: ; preds = %42
%50 = and i64 %46, 4294967295
br label %51
51: ; preds = %49, %1
%52 = phi i64 [ 0, %1 ], [ %50, %49 ]
%53 = getelementptr inbounds i8, i8* %0, i64 %52
store i8 0, i8* %53
ret void
}