#import <stdio.h>
#import <stdlib.h>
#import <string.h>
#define M 1000000007
typedef long long Int;

void init(Int *A, int L) {
    for (int i = 0; i <= 9; i++) A[i] = 1;
    for (int i = 10; i <= 12; i++) A[i] = 0;
    for (int n = 1; n <= L + 1; n++) {
        for (int i = 0; i <= 12; i++) A[13 * n + i] = 0;
        for (int i = 0; i <= 12; i++) {
            for (int j = 0; j <= 9; j++) {
                A[13 * n + ((i + j) % 13)] += A[13 * (n - 1) + i];
                A[13 * n + ((i + j) % 13)] %= M;
            }
        }
    }
}

Int f(Int *A, int n, int k) {
    return A[13 * (n - 1) + k] % M;
}

int main() {
    char S[100002];
    scanf("%s", S);
    int L = strlen(S);
    int r[6] = {1, 10, 9, 12, 3, 4};
    int var_counts[6] = {0};
    int R = 0;
    for (int i = L - 1; i >= 0; i--) {
        int j = L - 1 - i;
        char c = S[i];
        if (c == '?') {
            var_counts[j % 6]++;
        } else {
            int d = c - '0';
            R += d * r[j % 6];
        }
    }

    Int *A = (Int *)malloc(sizeof(Int) * 13 * (L + 2));
    init(A, L);

    int c = R - 5;
    Int ans = 0;
    Int x[6] = {0};
    for (x[0] = 0; x[0] < 13; x[0]++) {
        for (x[1] = 0; x[1] < 13; x[1]++) {
            for (x[2] = 0; x[2] < 13; x[2]++) {
                for (x[3] = 0; x[3] < 13; x[3]++) {
                    for (x[4] = 0; x[4] < 13; x[4]++) {
                        for (x[5] = 0; x[5] < 13; x[5]++) {
                            int d = r[0] * x[0] + r[1] * x[1] + r[2] * x[2] + r[3] * x[3] + r[4] * x[4] + r[5] * x[5] + c;
                            if (d % 13 == 0) {
                                Int result = 1;
                                for (Int k = 0; k < 6; k++) {
                                    int v = var_counts[k];
                                    if (v > 0) {
                                        result *= f(A, v, x[k]);
                                        result %= M;
                                    }
                                }
                                ans += result;
                                ans %= M;
                            }
                            if (var_counts[5] == 0) break;
                        }
                        if (var_counts[4] == 0) break;
                    }
                    if (var_counts[3] == 0) break;
                }
                if (var_counts[2] == 0) break;
            }
            if (var_counts[1] == 0) break;
        }
        if (var_counts[0] == 0) break;
    }
    printf("%lld\n", ans);
}

; ModuleID = '/data/TheStack_IR/OJ_Samples/Collated/ObjectiveC/Source_237/source.m'
source_filename = "/data/TheStack_IR/OJ_Samples/Collated/ObjectiveC/Source_237/source.m"
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-pc-linux-gnu"

@.str = private unnamed_addr constant [3 x i8] c"%s\00", align 1
@__const.main.r = private unnamed_addr constant [6 x i32] [i32 1, i32 10, i32 9, i32 12, i32 3, i32 4], align 16
@.str.1 = private unnamed_addr constant [6 x i8] c"%lld\0A\00", align 1

; Function Attrs: minsize nofree nosync nounwind optsize memory(argmem: readwrite) uwtable
define dso_local void @init(ptr nocapture noundef %A, i32 noundef %L) local_unnamed_addr #0 {
entry:
  br label %for.cond

for.cond:                                         ; preds = %for.body, %entry
  %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
  %exitcond.not = icmp eq i64 %indvars.iv, 10
  br i1 %exitcond.not, label %for.cond2, label %for.body

for.body:                                         ; preds = %for.cond
  %arrayidx = getelementptr inbounds i64, ptr %A, i64 %indvars.iv
  store i64 1, ptr %arrayidx, align 8, !tbaa !5
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  br label %for.cond

for.cond2:                                        ; preds = %for.cond, %for.body5
  %indvars.iv85 = phi i64 [ %indvars.iv.next86, %for.body5 ], [ 10, %for.cond ]
  %exitcond88.not = icmp eq i64 %indvars.iv85, 13
  br i1 %exitcond88.not, label %for.cond11.preheader, label %for.body5

for.cond11.preheader:                             ; preds = %for.cond2
  %0 = tail call i32 @llvm.smax.i32(i32 %L, i32 -1)
  %1 = add i32 %0, 2
  %wide.trip.count = zext i32 %1 to i64
  br label %for.cond11

for.body5:                                        ; preds = %for.cond2
  %arrayidx7 = getelementptr inbounds i64, ptr %A, i64 %indvars.iv85
  store i64 0, ptr %arrayidx7, align 8, !tbaa !5
  %indvars.iv.next86 = add nuw nsw i64 %indvars.iv85, 1
  br label %for.cond2

for.cond11:                                       ; preds = %for.cond11.preheader, %for.cond.cleanup29
  %indvars.iv100 = phi i64 [ 1, %for.cond11.preheader ], [ %indvars.iv.next101, %for.cond.cleanup29 ]
  %exitcond104 = icmp eq i64 %indvars.iv100, %wide.trip.count
  br i1 %exitcond104, label %for.cond.cleanup13, label %for.cond16.preheader

for.cond16.preheader:                             ; preds = %for.cond11
  %2 = mul i64 %indvars.iv100, 13
  %3 = and i64 %2, 4294967295
  %invariant.gep = getelementptr i64, ptr %A, i64 %3
  br label %for.cond16

for.cond.cleanup13:                               ; preds = %for.cond11
  ret void

for.cond16:                                       ; preds = %for.cond16.preheader, %for.body19
  %indvars.iv89 = phi i64 [ 0, %for.cond16.preheader ], [ %indvars.iv.next90, %for.body19 ]
  %exitcond93.not = icmp eq i64 %indvars.iv89, 13
  br i1 %exitcond93.not, label %for.cond27.preheader, label %for.body19

for.cond27.preheader:                             ; preds = %for.cond16
  %4 = trunc i64 %indvars.iv100 to i32
  %5 = mul i32 %4, 13
  %mul35 = add i32 %5, -13
  %6 = sext i32 %mul35 to i64
  %invariant.gep105 = getelementptr i64, ptr %A, i64 %6
  br label %for.cond27

for.body19:                                       ; preds = %for.cond16
  %gep = getelementptr i64, ptr %invariant.gep, i64 %indvars.iv89
  store i64 0, ptr %gep, align 8, !tbaa !5
  %indvars.iv.next90 = add nuw nsw i64 %indvars.iv89, 1
  br label %for.cond16

for.cond27:                                       ; preds = %for.cond27.preheader, %for.cond.cleanup33
  %indvars.iv95 = phi i64 [ 0, %for.cond27.preheader ], [ %indvars.iv.next96, %for.cond.cleanup33 ]
  %exitcond99.not = icmp eq i64 %indvars.iv95, 13
  br i1 %exitcond99.not, label %for.cond.cleanup29, label %for.cond31.preheader

for.cond31.preheader:                             ; preds = %for.cond27
  %gep106 = getelementptr i64, ptr %invariant.gep105, i64 %indvars.iv95
  %7 = trunc i64 %indvars.iv95 to i32
  br label %for.cond31

for.cond.cleanup29:                               ; preds = %for.cond27
  %indvars.iv.next101 = add nuw nsw i64 %indvars.iv100, 1
  br label %for.cond11

for.cond31:                                       ; preds = %for.cond31.preheader, %for.body34
  %j.0 = phi i32 [ %inc53, %for.body34 ], [ 0, %for.cond31.preheader ]
  %exitcond94.not = icmp eq i32 %j.0, 10
  br i1 %exitcond94.not, label %for.cond.cleanup33, label %for.body34

for.cond.cleanup33:                               ; preds = %for.cond31
  %indvars.iv.next96 = add nuw nsw i64 %indvars.iv95, 1
  br label %for.cond27

for.body34:                                       ; preds = %for.cond31
  %8 = load i64, ptr %gep106, align 8, !tbaa !5
  %add40 = add nuw nsw i32 %j.0, %7
  %rem = urem i32 %add40, 13
  %add41 = add nuw nsw i32 %rem, %5
  %idxprom42 = zext i32 %add41 to i64
  %arrayidx43 = getelementptr inbounds i64, ptr %A, i64 %idxprom42
  %9 = load i64, ptr %arrayidx43, align 8, !tbaa !5
  %add44 = add nsw i64 %9, %8
  %rem51 = srem i64 %add44, 1000000007
  store i64 %rem51, ptr %arrayidx43, align 8, !tbaa !5
  %inc53 = add nuw nsw i32 %j.0, 1
  br label %for.cond31
}

; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite)
declare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture) #1

; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite)
declare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture) #1

; Function Attrs: minsize mustprogress nofree norecurse nosync nounwind optsize willreturn memory(argmem: read) uwtable
define dso_local i64 @f(ptr nocapture noundef readonly %A, i32 noundef %n, i32 noundef %k) local_unnamed_addr #2 {
entry:
  %0 = mul i32 %n, 13
  %mul = add i32 %0, -13
  %add = add nsw i32 %mul, %k
  %idxprom = sext i32 %add to i64
  %arrayidx = getelementptr inbounds i64, ptr %A, i64 %idxprom
  %1 = load i64, ptr %arrayidx, align 8, !tbaa !5
  %rem = srem i64 %1, 1000000007
  ret i64 %rem
}

; Function Attrs: minsize nofree nounwind optsize uwtable
define dso_local i32 @main() local_unnamed_addr #3 {
entry:
  %S = alloca [100002 x i8], align 16
  %var_counts = alloca [6 x i32], align 16
  %x = alloca [6 x i64], align 16
  call void @llvm.lifetime.start.p0(i64 100002, ptr nonnull %S) #9
  %call = call i32 (ptr, ...) @__isoc99_scanf(ptr noundef nonnull @.str, ptr noundef nonnull %S) #10
  %call2 = call i64 @strlen(ptr noundef nonnull dereferenceable(1) %S) #11
  %conv = trunc i64 %call2 to i32
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %var_counts) #9
  call void @llvm.memset.p0.i64(ptr noundef nonnull align 16 dereferenceable(24) %var_counts, i8 0, i64 24, i1 false)
  %sub = add nsw i32 %conv, -1
  br label %for.cond

for.cond:                                         ; preds = %if.end, %entry
  %i.0 = phi i32 [ %sub, %entry ], [ %dec, %if.end ]
  %R.0 = phi i32 [ 0, %entry ], [ %R.1, %if.end ]
  %cmp = icmp sgt i32 %i.0, -1
  br i1 %cmp, label %for.body, label %for.cond.cleanup

for.cond.cleanup:                                 ; preds = %for.cond
  %add16 = shl i64 %call2, 32
  %sext = add i64 %add16, 8589934592
  %conv17 = ashr exact i64 %sext, 32
  %mul18 = mul nsw i64 %conv17, 104
  %call19 = call noalias ptr @malloc(i64 noundef %mul18) #12
  call void @init(ptr noundef %call19, i32 noundef %conv) #10
  %sub21 = add nsw i32 %R.0, -5
  call void @llvm.lifetime.start.p0(i64 48, ptr nonnull %x) #9
  %arrayidx28 = getelementptr inbounds [6 x i64], ptr %x, i64 0, i64 1
  %arrayidx34 = getelementptr inbounds [6 x i64], ptr %x, i64 0, i64 2
  %arrayidx40 = getelementptr inbounds [6 x i64], ptr %x, i64 0, i64 3
  %arrayidx46 = getelementptr inbounds [6 x i64], ptr %x, i64 0, i64 4
  %arrayidx52 = getelementptr inbounds [6 x i64], ptr %x, i64 0, i64 5
  %arrayidx116 = getelementptr inbounds [6 x i32], ptr %var_counts, i64 0, i64 5
  %0 = load i32, ptr %arrayidx116, align 4
  %cmp117 = icmp eq i32 %0, 0
  %arrayidx125 = getelementptr inbounds [6 x i32], ptr %var_counts, i64 0, i64 4
  %1 = load i32, ptr %arrayidx125, align 16
  %cmp126 = icmp eq i32 %1, 0
  %2 = load <4 x i32>, ptr %var_counts, align 16
  %3 = icmp eq <4 x i32> %2, zeroinitializer
  %4 = extractelement <4 x i1> %3, i64 0
  %5 = extractelement <4 x i1> %3, i64 2
  %6 = extractelement <4 x i1> %3, i64 3
  %7 = extractelement <4 x i1> %3, i64 1
  br label %for.cond23

for.body:                                         ; preds = %for.cond
  %sub5 = sub nsw i32 %sub, %i.0
  %idxprom = zext i32 %i.0 to i64
  %arrayidx = getelementptr inbounds [100002 x i8], ptr %S, i64 0, i64 %idxprom
  %8 = load i8, ptr %arrayidx, align 1, !tbaa !9
  %cmp7 = icmp eq i8 %8, 63
  br i1 %cmp7, label %if.then, label %if.else

if.then:                                          ; preds = %for.body
  %rem = srem i32 %sub5, 6
  %idxprom9 = sext i32 %rem to i64
  %arrayidx10 = getelementptr inbounds [6 x i32], ptr %var_counts, i64 0, i64 %idxprom9
  %9 = load i32, ptr %arrayidx10, align 4, !tbaa !10
  %inc = add nsw i32 %9, 1
  store i32 %inc, ptr %arrayidx10, align 4, !tbaa !10
  br label %if.end

if.else:                                          ; preds = %for.body
  %conv6 = sext i8 %8 to i32
  %sub12 = add nsw i32 %conv6, -48
  %rem13 = srem i32 %sub5, 6
  %idxprom14 = sext i32 %rem13 to i64
  %arrayidx15 = getelementptr inbounds [6 x i32], ptr @__const.main.r, i64 0, i64 %idxprom14
  %10 = load i32, ptr %arrayidx15, align 4, !tbaa !10
  %mul = mul nsw i32 %10, %sub12
  %add = add nsw i32 %mul, %R.0
  br label %if.end

if.end:                                           ; preds = %if.else, %if.then
  %R.1 = phi i32 [ %R.0, %if.then ], [ %add, %if.else ]
  %dec = add nsw i32 %i.0, -1
  br label %for.cond

for.cond23:                                       ; preds = %for.end160, %for.cond.cleanup
  %storemerge = phi i64 [ 0, %for.cond.cleanup ], [ %inc168, %for.end160 ]
  %ans.0 = phi i64 [ 0, %for.cond.cleanup ], [ %ans.11, %for.end160 ]
  store i64 %storemerge, ptr %x, align 16, !tbaa !5
  %exitcond200.not = icmp eq i64 %storemerge, 13
  br i1 %exitcond200.not, label %for.end169, label %for.cond29

for.cond29:                                       ; preds = %for.cond23, %for.end151
  %storemerge190 = phi i64 [ %inc159, %for.end151 ], [ 0, %for.cond23 ]
  %ans.1 = phi i64 [ %ans.10, %for.end151 ], [ %ans.0, %for.cond23 ]
  store i64 %storemerge190, ptr %arrayidx28, align 8, !tbaa !5
  %exitcond199.not = icmp eq i64 %storemerge190, 13
  br i1 %exitcond199.not, label %for.end160, label %for.body33

for.body33:                                       ; preds = %for.cond29
  %mul66 = mul nuw nsw i64 %storemerge190, 10
  %add67 = add nuw nsw i64 %mul66, %storemerge
  br label %for.cond35

for.cond35:                                       ; preds = %for.end142, %for.body33
  %storemerge191 = phi i64 [ 0, %for.body33 ], [ %inc150, %for.end142 ]
  %ans.2 = phi i64 [ %ans.1, %for.body33 ], [ %ans.9, %for.end142 ]
  store i64 %storemerge191, ptr %arrayidx34, align 16, !tbaa !5
  %exitcond198.not = icmp eq i64 %storemerge191, 13
  br i1 %exitcond198.not, label %for.end151, label %for.body39

for.body39:                                       ; preds = %for.cond35
  %mul71 = mul nuw nsw i64 %storemerge191, 9
  %add72 = add nuw nsw i64 %add67, %mul71
  br label %for.cond41

for.cond41:                                       ; preds = %for.end133, %for.body39
  %storemerge192 = phi i64 [ 0, %for.body39 ], [ %inc141, %for.end133 ]
  %ans.3 = phi i64 [ %ans.2, %for.body39 ], [ %ans.8, %for.end133 ]
  store i64 %storemerge192, ptr %arrayidx40, align 8, !tbaa !5
  %exitcond197.not = icmp eq i64 %storemerge192, 13
  br i1 %exitcond197.not, label %for.end142, label %for.body45

for.body45:                                       ; preds = %for.cond41
  %mul76 = mul nuw nsw i64 %storemerge192, 12
  %add77 = add nuw nsw i64 %add72, %mul76
  br label %for.cond47

for.cond47:                                       ; preds = %for.end124, %for.body45
  %storemerge193 = phi i64 [ 0, %for.body45 ], [ %inc132, %for.end124 ]
  %ans.4 = phi i64 [ %ans.3, %for.body45 ], [ %ans.7, %for.end124 ]
  store i64 %storemerge193, ptr %arrayidx46, align 16, !tbaa !5
  %exitcond196.not = icmp eq i64 %storemerge193, 13
  br i1 %exitcond196.not, label %for.end133, label %for.body51

for.body51:                                       ; preds = %for.cond47
  %mul81 = mul nuw nsw i64 %storemerge193, 3
  %add82 = add nuw nsw i64 %add77, %mul81
  br label %for.cond53

for.cond53:                                       ; preds = %if.end115, %for.body51
  %storemerge194 = phi i64 [ 0, %for.body51 ], [ %inc123, %if.end115 ]
  %ans.5 = phi i64 [ %ans.4, %for.body51 ], [ %ans.6, %if.end115 ]
  store i64 %storemerge194, ptr %arrayidx52, align 8, !tbaa !5
  %exitcond195.not = icmp eq i64 %storemerge194, 13
  br i1 %exitcond195.not, label %for.end124, label %for.body57

for.body57:                                       ; preds = %for.cond53
  %mul86 = shl nsw i64 %storemerge194, 2
  %add87 = add nuw nsw i64 %add82, %mul86
  %11 = trunc i64 %add87 to i32
  %conv90 = add i32 %sub21, %11
  %rem91 = srem i32 %conv90, 13
  %cmp92 = icmp eq i32 %rem91, 0
  br i1 %cmp92, label %for.cond95, label %if.end115

for.cond95:                                       ; preds = %for.body57, %if.end109
  %result.0 = phi i64 [ %result.1, %if.end109 ], [ 1, %for.body57 ]
  %k.0 = phi i64 [ %inc111, %if.end109 ], [ 0, %for.body57 ]
  %exitcond.not = icmp eq i64 %k.0, 6
  br i1 %exitcond.not, label %for.cond.cleanup98, label %for.body99

for.cond.cleanup98:                               ; preds = %for.cond95
  %add113 = add nsw i64 %result.0, %ans.5
  %rem114 = srem i64 %add113, 1000000007
  br label %if.end115

for.body99:                                       ; preds = %for.cond95
  %arrayidx100 = getelementptr inbounds [6 x i32], ptr %var_counts, i64 0, i64 %k.0
  %12 = load i32, ptr %arrayidx100, align 4, !tbaa !10
  %cmp101 = icmp sgt i32 %12, 0
  br i1 %cmp101, label %if.then103, label %if.end109

if.then103:                                       ; preds = %for.body99
  %arrayidx104 = getelementptr inbounds [6 x i64], ptr %x, i64 0, i64 %k.0
  %13 = load i64, ptr %arrayidx104, align 8, !tbaa !5
  %conv105 = trunc i64 %13 to i32
  %14 = mul i32 %12, 13
  %mul.i = add i32 %14, -13
  %add.i = add nsw i32 %mul.i, %conv105
  %idxprom.i = sext i32 %add.i to i64
  %arrayidx.i = getelementptr inbounds i64, ptr %call19, i64 %idxprom.i
  %15 = load i64, ptr %arrayidx.i, align 8, !tbaa !5
  %rem.i = srem i64 %15, 1000000007
  %mul107 = mul nsw i64 %rem.i, %result.0
  %rem108 = srem i64 %mul107, 1000000007
  br label %if.end109

if.end109:                                        ; preds = %if.then103, %for.body99
  %result.1 = phi i64 [ %rem108, %if.then103 ], [ %result.0, %for.body99 ]
  %inc111 = add nuw nsw i64 %k.0, 1
  br label %for.cond95

if.end115:                                        ; preds = %for.cond.cleanup98, %for.body57
  %ans.6 = phi i64 [ %rem114, %for.cond.cleanup98 ], [ %ans.5, %for.body57 ]
  %inc123 = add nuw nsw i64 %storemerge194, 1
  br i1 %cmp117, label %for.end124, label %for.cond53

for.end124:                                       ; preds = %if.end115, %for.cond53
  %ans.7 = phi i64 [ %ans.6, %if.end115 ], [ %ans.5, %for.cond53 ]
  %inc132 = add nuw nsw i64 %storemerge193, 1
  br i1 %cmp126, label %for.end133, label %for.cond47

for.end133:                                       ; preds = %for.end124, %for.cond47
  %ans.8 = phi i64 [ %ans.7, %for.end124 ], [ %ans.4, %for.cond47 ]
  %inc141 = add nuw nsw i64 %storemerge192, 1
  br i1 %6, label %for.end142, label %for.cond41

for.end142:                                       ; preds = %for.end133, %for.cond41
  %ans.9 = phi i64 [ %ans.8, %for.end133 ], [ %ans.3, %for.cond41 ]
  %inc150 = add nuw nsw i64 %storemerge191, 1
  br i1 %5, label %for.end151, label %for.cond35

for.end151:                                       ; preds = %for.end142, %for.cond35
  %ans.10 = phi i64 [ %ans.9, %for.end142 ], [ %ans.2, %for.cond35 ]
  %inc159 = add nuw nsw i64 %storemerge190, 1
  br i1 %7, label %for.end160, label %for.cond29

for.end160:                                       ; preds = %for.end151, %for.cond29
  %ans.11 = phi i64 [ %ans.10, %for.end151 ], [ %ans.1, %for.cond29 ]
  %inc168 = add nuw nsw i64 %storemerge, 1
  br i1 %4, label %for.end169, label %for.cond23

for.end169:                                       ; preds = %for.end160, %for.cond23
  %ans.12 = phi i64 [ %ans.11, %for.end160 ], [ %ans.0, %for.cond23 ]
  %call170 = call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str.1, i64 noundef %ans.12) #10
  call void @llvm.lifetime.end.p0(i64 48, ptr nonnull %x) #9
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %var_counts) #9
  call void @llvm.lifetime.end.p0(i64 100002, ptr nonnull %S) #9
  ret i32 0
}

; Function Attrs: minsize nofree nounwind optsize
declare noundef i32 @__isoc99_scanf(ptr nocapture noundef readonly, ...) local_unnamed_addr #4

; Function Attrs: minsize mustprogress nofree nounwind optsize willreturn memory(argmem: read)
declare i64 @strlen(ptr nocapture noundef) local_unnamed_addr #5

; Function Attrs: mustprogress nocallback nofree nounwind willreturn memory(argmem: write)
declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i1 immarg) #6

; Function Attrs: minsize mustprogress nofree nounwind optsize willreturn allockind("alloc,uninitialized") allocsize(0) memory(inaccessiblemem: readwrite)
declare noalias noundef ptr @malloc(i64 noundef) local_unnamed_addr #7

; Function Attrs: minsize nofree nounwind optsize
declare noundef i32 @printf(ptr nocapture noundef readonly, ...) local_unnamed_addr #4

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare i32 @llvm.smax.i32(i32, i32) #8

attributes #0 = { minsize nofree nosync nounwind optsize memory(argmem: readwrite) uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #1 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #2 = { minsize mustprogress nofree norecurse nosync nounwind optsize willreturn memory(argmem: read) uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { minsize nofree nounwind optsize uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #4 = { minsize nofree nounwind optsize "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #5 = { minsize mustprogress nofree nounwind optsize willreturn memory(argmem: read) "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #6 = { mustprogress nocallback nofree nounwind willreturn memory(argmem: write) }
attributes #7 = { minsize mustprogress nofree nounwind optsize willreturn allockind("alloc,uninitialized") allocsize(0) memory(inaccessiblemem: readwrite) "alloc-family"="malloc" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #8 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #9 = { nounwind }
attributes #10 = { minsize optsize }
attributes #11 = { minsize nounwind optsize willreturn memory(read) }
attributes #12 = { minsize nounwind optsize allocsize(0) }

!llvm.linker.options = !{}
!llvm.module.flags = !{!0, !1, !2, !3}
!llvm.ident = !{!4}

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"Ubuntu clang version 18.0.0 (++20231007042255+8abb2ace888b-1~exp1~20231007042414.1230)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"long long", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!7, !7, i64 0}
!10 = !{!11, !11, i64 0}
!11 = !{!"int", !7, i64 0}
