ONNX-MLIR 다뤄보기(MobileNetV2-12)


서론

이 장은 ONNX-MLIR로 모델을 컴파일 하는 방법에 대해 소개한다.

Docker를 사용하거나 직접 설치해서 사용할 수 있다.(직접설치하는 방법 바로가기)

그리고 기존 onnx모델을 shared library형태에로 컴파일 한 후, Inference를 진행해본다.

(환경) AMD64 Architecture Ubuntu 20.04 LTS

(참고) Arm Architecture는 ONNX-MLIR 도커 이미지에서 지원되지 않는다.

목차

  1. Setting
  2. Compile
  3. Use shared library
    1. Python Inference
    2. C++ Inference
  4. ONNX-MLIR 변환과정에서 오류가 발생한 경우
  5. 변환오류 해결하기
    1. 오류원인 분석

Setting

아래 깃허브에 있는 레포지토리를 복사해오자

$ git clone https://github.com/onnx/onnx-mlir.git

https://github.com/onnx/onnx-mlir

그 다음 아래 명령어를 통해 docker 폴더 안으로 이동해주면 onnx-mlir.py라는 파일이 보일 것이다.

저 파일을 사용해 모델을 컴파일한다.

$ cd onnx-mlir/docker
$ python onnx-mlir.py --help

Compile

아래 명령어는 ‘docker폴더 안에있는 onnx-mlir.py를 사용해서 mnist폴더 안의 mode.onnx라는 모델을 컴파일 해줘’ 라는 명령어다.

그럼 자동으로 docker image를 다운받고 도커가 실행된 후 안에서 컴파일한다.

docker에서 나오게 되면 mnist 폴더 아래에 컴파일된 파일이 만들어진다.

mnist 모델은 여기에서 다운받을 수 있다.

$ docker/onnx-mlir.py -O3 --EmitLib mnist/model.onnx
505a5a6fb7d0: Pulling fs layer #downloading Image
505a5a6fb7d0: Verifying Checksum
505a5a6fb7d0: Download complete
505a5a6fb7d0: Pull complete
Shared library model.so has been compiled.

다음은 ONNX-MLIR에 사용되는 옵션들이다.

OVERVIEW: ONNX-MLIR modular optimizer driver

USAGE: onnx-mlir [options] <input file>

OPTIONS:

Generic Options:

  --help        - Display available options (--help-hidden for more)
  --help-list   - Display list of available options (--help-list-hidden for more)
  --version     - Display the version of this program

ONNX-MLIR Options:
These are frontend options.

  Choose target to emit:
      --EmitONNXBasic - Ingest ONNX and emit the basic ONNX operations without inferred shapes.
      --EmitONNXIR    - Ingest ONNX and emit corresponding ONNX dialect.
      --EmitMLIR      - Lower the input to MLIR built-in transformation dialect.
      --EmitLLVMIR    - Lower the input to LLVM IR (LLVM MLIR dialect).
      --EmitObj       - Compile the input to an object file.
      --EmitLib       - Compile and link the input into a shared library (default).
      --EmitJNI       - Compile the input to a jar file.

  Optimization levels:
      --O0           - Optimization level 0 (default).
      --O1           - Optimization level 1.
      --O2           - Optimization level 2.
      --O3           - Optimization level 3.

Mnist-12.onnx를 가지고 각 옵션 단계별 결과물이다.

Mnist-12.onnx 구조

BASIC

$ docker/onnx-mlir.py --EmitONNXBasic mnist/mnist-12.onnx
BASIC Result
module attributes {llvm.data_layout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128", llvm.target_triple = "x86_64-unknown-linux-gnu"} {
  func.func @main_graph(%arg0: tensor<1x1x28x28xf32>) -> tensor<1x10xf32> attributes {input_names = ["Input3"], output_names = ["Plus214_Output_0"]} {
    %0 = onnx.Constant dense_resource<__elided__> : tensor<16x4x4x10xf32>
    %1 = onnx.Constant dense_resource<__elided__> : tensor<16x8x5x5xf32>
    %2 = onnx.Constant dense_resource<__elided__> : tensor<8x1x5x5xf32>
    %3 = onnx.Constant dense<[[[-0.161539719]], [[-0.433835655]], [[0.091641359]], [[-0.0168522168]], [[-0.0650264397]], [[-0.131737873]], [[0.0204175506]], [[-0.121110231]]]> : tensor<8x1x1xf32>
    %4 = onnx.Constant dense<[[[-0.0822488219]], [[-0.108868778]], [[-0.141039595]], [[-0.204869166]], [[-0.17913565]], [[-0.215438381]], [[-0.133805066]], [[-0.195724562]], [[-0.268250644]], [[-0.258212209]], [[-0.0761560649]], [[0.0132841459]], [[-0.00444464432]], [[-0.414740831]], [[-0.17879115]], [[-0.0386558883]]]> : tensor<16x1x1xf32>
    %5 = onnx.Constant dense<[1, 256]> : tensor<2xi64>
    %6 = onnx.Constant dense<[256, 10]> : tensor<2xi64>
    %7 = onnx.Constant dense<[[-0.0448560268, 0.00779166119, 0.0681008175, 0.0299937408, -0.126409635, 0.14021875, -0.0552849025, -0.0493838154, 0.0843220502, -0.0545404144]]> : tensor<1x10xf32>
    %8 = "onnx.NoValue"() {value} : () -> none
    %9 = "onnx.Conv"(%arg0, %2, %8) {auto_pad = "SAME_UPPER", dilations = [1, 1], group = 1 : si64, kernel_shape = [5, 5], onnx_node_name = "Convolution28", strides = [1, 1]} : (tensor<1x1x28x28xf32>, tensor<8x1x5x5xf32>, none) -> tensor<*xf32>
    %10 = "onnx.Add"(%9, %3) {onnx_node_name = "Plus30"} : (tensor<*xf32>, tensor<8x1x1xf32>) -> tensor<*xf32>
    %11 = "onnx.Relu"(%10) {onnx_node_name = "ReLU32"} : (tensor<*xf32>) -> tensor<*xf32>
    %12 = "onnx.MaxPoolSingleOut"(%11) {auto_pad = "NOTSET", ceil_mode = 0 : si64, kernel_shape = [2, 2], onnx_node_name = "Pooling66", pads = [0, 0, 0, 0], storage_order = 0 : si64, strides = [2, 2]} : (tensor<*xf32>) -> tensor<*xf32>
    %13 = "onnx.NoValue"() {value} : () -> none
    %14 = "onnx.Conv"(%12, %1, %13) {auto_pad = "SAME_UPPER", dilations = [1, 1], group = 1 : si64, kernel_shape = [5, 5], onnx_node_name = "Convolution110", strides = [1, 1]} : (tensor<*xf32>, tensor<16x8x5x5xf32>, none) -> tensor<*xf32>
    %15 = "onnx.Add"(%14, %4) {onnx_node_name = "Plus112"} : (tensor<*xf32>, tensor<16x1x1xf32>) -> tensor<*xf32>
    %16 = "onnx.Relu"(%15) {onnx_node_name = "ReLU114"} : (tensor<*xf32>) -> tensor<*xf32>
    %17 = "onnx.MaxPoolSingleOut"(%16) {auto_pad = "NOTSET", ceil_mode = 0 : si64, kernel_shape = [3, 3], onnx_node_name = "Pooling160", pads = [0, 0, 0, 0], storage_order = 0 : si64, strides = [3, 3]} : (tensor<*xf32>) -> tensor<*xf32>
    %18 = "onnx.Reshape"(%17, %5) {allowzero = 0 : si64, onnx_node_name = "Times212_reshape0"} : (tensor<*xf32>, tensor<2xi64>) -> tensor<*xf32>
    %19 = "onnx.Reshape"(%0, %6) {allowzero = 0 : si64, onnx_node_name = "Times212_reshape1"} : (tensor<16x4x4x10xf32>, tensor<2xi64>) -> tensor<*xf32>
    %20 = "onnx.MatMul"(%18, %19) {onnx_node_name = "Times212"} : (tensor<*xf32>, tensor<*xf32>) -> tensor<*xf32>
    %21 = "onnx.Add"(%20, %7) {onnx_node_name = "Plus214"} : (tensor<*xf32>, tensor<1x10xf32>) -> tensor<1x10xf32>
    return %21 : tensor<1x10xf32>
  }
  "onnx.EntryPoint"() {func = @main_graph} : () -> ()
}

ONNXIR

$ docker/onnx-mlir.py --EmitONNXIR mnist/mnist-12.onnx
ONNXIR Result
module attributes {llvm.data_layout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128", llvm.target_triple = "x86_64-unknown-linux-gnu"} {
  func.func @main_graph(%arg0: tensor<1x1x28x28xf32>) -> tensor<1x10xf32> attributes {input_names = ["Input3"], output_names = ["Plus214_Output_0"]} {
    %0 = onnx.Constant dense_resource<__elided__> : tensor<16x8x5x5xf32>
    %1 = onnx.Constant dense_resource<__elided__> : tensor<8x1x5x5xf32>
    %2 = onnx.Constant dense<[1, 256]> : tensor<2xi64>
    %3 = onnx.Constant dense<[[-0.0448560268, 0.00779166119, 0.0681008175, 0.0299937408, -0.126409635, 0.14021875, -0.0552849025, -0.0493838154, 0.0843220502, -0.0545404144]]> : tensor<1x10xf32>
    %4 = onnx.Constant dense<[-0.161539719, -0.433835655, 0.091641359, -0.0168522168, -0.0650264397, -0.131737873, 0.0204175506, -0.121110231]> : tensor<8xf32>
    %5 = "onnx.Conv"(%arg0, %1, %4) {auto_pad = "SAME_UPPER", dilations = [1, 1], group = 1 : si64, kernel_shape = [5, 5], strides = [1, 1]} : (tensor<1x1x28x28xf32>, tensor<8x1x5x5xf32>, tensor<8xf32>) -> tensor<1x8x28x28xf32>
    %6 = "onnx.Relu"(%5) {onnx_node_name = "ReLU32"} : (tensor<1x8x28x28xf32>) -> tensor<1x8x28x28xf32>
    %7 = "onnx.MaxPoolSingleOut"(%6) {auto_pad = "NOTSET", ceil_mode = 0 : si64, kernel_shape = [2, 2], onnx_node_name = "Pooling66", pads = [0, 0, 0, 0], storage_order = 0 : si64, strides = [2, 2]} : (tensor<1x8x28x28xf32>) -> tensor<1x8x14x14xf32>
    %8 = onnx.Constant dense<[-0.0822488219, -0.108868778, -0.141039595, -0.204869166, -0.17913565, -0.215438381, -0.133805066, -0.195724562, -0.268250644, -0.258212209, -0.0761560649, 0.0132841459, -0.00444464432, -0.414740831, -0.17879115, -0.0386558883]> : tensor<16xf32>
    %9 = "onnx.Conv"(%7, %0, %8) {auto_pad = "SAME_UPPER", dilations = [1, 1], group = 1 : si64, kernel_shape = [5, 5], strides = [1, 1]} : (tensor<1x8x14x14xf32>, tensor<16x8x5x5xf32>, tensor<16xf32>) -> tensor<1x16x14x14xf32>
    %10 = "onnx.Relu"(%9) {onnx_node_name = "ReLU114"} : (tensor<1x16x14x14xf32>) -> tensor<1x16x14x14xf32>
    %11 = "onnx.MaxPoolSingleOut"(%10) {auto_pad = "NOTSET", ceil_mode = 0 : si64, kernel_shape = [3, 3], onnx_node_name = "Pooling160", pads = [0, 0, 0, 0], storage_order = 0 : si64, strides = [3, 3]} : (tensor<1x16x14x14xf32>) -> tensor<1x16x4x4xf32>
    %12 = "onnx.Reshape"(%11, %2) {allowzero = 0 : si64, onnx_node_name = "Times212_reshape0"} : (tensor<1x16x4x4xf32>, tensor<2xi64>) -> tensor<1x256xf32>
    %13 = onnx.Constant dense_resource<__elided__> : tensor<256x10xf32>
    %14 = "onnx.Gemm"(%12, %13, %3) {alpha = 1.000000e+00 : f32, beta = 1.000000e+00 : f32, transA = 0 : si64, transB = 0 : si64} : (tensor<1x256xf32>, tensor<256x10xf32>, tensor<1x10xf32>) -> tensor<1x10xf32>
    return %14 : tensor<1x10xf32>
  }
  "onnx.EntryPoint"() {func = @main_graph} : () -> ()
}

MLIR

$ docker/onnx-mlir.py --EmitMLIR mnist/mnist-12.onnx
MLIR Result
#map = affine_map<(d0, d1) -> (d0 * 8 + d1)>
#map1 = affine_map<(d0) -> (-d0 + 2, 0)>
#map2 = affine_map<(d0) -> (-d0 + 30, 5)>
#map3 = affine_map<(d0, d1) -> (-d1 + 2, 0)>
#map4 = affine_map<(d0, d1) -> (-d1 + 30, 5)>
#map5 = affine_map<(d0)[s0] -> (d0 + s0)>
#map6 = affine_map<(d0, d1) -> (d0 + d1 - 2)>
#map7 = affine_map<(d0) -> (0, d0 * 2)>
#map8 = affine_map<(d0)[s0, s1, s2, s3, s4] -> (s0 - ((s2 ceildiv s4) * s4 - s2), -(d0 * s3 - s2) + s0, d0 * s3 + (s1 - 1) * s4 - s2 - ((s2 ceildiv s4) * s4 - s2) + 1, d0 * s3 + (s1 - 1) * s4 - s2 - (d0 * s3 - s2) + 1)>
#map9 = affine_map<(d0, d1) -> (d0 * 16 + d1)>
#map10 = affine_map<(d0) -> (-d0 + 16, 5)>
#map11 = affine_map<(d0, d1) -> (-d1 + 16, 5)>
#map12 = affine_map<(d0, d1) -> (d0 + d1 * 8)>
#map13 = affine_map<(d0) -> (0, d0 * 3)>
module attributes {llvm.data_layout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128", llvm.target_triple = "x86_64-unknown-linux-gnu"} {
  func.func @main_graph(%arg0: memref<1x1x28x28xf32>) -> memref<1x10xf32> attributes {input_names = ["Input3"], llvm.emit_c_interface, output_names = ["Plus214_Output_0"]} {
    %c3 = arith.constant 3 : index
    %cst = arith.constant 0xFF800000 : f32
    %c14 = arith.constant 14 : index
    %cst_0 = arith.constant 0.000000e+00 : f32
    %c2 = arith.constant 2 : index
    %c28 = arith.constant 28 : index
    %c1 = arith.constant 1 : index
    %c0 = arith.constant 0 : index
    %0 = "krnl.global"() {name = "constant_0", shape = [16, 8, 5, 5], value = dense_resource<__elided__> : tensor<16x8x5x5xf32>} : () -> memref<16x8x5x5xf32>
    %1 = "krnl.global"() {name = "constant_1", shape = [8, 1, 5, 5], value = dense_resource<__elided__> : tensor<8x1x5x5xf32>} : () -> memref<8x1x5x5xf32>
    %2 = "krnl.global"() {name = "constant_3", shape = [1, 10], value = dense<[[-0.0448560268, 0.00779166119, 0.0681008175, 0.0299937408, -0.126409635, 0.14021875, -0.0552849025, -0.0493838154, 0.0843220502, -0.0545404144]]> : tensor<1x10xf32>} : () -> memref<1x10xf32>
    %3 = "krnl.global"() {name = "constant_4", shape = [8], value = dense<[-0.161539719, -0.433835655, 0.091641359, -0.0168522168, -0.0650264397, -0.131737873, 0.0204175506, -0.121110231]> : tensor<8xf32>} : () -> memref<8xf32>
    %alloc = memref.alloc() {alignment = 16 : i64} : memref<1x8x28x28xf32>
    %alloca = memref.alloca() : memref<f32>
    affine.for %arg1 = 0 to 1 {
      affine.for %arg2 = 0 to 1 {
        affine.for %arg3 = 0 to 8 {
          %6 = affine.apply #map(%arg2, %arg3)
          affine.for %arg4 = 0 to 28 {
            affine.for %arg5 = 0 to 28 {
              affine.store %cst_0, %alloca[] : memref<f32>
              affine.for %arg6 = 0 to 1 {
                affine.for %arg7 = max #map1(%arg4) to min #map2(%arg4) {
                  affine.for %arg8 = max #map3(%arg4, %arg5) to min #map4(%arg4, %arg5) {
                    %10 = affine.apply #map5(%arg6)[%arg2]
                    %11 = affine.apply #map6(%arg7, %arg4)
                    %12 = affine.apply #map6(%arg8, %arg5)
                    %13 = affine.load %arg0[%arg1, %10, %11, %12] : memref<1x1x28x28xf32>
                    %14 = affine.load %1[%6, %arg6, %arg7, %arg8] : memref<8x1x5x5xf32>
                    %15 = affine.load %alloca[] : memref<f32>
                    %16 = arith.mulf %13, %14 : f32
                    %17 = arith.addf %15, %16 : f32
                    affine.store %17, %alloca[] : memref<f32>
                  }
                }
              }
              %7 = affine.load %alloca[] : memref<f32>
              %8 = affine.load %3[%6] : memref<8xf32>
              %9 = arith.addf %7, %8 : f32
              affine.store %9, %alloc[%arg1, %6, %arg4, %arg5] : memref<1x8x28x28xf32>
            }
          }
        }
      }
    }
    %alloc_1 = memref.alloc() {alignment = 16 : i64} : memref<1x8x28x28xf32>
    affine.for %arg1 = 0 to 1 {
      affine.for %arg2 = 0 to 8 {
        affine.for %arg3 = 0 to 28 {
          affine.for %arg4 = 0 to 28 {
            %6 = affine.load %alloc[%arg1, %arg2, %arg3, %arg4] : memref<1x8x28x28xf32>
            %7 = arith.cmpf oge, %6, %cst_0 : f32
            %8 = arith.select %7, %6, %cst_0 : f32
            affine.store %8, %alloc_1[%arg1, %arg2, %arg3, %arg4] : memref<1x8x28x28xf32>
          }
        }
      }
    }
    %alloc_2 = memref.alloc() {alignment = 16 : i64} : memref<1x8x14x14xf32>
    %alloca_3 = memref.alloca() : memref<f32>
    affine.for %arg1 = 0 to 1 {
      affine.for %arg2 = 0 to 8 {
        affine.for %arg3 = 0 to 14 {
          affine.for %arg4 = 0 to 14 {
            affine.store %cst, %alloca_3[] : memref<f32>
            %6 = affine.max #map7(%arg3)
            %7 = affine.max #map7(%arg4)
            affine.for %arg5 = 0 to min #map8(%arg3)[%c28, %c2, %c0, %c2, %c1] {
              affine.for %arg6 = 0 to min #map8(%arg4)[%c28, %c2, %c0, %c2, %c1] {
                %9 = arith.addi %arg5, %6 : index
                %10 = arith.addi %arg6, %7 : index
                %11 = memref.load %alloc_1[%arg1, %arg2, %9, %10] : memref<1x8x28x28xf32>
                %12 = affine.load %alloca_3[] : memref<f32>
                %13 = arith.cmpf ogt, %12, %11 : f32
                %14 = arith.select %13, %12, %11 : f32
                affine.store %14, %alloca_3[] : memref<f32>
              }
            }
            %8 = affine.load %alloca_3[] : memref<f32>
            affine.store %8, %alloc_2[%arg1, %arg2, %arg3, %arg4] : memref<1x8x14x14xf32>
          }
        }
      }
    }
    %4 = "krnl.global"() {name = "constant_5", shape = [16], value = dense<[-0.0822488219, -0.108868778, -0.141039595, -0.204869166, -0.17913565, -0.215438381, -0.133805066, -0.195724562, -0.268250644, -0.258212209, -0.0761560649, 0.0132841459, -0.00444464432, -0.414740831, -0.17879115, -0.0386558883]> : tensor<16xf32>} : () -> memref<16xf32>
    %alloc_4 = memref.alloc() {alignment = 16 : i64} : memref<1x16x14x14xf32>
    %alloca_5 = memref.alloca() : memref<f32>
    affine.for %arg1 = 0 to 1 {
      affine.for %arg2 = 0 to 1 {
        affine.for %arg3 = 0 to 16 {
          %6 = affine.apply #map9(%arg2, %arg3)
          affine.for %arg4 = 0 to 14 {
            affine.for %arg5 = 0 to 14 {
              affine.store %cst_0, %alloca_5[] : memref<f32>
              affine.for %arg6 = 0 to 8 {
                affine.for %arg7 = max #map1(%arg4) to min #map10(%arg4) {
                  affine.for %arg8 = max #map3(%arg4, %arg5) to min #map11(%arg4, %arg5) {
                    %10 = affine.apply #map12(%arg6, %arg2)
                    %11 = affine.apply #map6(%arg7, %arg4)
                    %12 = affine.apply #map6(%arg8, %arg5)
                    %13 = affine.load %alloc_2[%arg1, %10, %11, %12] : memref<1x8x14x14xf32>
                    %14 = affine.load %0[%6, %arg6, %arg7, %arg8] : memref<16x8x5x5xf32>
                    %15 = affine.load %alloca_5[] : memref<f32>
                    %16 = arith.mulf %13, %14 : f32
                    %17 = arith.addf %15, %16 : f32
                    affine.store %17, %alloca_5[] : memref<f32>
                  }
                }
              }
              %7 = affine.load %alloca_5[] : memref<f32>
              %8 = affine.load %4[%6] : memref<16xf32>
              %9 = arith.addf %7, %8 : f32
              affine.store %9, %alloc_4[%arg1, %6, %arg4, %arg5] : memref<1x16x14x14xf32>
            }
          }
        }
      }
    }
    %alloc_6 = memref.alloc() {alignment = 16 : i64} : memref<1x16x14x14xf32>
    affine.for %arg1 = 0 to 1 {
      affine.for %arg2 = 0 to 16 {
        affine.for %arg3 = 0 to 14 {
          affine.for %arg4 = 0 to 14 {
            %6 = affine.load %alloc_4[%arg1, %arg2, %arg3, %arg4] : memref<1x16x14x14xf32>
            %7 = arith.cmpf oge, %6, %cst_0 : f32
            %8 = arith.select %7, %6, %cst_0 : f32
            affine.store %8, %alloc_6[%arg1, %arg2, %arg3, %arg4] : memref<1x16x14x14xf32>
          }
        }
      }
    }
    %alloc_7 = memref.alloc() {alignment = 16 : i64} : memref<1x16x4x4xf32>
    %alloca_8 = memref.alloca() : memref<f32>
    affine.for %arg1 = 0 to 1 {
      affine.for %arg2 = 0 to 16 {
        affine.for %arg3 = 0 to 4 {
          affine.for %arg4 = 0 to 4 {
            affine.store %cst, %alloca_8[] : memref<f32>
            %6 = affine.max #map13(%arg3)
            %7 = affine.max #map13(%arg4)
            affine.for %arg5 = 0 to min #map8(%arg3)[%c14, %c3, %c0, %c3, %c1] {
              affine.for %arg6 = 0 to min #map8(%arg4)[%c14, %c3, %c0, %c3, %c1] {
                %9 = arith.addi %arg5, %6 : index
                %10 = arith.addi %arg6, %7 : index
                %11 = memref.load %alloc_6[%arg1, %arg2, %9, %10] : memref<1x16x14x14xf32>
                %12 = affine.load %alloca_8[] : memref<f32>
                %13 = arith.cmpf ogt, %12, %11 : f32
                %14 = arith.select %13, %12, %11 : f32
                affine.store %14, %alloca_8[] : memref<f32>
              }
            }
            %8 = affine.load %alloca_8[] : memref<f32>
            affine.store %8, %alloc_7[%arg1, %arg2, %arg3, %arg4] : memref<1x16x4x4xf32>
          }
        }
      }
    }
    %reinterpret_cast = memref.reinterpret_cast %alloc_7 to offset: [0], sizes: [1, 256], strides: [256, 1] : memref<1x16x4x4xf32> to memref<1x256xf32>
    %5 = "krnl.global"() {name = "constant_6", shape = [256, 10], value = dense_resource<__elided__> : tensor<256x10xf32>} : () -> memref<256x10xf32>
    %alloc_9 = memref.alloc() {alignment = 128 : i64} : memref<1x10xf32>
    %alloca_10 = memref.alloca() : memref<f32>
    affine.for %arg1 = 0 to 1 {
      affine.for %arg2 = 0 to 10 {
        affine.store %cst_0, %alloca_10[] : memref<f32>
        affine.for %arg3 = 0 to 256 {
          %9 = affine.load %reinterpret_cast[%arg1, %arg3] : memref<1x256xf32>
          %10 = affine.load %5[%arg3, %arg2] : memref<256x10xf32>
          %11 = arith.mulf %9, %10 : f32
          %12 = affine.load %alloca_10[] : memref<f32>
          %13 = arith.addf %11, %12 : f32
          affine.store %13, %alloca_10[] : memref<f32>
        }
        %6 = affine.load %alloca_10[] : memref<f32>
        %7 = affine.load %2[%c0, %arg2] : memref<1x10xf32>
        %8 = arith.addf %6, %7 : f32
        affine.store %8, %alloc_9[%arg1, %arg2] : memref<1x10xf32>
      }
    }
    return %alloc_9 : memref<1x10xf32>
  }
  "krnl.entry_point"() {func = @main_graph, numInputs = 1 : i32, numOutputs = 1 : i32, signature = "[    { \22type\22 : \22f32\22 , \22dims\22 : [1 , 1 , 28 , 28] , \22name\22 : \22Input3\22 }\0A\0A]\00@[   { \22type\22 : \22f32\22 , \22dims\22 : [1 , 10] , \22name\22 : \22Plus214_Output_0\22 }\0A\0A]\00"} : () -> ()
}

LLVMIR

$ docker/onnx-mlir.py --EmitLLVMIR mnist/mnist-12.onnx
LLVMIR Result
module attributes {llvm.data_layout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128", llvm.target_triple = "x86_64-unknown-linux-gnu"} {
  llvm.func @strncmp(!llvm.ptr<i8>, !llvm.ptr<i8>, i64) -> i32
  llvm.mlir.global external constant @_entry_point_0("run_main_graph\00") {addr_space = 0 : i32}
  llvm.mlir.global external constant @_entry_point_0_in_sig("[    { \22type\22 : \22f32\22 , \22dims\22 : [1 , 1 , 28 , 28] , \22name\22 : \22Input3\22 }\0A\0A]\00") {addr_space = 0 : i32}
  llvm.mlir.global external constant @_entry_point_0_out_sig("[   { \22type\22 : \22f32\22 , \22dims\22 : [1 , 10] , \22name\22 : \22Plus214_Output_0\22 }\0A\0A]\00") {addr_space = 0 : i32}
  llvm.func @omTensorListGetSize(!llvm.ptr<i8>) -> i64
  llvm.func @omTensorPrint(!llvm.ptr<i8>, !llvm.ptr<i8>)
  llvm.func @omTensorListGetOmtArray(!llvm.ptr<i8>) -> !llvm.ptr<ptr<i8>>
  llvm.func @omTensorSetDataType(!llvm.ptr<i8>, i64)
  llvm.func @omTensorGetDataType(!llvm.ptr<i8>) -> i64
  llvm.func @omTensorGetStrides(!llvm.ptr<i8>) -> !llvm.ptr<i64>
  llvm.func @omTensorGetShape(!llvm.ptr<i8>) -> !llvm.ptr<i64>
  llvm.func @omTensorGetRank(!llvm.ptr<i8>) -> i64
  llvm.func @omTensorSetDataPtr(!llvm.ptr<i8>, i64, !llvm.ptr<i8>, !llvm.ptr<i8>)
  llvm.func @omTensorGetDataPtr(!llvm.ptr<i8>) -> !llvm.ptr<i8>
  llvm.func @omTensorCreateUntyped(i64) -> !llvm.ptr<i8>
  llvm.func @omTensorListCreateWithOwnership(!llvm.ptr<ptr<i8>>, i64, i64) -> !llvm.ptr<i8>
  llvm.mlir.global internal constant @constant_6("\05\AA\BB=c\B3\F8=R\CC\AE=N\19\FB=\86?\CA\BD\86\A1\E5\BD\9A\\\12\BD\12%\C5\BD\C6o\17\BE?\C8\0E=\DDoF\BD\95-\0C>]\8F\15>\9DI\F5\BD\94\08U>\A2\95h\BE|\BF\D8>\82Wp=\DDT+\BE9\DD\BD\BE]\DAD\BE\EA*\C1=}\E1\BF=\EA\F9*\BCd l>|\A8\E7\BE\B1\E4#;V\BDK\BC\D8)\02=O\CC\9B\BE3\AB\93<\F8\E9\C6<\EF\1F\93> \18/>1\\\98\BD{\BB\90<\BE\C5\D7\BD\B8\8C\A7\BD\FBCu=\B3>\F8961\1D\BEt\0C\F7=\CA|\DC=\E5s\C1=\C1\0D\8F\BD\F4e\D2\BC(\80\DF=\EFX\AA\BD5\1F\A9=\C3\EC3\BE14,\BE\92S\D7=E\7F2\BE\96\83\A8\BD\9D\F3\ED>\0C\E5\F7<\BA)#\BEi_L>x\EF\CE\BDr4\FD\BE\E6\BF\A8>\22\C55>\CE\A0\D2>lp\FC=\FD/\8D\BE\1A\BE\EE\BE\F1\17\BE\BE\DF\FC\AB\BC\AD\12\03\BE\22\E7F=\BCi\C3>\CD\8Bm\BE\1C\D6\D0>\ED\9D\B9<\22v\9F=2\91+\BF\D1\93z\BD\FE\8E?=\13\EA\06\BDj\A9\11>\EE\A3\03\BE(\C8\D4<\17\C4\12\BC\8D\B27>\B6\0D\09\BDK{\DE\BCgl\05>6V:\BD\04\DF[=(\FE\B2<j|\C3\BB\ECoK\BDK\BA\22\BE:\E9\DE=\D5%.\BE2\FB\B2>I|2\BELs)>/\BD\0F\BEL\E71\BE\B1\EB\15\BD\A0C$=y\90D>\ED%.=\D6\C1'\BE{B\E2>\86\A0\9D=\B3\12\E0\BE\82\A9J=\ABmq\BE\AD:\C9\BD\F6\99\CF\BE\C0\FC\BE\BE\B9\89y>M\87\05\BF\A0\1F\11?\0C#\0E?+\DF\D5\BD0Y8>\91\FB\E8\BD\0Eh\22\BDS\AB\E5\BD9W\1B\BB\A5\0BN\BB\17x\D2\BD2\FB\9B<\F5\BE\93\BD\BD\EC\80\BD\C6\FF\B1=\E4\D1s=\14\B78>\A7\EF\DC=i\B8H\BE\81W\03<\A3\A3\81=C\85r<\80<\93\BD1\E2\DA=\8B\EDz\BE\00\E4y<\02\9D\AB\BE\98L\06\BD\AA\E3\22\BE\0E\90\15?\D0\8B\96\BDy\07\04?\A6\02%>\A88M\BE\DEZ\B0=\E3\91\88\BE\F5\0C\F7\BE1\B9%=9\0A\D4\BCVY\99>E\DE^\BE@9\A6=\99z\88>P\92\94\BE\95\7F\88>\C0\ECO\BE\C7\8F\FE\BD\91y\C3;]\BFe>j\D1\0B>\A7\99\E5\BC\96\D4\8F\BET\E7\BA<\D6W\85=\EA\8B\15\BEE&\D1=&\8B\0C\BE\D3\CBe=\E6 \A6\BDT\0C\E9;\FF\A5S\BE\AA\D5\E7=`u8\BE::\B8>cTk\BE\FB\C4\FE;\E0\C1Y\BE\D2\EF\D1\BD\C0\90\BA=\A1\EE\8A>W\86\14\BE`\A7\B2=\96\CB\8F\BD<\18\0B>\C1\CA\F0=\DCI\C7\BB\C4\00\1E\BD\D2\14\B0=\CC2B=\F3\13\16\BD\FC>\A7=\14z\AC=Z\FA\09>\04\16\81\BD0\B8\B5;RK\9E=\FE\C9\C4\BC\D8B\97\BD\7F|x>\0A\17M>\C2\95\02\BE\22l\C0\BE^\C1\83\BE\93T.>\F4\ED\94\BD&\B8\DF\B9\0E\9F\0F\BD\F5+\81>\CD\B5\97>9)5>pq\D0\BEp\8C7\BE\FEG\F9\BE\0A\04??\1E\1F2\BD\E8\D5&\BD\BE\DBg=\86\22\91\BE\1DR\8A=\9A\AF\8C\BE/4\97\BEq\8F\A3>+U\CC\BD\BA\C1\B7>\AEe\0C\BE\A2\B1x\BD\84\A8\B6=\0A\BF\FD\BD#{\F6\BE\80\C7\F7\BDm\95\9A\BD\AF\CE\01? \96%>\0F\0E\09=02T\BC\12E\E1=\DC\879\BE\EF\16V\BEJ\CC.>\8EuU>n\DF\D4=\A4\E6(>U\C0T\BD\FC{\98>\F2b\F5\BD%\8B5\BEr\06\12\BE\EFD>\BB#\B3 \BE\FA\98z\BD\C6\16<>\0D%\8C>.\87\B8\BD\F7q\F2\BD\07E\DF<\A5,\AB>\C6\C4\13\BE\A5\E2\93\BE\0A\91\82\BE\EA8\C7\BD\C6\E8\13?\F8#\95\BE\\/>>d\C8n\BE\BC\06:>F\F1)\BC\F2E\1C\BDB\97\B6\BD\85\86%?\81l+>g\D8\01>\10\8E\C8\BD(N[>\C6p\87>\E5\A4\\=\88oB\BFv\C6O\BE\E2Y\B2>\B7\C4\0C\BEW\DF\92>F\EF[>x\CA\C9=\B60v\BE\E9^#>\A96h\BE-\95\8C<$\C4:<\F8d3>\03~L=M\95\9E=d\90;\BD-^\C8<\C6\B6R\BD\10=\FA\BE\B5\C4\86\BDnN\CE=Gd\89>\C8\1D#\BD\02\90\C8=\DF*\22\BD\DF\D1\9B\BD\E7\A9\DA\B8b\E2\05=\B2\B6\9F\BE\90m\B6=\8DW\94\BE/\C8\A1\BD\19L~>\C9\ED'?`F\94\BE\80S\B1>\08\EF\DA\BEI\13\80\BD.\92)=\1B3\C2\BD\F4\15\12\BEZV\15=]\EE\06\BE{\1C9<*\D0+\BDY\B7\CF\BC\02\8A5\BE\BF\85G=\CFK\E9;\08\FA\0F\BD\CD\18\F7\BD\99\EB\1C=6lI\BEd\DE\1B>\FFH\88=wC\DA<\92\9B:\BE\C0\8FM\BE\F2\93}>s&\12>\BA\EAN\BC\0A\0B\01>\A6\B4\94\BC\D9\B2=\BC\9D\F2\E8= \B1\AA\BE\A4=\06\BE\A0\1F\14\BE\CD\01`>\FF,\94>\09\0B\80>\AA$2>\0E\D6\D0=v%\83\BE\ACs\E5\BD\A83r\BD\895\10=\D76'\BD\CC\0B\B5\BD\D5Z\8F\BC\AC~\0F=\8D\D4\D3\BD#.\8E=\96c\90>IL\88=\84\7F*\BE~\88\87=\CB|(\BE#(\D1>\D12\80=\89H\82\BDXZ\91\BEB\87;>\07+\FD>h\EF\97>\D7\19\8B\BE=\F1\FA\BBOJ\FE\BE\E3\BC\AF>\EA\BB\C2=7\DC\8D\BEM\BAE>Q\F5x\BE}?d>)\F58>nN\AE\BE\9F\80\C9<,\0F\F6\BD\CF\C7\AA>`\B5s\BE\ABl\FB<2\D1\AA<\8B\18l\BD\F5WK\BC>\EA\81\BEK\99\AC\BE\E4\A0\FE>\A1\F0\CE>C\88\B8<\BD\17e\BE\1DZ\02;_S\A3\BE\1B\B2\F4<I\943>\F2\91[>(\C2\88>\FDK\E0=B\F0\90\BE*\C5\A7>c\12\8D>\F1\12\C1\BE\AC\98,\BF\0C5\D9\BEY\E13\BE\88hc>\F2\9E\06?)>\FF>o\F5;\BFgg\94\BD\A6!\02\BDU6\1D?\AF\F4\8C>\A7\ED9\BE\1E\D20<S@\8E>@HG=\F3\8CD>\CC\AA\11\BE{\D3\C0=\03\A0\11\BE\D4\9EC\BD\CB\80\0D>\86\02\E9=(\A4\11\BBj\F3F<B\17\03\BE\C5\E7W>Z\E2\C9=\DF\F1\F0\BB\D0#\BB\BD\E7\8E>\BE\C4\D9\BF=?%a>\DE\CDa<\D9\DF\97<\A4?\CD=x\8Ak=\8D\FF\B2=(\B5\84\BE\0E\9FQ=-\84\01=\82\DB\9A=\01\B0\\\BEep=\BE{\D1\89>\CF\DDm\BE\98\DFu>\86\DFZ>\15\82\08\BF\08K\A1\BD\CE\DBX>u\A5.>\A8H\09?eML\BE\0BV\B9\BB_\E9G\BE!\00\FE\BD\8Af\8A=\AF\A2\F9\BD\22n_=\81!\9A\BE\13\E8\0F\BA\A0\9E/>\F3.E?\9E\B3\8A\BE\15Nq=\09\F3\12\BE\9CN\C1\BC\1FF\B6\BCB\ABo\BE\ED0\8D\BE-S\CE=\D0+\08\BE\10\F1\0A\BE\C5\1F\1A>V)\0B>\9DO\AB\BD\15\CA\12>54\DF=\C9i\E0\BD\AD\F9\97;\F10\A8=\D7bi\BD\13\87\05\BD2\FB*>\17\CF\EE\BD$x\05>\A4b\ED=(\17\AC=s3\0F\BEH/\8E\BBi\B3\9A\BD\C83\9A=\12\B6\15>\83\D5\95\BD\1E\E4(\BE\99QE\BD^\F8\E9=\1B\96)\BE\CEh\CB\BD\F6K1\BE\14\D5\C8=PnV=O\EB\12=g7\879\9A\06\E2\BD\07\B4\A2=U\83i\BC\A4K7=\0C\AB\C4\BD\0Ep\85\BD@\DE\98<\BE\A6\D8=\FF\E0\E5=\B7a1>5G\86\BDU\EC\03=O}\87=\C2\EF\D2\BD5\DF:\BD\BB\EA\B9\BDt\16\AF=8\F1\8C\BD\D6\D4\A8>\EEV\0D\BE\13\F7\80\BD\CD'0>N\C4k\BDM\B6\0E\BE\0E\89\8E\BE\DE\9An\BB\EA\8A,\BE\AA@\CD>3\99\D7=#9\F6\BC\B3\CB\A0\BE\BF\ED\D6\BB`\CD\9A\BC\BB7\BD\BC\09\F0T\BE\C2b\EE=\C6E<\BDP\BC\F8=;\B0\F1=Q\E5\B6>\9C\09A\BE\05\E5\07\BE$4]>\03\C9\91\BD\CD\E6v\BD\C6nj\BC\97\E6\C8=\90U\DD\BDv\B1\FD<_\E7\C7\BD\97\C4\CC<\AE\CDv\BE\A1\0D\E0<\9B\0F\0A;0O\F4=\D1\86\C6=\00U\A3>o0*\BET\D9'>%\FC~\BE_\A8\04=\22\A2\C2=\CE~\82=\97Q\C9>\C9j\CC\BEV8B\BENQy\BE\CD\CB\BE>\D8\EA\B4\BE\C0e\AE;\DB\188\BD\13\8Ao=\B4?\86\BE\DA;r\BD\08D\B6\BE\D0\EES>\16[\8A>\99\A8\\>\06\00\B7\BE\F0\13\12\BC\8FM\CC\BE1\B6`<D\E4\D8<\10\98\11>maO\BE\98\A9\8E>\02!\DB\B9\0E\1EE\BEZ\BF\22>\BAL\BD\BC'\95\E6<\DC\A7\EE=\F3\9A\92\BC7hg\BDP\E7\A3\BDQ\1B\97\BD\D0'\D4\BD\BA\C7.=\04\EB\B0>[\02\B6\BE\1B1\84=\B5\11\BE\BD\03\10\EE=$\93[>\7F^\93>\CAS\B8\BE&\EB\A0\BE\A26\B4=z\AD\CE\BE\FF\DFI=,X\85>\B5\CC:\BD\80M\AE\BD\F5\12\C5>\15\EA\80>\F8M\F6<@\13D\BE,a+<\FB6(\BE\B6\8B\CF=\05,\98=\E7\94\92=SA\09\BE\BAXD\BE\A9D\96;\EC\F2S<\06G\87\BC\CB\9F2;+~\15\BC\1A\BF\EB=\85L\8C=\AC\D3\D3\BD\8D\F6\ED=G\9Dx<\AF`\E1<be\F1\BC\B6\DB\B3=sW.>\D9/\DA\BD\E8\85\ED\BD+\9D\0D\BE:\1BO\BCRn\D5=|\E1\93\BD\BC\DF.=\EB\B3\A9=F\0F\8B<,\F9\83>/9\E2\BD\FF\1A\12\BE\9E\85\B4=\DC\07l>\C0\1C%\BD\CC\BE\99\BD\0E\AD\A1\BE9\C6\B6\BC\A7\CC\13\BE\9D\87\94\BD_*\22\BE\8BZ!\BE\05\EA\87\BD\0FL\B5>\F8\12\E1;Q\D0\1A=r\87\8F\BE\87\05\99<\B4L\A9<{\C8\8C=\10\80N>0+\C5=[\AB\F1\BDGx\F6=\E8m\8D\BC\A4\91O=\8C\A4\DF=_Y.\BD\17\ED\E6\BC\C8cc>JS\05>\09\12X\BD\C4@\FF=\86\C2\B0=I\FEJ=\1E\BBF>,q\A7\BEU=R\BE@\FCs\BE\0A\C7\8D\BE\17\A8y=g\C2G>- \A3=\83n\17\BE\0D\9FN\BE/\FF\A0\BD\05\0F\AD\BC\D2S\1F?D\0A\03\BE\10E\BA\BD>\1F\D8\BD\AB\CD\94>y\F3e\BD^-m=\0F\B7\A9\BD#\D7\9E<\04\E7\AD>\9F\13*\BD\F3\183\BE_=\07>~\B4n\BCk#\F1\BD\F1u\8C=\D6\C8.\BD\C2)\11>Uk\82=p\1CE\BE\C6D\E8\BDkFF\BC\D5\8E\DB=\12\8F\9A>q\A1\FF\BDv\BB\16\BDs\09\96>\00I\86\BE\16\A8[\BD\9D\09\AE\BD\DA\DF\F8=\F2\8D\00\BC\07\8A\97\BE\F8*\A7=\03\C7\C4>\82\CD\B3='Y\86=\D0\D0\16>\F7X\00>\C9\C7c\BDC\D7\80>.\1C\C9\BA\AD\9E8\BE\0D\98(\BE\C3\C0\F0\BD\04;\ED\BD\CBR\DB\BD{,*>\19\DA\B5=\01\BC\EA=%?F\BE\1A\0F\1B\BE\FATe=\B63\0B>\0EG\FD\BC\9D\DFJ\BC\80\B6\A8=\1Bp\85=\B6\9At\BD\B0\B4\18\BE\F8\02\04>\E2\0Bz>\94\9E+\BEf\D6\B6=da\12=\D9\EC\B6\BD/P<\BB\BAI\09\BE\97zl\BE\06\FC\1F=\1BC+\BE\F6\E86>\E53\C1\BD\B6\D1\99\BC\AES\0C>\9A\FF\A4\BEl\D5^>\1A\FA\A9>\AD\84\F3\BE\C7$\E5>Z\A1\9D\BE\C5[\1C\BEA\8D:>\D3\FC\B5\BD\E3\06)>\92'*=A\07;>\AE\CE;;\BF\FC\9B\BEI\8F\1A>\E6\92\8A\BD\92\C6*\BE\B5\FA\0C\BE:1\B2=\9D\A6%\BD/}\17\BDFD9\BE\0D%(=\98\92\FE=\B9\A7-\BDn|\82\BD]\E3\0A\BE\BCy\B8=\9Eh\13>\A3\A1I>\8B\8E\F8\BC&\1F;=\C5\B3\86=\BF\7FA\BDQ\84\B6=\C6G%=M\1DV\BD\\\84\1F\BEL\E7D>\86\AE\0A>L\81@\BCLF\81=\16e\E1\BC&N\A1<\22J\9C\BD-L'=\D8\CE\09\BD\22v\8F\BD\8DFL\BD\EF\F5\16\BE\9A\C8N=\C8\E5w\BC\15\8E\DD=\A7,\CB=d\DF\0B\BEV\F2%\BD\AA;\BA\BD\1DYq>\9A\F4\84\BE\EB\D05\BD&/\EC<\16\03T=\AF\E3~;(\AB >~q\CF=_eT\BE\06\94\C0\BDI\85\82>m;\1B\BE\9E\94\C1\BE\EB!\19>\C7\A8\D2=\EDX_\BE;\DEe\BA\C8\0E\EE\BD\E8\14\BA=\1B&\08?ZB=>b]\1E>\02\B2\9D\BD\89\0F\9B=\9B\B3u>\99=\E7\BEy<\06;\8A\D5\CB\BE\18\CC\05\BE\E7\B6\CC\BCDD\8D=\F1]*\BDE{\86=:\F8\81\BD\F7\B7?=\88\AEM\BC\9C\18\ED\BD\AA\CAn\BE\FD\B8\8D\BE\BBS_\BC\92\B6\95\BE\14\DD\CD\BE\F0\DF\BB\BE\BEA\AC>\D8NN\BD\BE$+\BD\86\1A\85\BEc~\99>\E6C\E0>6zt=e\84\01\BCuP\C3\BE\01R`\BEY\E7\80>~\DD1>\B1\AE2\BE\A1f\1E\BE\EF+9>\DE*\B7>\86g3\BD\A2/\BE>\02\B3\E7\BE\FD\C6?>\7F<W\BC\B9l\12\BEdP\13\BF'T\04\BEYu1>\1B\EC\C3>|\07\1D>\CFL#\BEm\F3\17=\14\15\8E\BCvc\0D\BD\CA\073\BE/=\DF= \98\99=\1E\DE\1B>\D3\02)\BD\1C\CE\8A=\8B\BE\1E\BE\AFx'>\9DRi>\8B\E4?=\D4Z\F4\BC\1C\FD\D4=><B\BE\D2\F6\0A>@\C8\B8\BD\1E\CC\86>q\BC\91\BE\8F\E9%?\E8j\0B\BEOM\84=\D9\8C\F6<\9A\DA\8D>\11Wc\BE$\E8gt;o\95u\BE!\CBe\BEe\AEi\BC!\13\E9>\1F\17j\BC\DE\C6I\BE\1FC\8C\BE\16{5>\09\E9\93=\C0\AF\F4\BD\B2B\93\BD\BDP\DF=K`3\BE\CCY\B6\BD=\D2/>\0A\F4s\BD\9B\85\E9=\98/)>\99\05\B4\BE <\0D\BD\0Fp\F0\BD\FE[\09\BEh\F5#\BE\17:\87>\8D0\DF=\F2$\B7\BD\9Ck1\BE5\8B^\BD/\8E;=\CFG\A7=\C1O\AE=\94F\A4=\81\8Dw\BE\02\98\BE>\06\BC\CE\BDUq \BE\AA\8AP=\83\92L>\F1\C4z\BE\DF\0E\0A><\C9\0F;5T\FF\BCd\8A\F8=\E8\EE\01\BE\8A!B\BE\91\AC*>\A3\9F\F9<+\C4\1E>\C8\02X\BDE7\D7<\99\EAh\BE\1B\99\09\BE\FD\84\9C>,k\BE\BD\151=\BE\8C\93\CC>\FC\81b\BEwK0>\C6\C5\F2\BC/8\E1=z\F1\B8\BD\FC\C6a\BBi\03\18>\96QS=\04\1C/>Y\0B\A7<\E8'\8C\BE\F6<g\BE\FCx\14\BE\82\D7M\BDk\C1\83>n77>M0\D5\BE\98p\C2<\0E\C20\BE*\9F\02\BF\83\CC\FC=[\A1\9C\BEh\F7\18=\BEBE>\05\02\F2>Q\B4\DE\BD\DC\F6\C7;\E2J>\BDb]\F9\BE\80)%=\87l\AD=7\85\03?\AAE\86\BDn\EA\19>w\8D$\BDD4]\BEX\C7z>\F3B\0A\BE\B4U\D6=\E6 8?\EC3\02\BE\91+\87\BE\E6Z\FB=u(f;\F4E\1F\BF\CC\CA\82=N\D1\F0<\11\0E\AC>\F2\8A\F1\BC&H\DF=\B8\CA\E7=`3O\BEb\D3x>\80i\DF=\9Az\A5\BE\C5T\11\BEh\FF\83\BD\D7\BBL>r\F8\08=\\\FEA\BCk\CF\BD<B\18\05=:\1F\CB=.\E1\0F<\EFk\D9\BE\ED\04\03>?W\B1>b\8E\92\BE\0Ct\89>\F9\ACV>\D3\E9C\BE[>\A9>_d\9B\BE\8A\FC)\BB\A4$\00\BE\C3Us>\93\B6{>s\1DM>\05\14\E6\BD\B3G\81\BE65\E8\BD\D1@\A8\BEBAZ\BEw3\9A\BD\E8Q\C5>yir\BER\EA\D3>N\B2\F2\BDg\E9%=a[p=\88W\DB>\AE>\AA\BE\E2\AD\98\BC\ECi\99\BE~\22\B8\BD\03\C4\D4\BD`.Q;N\B9\00\BE\A0\E8\1C\BD\C7{\D1\BEHg\BE<\C337\BE\10\9A\A4>\FF\B1\82\BELK\E3=\DEC\CD=\EC|\03>>vJ;@v\03>T\02\D3\BD\F2Fk>\04\ED\9F\BE\15\E9\15>\001T=\D9k9>p'\9C\BD\8E\14\83<\B9(y\BE\E8|\9B>?-\DA\BE\10\84\8B>\91\22\1C=\A6F\81<\B2k\A1>b\81\AE\BC\10\D3H=\06\CAV\BC9]\8D=\D3\B5\C4;\8F\EA:\BE\CA\CF\B7=;\84\EC<\13\04\19\BD1_\FB=\84\CA~='\E8\DF=\B4g\BA\BD\08\B9->wb\A5\BEJ\D9\10\BE\E2\D1\83>\E3\A7\FF=\83\FB[\BD\F5\0B\DE;J;\EE<\11n\08\BC\E2\CB;>[\04O<\04\E2s\BD_\DA\E7;\08F%>6\A7S=?\A9\07\BDzO\16\BEe0+\BD\BB\\\C7<x$%\BD\D6l\93\BD\12i~\BDu\E4\CA\BD\06\F0\9E\BD\8E\FF\FF=\\Ri=\05\A5\B3=_h\04>RID\BB8\C8\D0\BDQ\8C/;@\A2\8F\BDa\B7\C3='v >E\EB\D4=\15(\13>\02QK\BE\05vM>\F7\A6~\BE\B1\8E\91<8h\DB=\1Ca\FC>$\82\89\BEjD\F8\BD\DF\0B\02\BE\A0UW=\A8\EE\89\BE\F3E\DC\BD\0EYJ>\\xU>\EB\F7@>\FD\99\EB\BD(O\9C\BE\97C\EF\BD}\14\B2\BEWN\05?~I\F1\BE\19pn\BE\D6V\1E>\A5\15\83>\EF<9>\B1\C4\B2\BEo\83\AA\BD\E3\17\A8\BDHqO>\D9?/>\DE\AE4\BE\EE\EB1\BE\86i\8A>\E3\D5\A5\BD\F6\F6\91=\B5\EF\E6\BE\92\F4\8B=\9B\F2}\BD\A0\0B\89>\FCQ\0E\BD=\DD8=\D8\1A\E8<H\D9\\\BD\1AY\8B>.\16\F6=\00yV\BD\89\A3d=&\CF\93:\8Eu\C8\BD\8F$\B7=\CE0v>\DF\A7*\BE\DEn'\BE6E8>\17\AC\11\BC8\D6\E7\BC,\BB\03\BEe\DF\1C=\AD\09\03\BC\F0\04\D5>$YS\BEm\B0\03\BE\D6\9A\09>\A1\03\06\BB\95\BA\8E\BE\0CA\94\BE\F4=\FB\BD\D9\BE\12\BE\B7G\F6=\0F\BE\A4\BC0\1A\F3<\F0\17\06\BD$\DF\AE=\EA\C3\BE\BBA\D2\8D>\B9J\BE\BDc\DD&=e\D9\84\BD;\F0\89=^\8C\D0\BE\E1\075>\E7BM\BD\D0\14\E3\BE\D14\08>\8AXM\BBq\AB\11\BF\CD\DA\B4>r\E2\1C\BE\E1\94\93=m\A2\AE>h^\80\BC\A5\F3\9B<\7Fb\E1\BDP\C6\0F\BE\0BE\A8=\1Ft\A1>\F9\EE\A2>\B7\0C\14\BB\B9\0A\07=6\C6\96\BD}zm\BE\8B\BD\A9=\BD7\A9>\04\B8\EF\BD\91\FB\0D\BE\CAx\F0= \E0\F2\BD\19\DBy>\CAr+<\9E\F4&\BE\86\8C\CB\BDY\03\D1\BDu\B1\11\BD\22\D4K\BE\8B\\=>\02\CF+:W\E84\BC\F3S>\BD\E0\179>p\1BU\BE\FE\0E/\BC\A6t\E1=\0B\E1\A4\BE\08\84a\BD\CE\F2\94>0KM>\AA\BD\97\BE\94\F4\93\BD\E5gD>\E0\BE\F7\BE\CFF\93>\D0\EC\0F>m%\8F>\97\A3\15\BD$\8F\A5=\B3\0E/\BE\DD\CB\FE\BDXn\8A\BE\86#\C7>\C0`\B3\BE\85g\CB\BD$.\D1>\A6\E1'>8\82p>p\9C\A8\BD\8B\12o\BE\CE\9Av>/\07T=\FF\DE\88>Y\F2\CB\BD\07\AD\17\BE\A5\EB\22\BE^,<=?\1F\F3=t\1Fy\BE\CD\B8\0F\BE\AC\A1T>\F6\FB<\BE\E9f\22>\C7*\FF=\CE\D0\D9\BC\BAPM=c\BE\A8<\AA)m=\AC\D6\83\BDEw\7F\BCX,\18>\F3c\D6\BD\DBw\01\BE&\1B%\BE$\8A\E5<\A3(.\BED\9B!>\BE\A4\F6=Y\E0(\BEa\BF\B9>\1C\80\88\BE\92\11\11\BE\01F\C3=;\AA\81=\A6\ED\D9\BEn\EE\BE\BD'\B9\8A=\16\A5\D4=%\\\B5>\17Z)<N\A7\A5\BDaJO\BD\0A\EAM\BE\BC\BA\AE<\D2l<>\90d-\BE\FE~\B6<\AE\DF\E0\BD\D2o\98\BDX6\13\BF\A4 \B5>\B3\10\F7=qhR>4\B0\03\BD\99\98\07>q(r\BE\C5\1C\BE\BD\A6\90\04\BE\AA\18\DE=\EC\81\F2\BE \93@\BD\0B2{\BEn\F3\EC\BD\99\F7;\BE$\D3\97?\BCPW\BE\95|\0C\BE!\16\AD\BD\F0.\D0>\F9\C0,>`{\E9=\1C\EC\FC=\1E\E9\B5\BE\F8fD>\8Cv=\BE\B4O\86=\0F\10M>\1C\83\A7\BD\A2VD\BE\A3\05\AD\BD\B0\B7\AE\BD\0DP\B6\BB00V\BE\B9B\AF=@\B0R;p\F2\16=S\D7\1A=s\F5\F8\BDj\FE\D5=\CA!\C0<\D1[\E1\BD`ap=\89Hc\BDy N\BBP\02\C9\BD\93+g=\AAQ\AA\BD\84\F1\91\BD\8F\04\A9\BE.\FAX>@\E7\0D\BD\1F\FAC>\8B\0B\05>\86\92\D9=\D8\84r\BE\11+\DE=\86k\9F\BE\E4\C3->\22\C7\9E\BD\96\B0\02?\98%\F1=gp;>C\A1/\BE\F8LW>E\E8\98\BE#\9F\C2>JzT\BC\AFj\94=V.\89\BE\C6\B1N>\D2[A\BD\A1 \FE=J\FD\87\BD>\BE\8A=I[\86\BDo\F9e=\10\B7\08\BD\A4-=\BDs\D0\E4\BDNU\BF\BB\93\C9B<\EB\EB\AB\BC\FCB\80>\09\87\E0\BDN\F4\03\BCc\DBr\BE\C9\F5\88\BB\BA\B9W>\1F\F6\D2\BD\13i\AE\BD{9_\BD\1Al2>9\E4\86>\C2\D2 \BE\EA\E9[\BC\CBw\09\BE\EB\FB\8C<\01\1C\E1=X\9A\F9=\DF\A7\1D\BE\E0\1E\F4=\EA\04$=\1B\F9Z>h\A66\BE\9F%\B2=8\F3\7F\BE\06Ck\BD\EF\12E=.3\E8\BC\D9R\13=;K]\BD\F4^#=\80QF>\FF\CD\B0\BD\E1H\C3=\9Ao\A5\BD~[\01>\CCf\DF\BDoG\96\BEY\B8\90\BDJ\FB\E1\BD\CFj\A6>\08<\E0=\B42,\BD\1A\12=>\CB\FC\B3\BD\BB\F5Q\BD\1C\AB\BB=8\C7\95\BDAk\DC\BD\EC\D6Y>&\93^>;\D6\AE=\BFvw\BE\80\E4~<[s\15>\FFp\81>\1D=\BA\BD\CC\A5\1A>\ABA6\BD=\A9\09>\01\CE\02\BE&\A9H\BE4\80\A7>B\F0\BD\BE\CB\A8\B8\BE\F8\D5'>\06\BBJ\BE\F2\F2[\BE\FA\\S>\B3v\04\BE\8A\0CE\BDi(\F3=\E1\06\12\BC\8C\C8\89=\E2\A7o\BEk\EE\86;\D8s\B2\BE\E1\87\9D\BE\D1~\01\BE\0E\8F\8E\BC\A3e+\BDj)\CE>UT5\BEUv\87>P\CB5>\DF\A7\1A=\9Cb/\BDwWm\BE&rr=\B1\CA\1F\BE\E1\10H<Zr\B7=\EC\C94\BE\E6\C5a=\C6\AA&\BE\BEr\B1=(\8A\D0>i\B0\97\BE\86\C8\7F\BE\22\1E\15>\DDi\04>\DB\E4\D6\BE\80\8E_=\F4l\1D\BE\88\86f>uV\AA=TM&\BE\F6?\B9\BDA\1AB=\D5\E8\FE=\BDw\B3\BC\A8\DE\B9\BD\E1O\16\BEG\CC\CA\BD\FA\12<>)\98\99=;\8D~\BE\A8\C3\8A>W\F1\03\BD\22t\08>\C3\B1w\BDS\BE\9B=\1D\C91\BE\1A\169>@H\9C\BEL\C4\DC=\96e\FF;9O\B2=\\\84\8F\BEAS\12\BE\D0J\03\BF\AB\D8f>4R\01>\A3\19\8B>\86=/\BD\E1^?\BF\C4QF=*q/>\FEe\84\BE\DB\CEE?#'\CC\BE/\C3\C3\BE\9Fe\14?\13\C4\82\BE\D1\F25?\AC\A6\80\BE\C0\9B\A6\BD\D8/\02>\EF\94y\BD\A2\E7n>\98\06\EA<\19F\C1\BDY^\EB\BD\8D\A5\09=\18\B0C>\DA\E8\8D\BD\AEhI\BD\86O\8C\BD\FBGT\BD5\844\BEc\19>\BEU\1B\B5\BD\A4\E5\22>\C6n\17=\D9\06\A9=\A9\916=\E2y\D7\BC[\BD\90\BD\BC\80\DD=\17\1F\06<y\140\BE\BA\A9gt;\F4\CA\A2\BD\22?V=w\AFi>\C6l\9C\BES\CE\DC=5\E7`=\DD:\D2>\15\C9Q<!d=\BE?\81\CE=(\F7\F3<\A1vd\BE\A4\9C\DA\BD\B5\AD\92\BE\E7\CC2;\D1\AD\99\BC\A9_\E4<l\19\E7\BC<C5>9+\95\BA\87e-\BE\E5\F2:=rA\01\BEj\CE\C6\BD{\ED\DA\BD\9Cw\82=t\91I\BD\85\BD\08\BE\07\A4\02\BE\80C\C4<\D6A\B2<O\85\9F=\C5^*\BE\83Ve>rX@>}C\F8\BDy\17u=\D1\05\01\BE\93\FCn\BEx\F6\95\BD7S\82:\B9\0By\BC\F7BK\BE\A4\B9A\BEZu\0B>\D8\A6X>\AB\BA\B4\BC\11\9F\89\BCd\F2\0A>\E9\8F\CD=\AB\D0\E8>\D2\A5'\BE\1AZj\BER\\\8F<\89\84Z\BE\E4\B2\C7\BD\F8\D2N>D\A2\85>\C4q\\>i\F3\13>7\DE\AF;\C1h\FA=L\8E\FE\BD\BC\F4\82<\B2\D6\02\BEQ<\AE=\DEJe\BE\9DG\AE=3k7\BD\98\C5(\BD\96!\0C\BCJ\93\DC\BD\8F\EF\E9\BD\03\C8\22\BE\902d>@\AB\EC\BD\89\F40\BE\82V\99\BC:\83\82\BCN\00N<\16+\C8<z\F9\17>\09\B9*>\92}X\BE\13\B8p<\BBqF\BE^]\1C\BE\9D\B8.>\DD\05\99=v\BF\F3\BD\823\CB\BDg\84\15=\17C\9F><\7F\C4\BD\9D\08\D1\BD\87\12\E6>\B1\\F\BE\C0\80t>h.\04\BE\BF\0B\DC<\E6b\83>7\85K\BE\90\AD\03\BEk\13\01\BD3\AE\D9\BDV\00\1C\BD7K\03=9k\7F\BD1\16\A5\BD\1Ca\08>av\A9=\90T\A8=\8F\D7\FE<H\7F/<\B2{\F7<\BA~\EC\BE\88\11<> f\B1<\C3\FB\A3\BD\FB\09\8B<\8EH5\BD(L\9B=\A3\BF\0D>\10\BFo>L]\A3\BC\93\E2\89=q\D5\8E\BD\92zN=\FD\DB\1B=53\FA\BD\BC\8E\B2\BDs\81\82\BD\EA\D0->@/\E2\BD\E4\D7q=\1A\00\EB>\87k\13\BE\D1\C4\1B>\C9*\14>\C6W\9C\BDd%\9A\BE\00~X\BD\BC\11l>\D0\94e\BEMD\DE\BD\0B\A9A\BD\C1K\0D>N2\81\BEx\97\1D>\9C\19\A7\BD\EE\C96>\CA\99q>c\848\BE\18\D5f=f\9D:>g\B5x\BD\AE\C4\10=\C0\B4\AB\BD\17\02 \BC\19\B9\D8\BD\E1&\CE\BD\143\97=\0Be&>\DFq&>\05\CE\94=k\F0\88\BE\E97\89=\89UH>]#2>\C1\07\AA\BE\E8{Y\BE\F9\0B\B0<\CE\AE%\BD0\AE\A9=\1DrK\BD\E76-\BD_\97[\BD\C8Op>\E4\03\8D>~H\19=\CB\A5s>\01\9Dp<\D7\9C\D0\BD\DE\81\AD=\8C\87Q\BD\87\D3\D0<\F2\C5\CC\BE?\15\B0>\12)\98\BD\A35\C9=7\A9\1D>\CEAk\BE\E6\CF=>\C6\9Cb=\E4\14\E2\BCS\A6\C0\BD\F4Y\E2\BD\E5\84\AA\BD\AD\91)>xrE>\C3\F0%\BEQ\B8\91\BEUsc\BBv\FC\DF\BD\10\E8\87>\89\C1\07\BD\BF\1D\BF\BD\DE+\0E\BE\84(\91=\D1\0C\85>\DBq0>\A7\92\82\BE\B3:h\BD7\CE\95=#_u\BD[\84\BC\BD\D5\D7f\BE\A0(\1E\BE\D4\0F\99\BA*\A8\88>\87\17\01><\FC\A4>\06{\04\BEZ-(=+\8C\1C\BE\D4f\EF>\8DK\80\BE\A6m\A5\BD\BC\0D\18\BE\80N\97=\D4\C6\A6\BE\15W\8A\BDZ\86\FC;\81\CE\80\BC\06\1Br>\D7\1B\ED>,\C6\8E\BEp\D8\18\BE{6\9D\BD\C4Qq>t*S\BD:\93\00?\8BK\05\BFH\1B\18<3\B90\BC\1A\94\C4>\0F\AE!\BEQM\DB<\9Fi\80\BE_\ED\08>\1FXg<C\96i\BE\C0\FC\C2>\F5\BB\A8=\EE>N\BD-%\8F\BEn\94\19>X\1B\04\BE\B4\C9\D0=\83\B0\B6\BD\12\E2\A3\BD`\22\E1;\F5]\14\BE\B0<\F2\BD\E3\00\B1=\D3\A4\FC\BD\09\EA\C7>5\87I;\C2\B9K\BDf\0E`\BE\BB\C9\1C>\99\19\09>m{\EC={\8E\03\BD\C2\1A\D7\BD\F6\B7V>a(\EC\BC\AA\A1g\BE\E60\C6=4\C1a\BE\AE\DA\FB=\14p\0E\BE\\\070=G\A9\CA\BD\93\B0\85=\E3\05\F0<J\D9\AF=o\0FJ\BE\A1\8F\C8=\DD\F3\DD\BC}p\18\BE\CC\91\CF\BC`\DAt>Y{]\BCE*\CC\BD\B3\B2\BA\BD\82\B3\83<n\F3\8D>GL\D7\BD*m\C4\BD}\86-=\83/O\BD\AA\C3Y\BE6\1F\F1=q_Y=\05z\17\BE#M\DB\BC\129\BF=\FB\DB\CF\BD&\89\C6\BC\04\D3M=\229\1E\BC2\01\D9=\11\A4\A4=\1F \19\BE\86\A9\93=\0Cb\A8=-\9A\BE\BD\A7\FA\BE=\E6\0A\8F\BE\9A+ \BCm{&>\85\19:=E\08\02\BB\02\11\8D\BD\CDp>\BE;\A2\96;\E9\FCS\BE\EC\B2h=@\E6&>\BAh!\BE\E1\04\CD\BDS\01\8C=\FA\AC\AB\BD\00\07~=\10\8A\85\BE\107;\BE\DBZ\1E\BE\DD\B9b>Dk\98>Pw\11>*&\DD<'\0FA\BEOV\D5\BD\E9 \E5=W6E>\FE\DF\F7=\8Ae~;\01>+\BD/2\03\BEy\C0\CF;\E8\81\FE\BD\199\\\BD'\B9s\BD\DC\BC\0A=2!\8C>%\87\DD\BB\ED\01\C9\BD_\01\FB\BC^s\CF=3}\8D=J`\AE\BC-\CES\BE\BF(gt;\EB?\01? \CF\FF={\F3\EB\BD\95\F7f\BE\1E\ECk\BCV\A6\BA=\F2\F8\1E\BEW0V\BE\14J\C3\BDx\AB\A1\BEG\9C!>H\E0\0C\BEe\07\E2=}1I:\86v3>p(\93>\15?%>]\82?\BE\15F\AE\BDi\91\82\BE\BF\CD\CD=v\D6\B5\BD\B6\B0\87<x_\85\BD\09p\0C>);\81\BE\E8\D5w>\E6\85T>\C9\0F3\BD^c\84>\CE\AD5>\1B\E4\09>\E6\89\A3\BE\11C\CC\BC'O}\BE'\E8i\BE\0DM\96>\0B*\22\BE\922\94\BBN\81\93=2\B3\A4>\CC\0E\92=\BF\8B\16\BB\C9,\DB\BD\ED\C0,>\86\EFu\BA\FBx\8A>\E4\03\DB\BD8\FA\89\BEZH\BF\BD\053\B5\BE*\17\9A\BE\85U\B4>\1E\D6\87\BD\E2\94\A2\BE\DD3i\BE\B5+b\BD\8D\E0\F3>QJ\A1>\F3\BD\EF;\D4\92\C5\BEC:\CE\BDL\0D\19>&\C9\FE<\1E\E4\AE=j\F7\B7=\19}\CF\BC\D9\AD\C8\BD\CE\AA\85>\0C\D3I>p>\FB\BB?\FB\FC>D\87;\BE$\FF\E3=>\E3\B8\BDB\A9+> \DCn\BE\07\06`\BEx\A9J\BE\E6 \F9=\F4\04\8B=I!\14>\DFZa\BE\1Fb>\BD\D1\8F\A9\BC\CD\A1\A7:\85\8A\11>]u\80\BE)\04}<\CF\BC\B0>\92V\B1\BE\FC0\AB<\C6\F1\9D>U3p=\00\D0>=8\B4b>.\16\FE\BD\B7#\9F\BD\96!\99\BD\98\E7\DB\BD\1F\84\98\BD\9F\A2\1A\BD\7F\09\83=\92?\E8=\A3\D2\0C\BE.t*>\E6X\05=\B9n\DC=_F'\BD^\11\22\BB\E2\1B\9D>\17c,\BE\C6l\91\BE\E6\F5\B6>\ED,\1F>\02\FE:>\B8\B0\15>\EF\A38\BE@\E1y\BE\12\FE\89\BD\CF\ED\15>\05\15\00\BD\E2\FF\C1\BEq\BC\BA>j\AA\B4=\80\96\94\BD\17\C4\8F\BD\0EZ\FE;=\94\DB\BE>q\BC\BD,\8D\C8>-\87\9F\BEVq\EB\BD\12\1Fu>\E8\1F\A7=\C1\E9\BC=|^\A4\BD\F7\F5\8A\BD\F8\98\A4\BE\FD\8DX>\E5\9D\08\BE\E4\B5p\BE\\\877\BE\D5Xy=\81\AF/\BD\93Z^>\A97S\BEG\E2M>Xb\A5=\05\7Fe>n\22\14\BFo\00E\BD)dr\BEF\AB\AC>\83\10\12>\AA\0A\98>\B0\FE\89\BE\00\FDO=|-u\BC\AE\E1\0A\BE\B9g\80<x]f<'O\0A?w\C5\D9\BE:\BD\84\BE\FFGm='\FE\86>\8A\9A\A4=\02\A5x\BEu\03\F7=\E2\1B\B8=)\87\FA>\\s7>\FC\A6w\BDv\B2.\BFN\CB\86\BE\F4\86\0D\BEei\8F>\C5L\0B>N\A5\8E>\BE.\12\BE\B4\9D\BA\BE\9C\D1.<V>>\BD\EE\BA\E5\BD\B0$l>\85\DA\8F\BD\1E\A0\80>x\02\F3=\FF6\94>\02\A9\A0\BE\09S\E6=k5\04\BF\11\05\B7>\FC\D4E\BEx\D64\BE\A1>D\BD\1E\FD\1E>\B8\B8\BB>\CC\A2\C9\BD\F0\86?\BD\C7\A9H>\BF\B2\08\BEWJ_\BD\BCO\0C\BC\88\ACQ\BEw\E5Q\BEF}1\BE\A1k\08=\01\B5p\BD~\15\9F\BB\C6KB\BEu6\F3=\1B\16\BA\BD\F9\0E\C1=(\DA\10>\A6\22b>\18K\E2<\DE.f\BD\C3o\22>H\DD\13\BEGd(>\A2\A6\1C\BE\05\10+\BE\C2\A0+=\D6a\BC\BDl\FE\C3=\08\C9\D7\BC\0C\E04\BD\1E\8D2\BE\DB\81\91>\A3\81\F8\BE4\9F\96\BEIk\86>\0E\8A\B4\BD\ADtZ\BE\AA\C5\E2>R\0A\CE\BD\15\EF\C9>N\16\0D\BF\1A\06t=\85\FC\1C\BE^\A7\08>\A7/\F2>\A7\15;=\036B\BE;\E2\0B?\AE\CC\B2\BEd\BE\00?\07\1F\88\BE\A8s\A2\BD\FF*\C5\BEN\D7\9C>\BE\EF*>\83~\CA=\DF\A9\16\BC\8F\D0d=\C5\D8f>\DBl\10=\9B\84_\BDD.\A2\BB\09\8D\07\BE\EE\E3\D0\BD\E1\E3\FE<\F16\F8\BC6\15\AD\BDvb\1B\BD\85\D2\D4\BD\BFD\C6\BD;\98\CF\BD?\BF\A5>8\89\89\BE\84\CFK=V\9E\D9=?\1D\AA;\F2\DE%\BE\AF2\CE=\9De]\BD\B3fW\BE\FE\C1\F4=)\07\86>\18\0D\0B\BEY\F0\02<\92\A2\BA>I\C3\94\BE6\D9\1A>).\FD<\15G\BA=b\F9\EC\BE\9A\F6^\BE\B76\A7\BBF\1D\15>\06\90[>\DC\F9R>\C4\9E\10\BE\06\F3!>\22\CD\0E\BC\BF\EB\C8\BD\01\C2\A2=\AF\03\0F\BE1\DA|=\A8l\89=}O\8A\BC\CCg\CA=Q\E3d\BDt\91{<\DE\E7\0A>\0E\19\00\BE3\C5\04\BDL\8F\8B=\01\1DS=\E6q\B7\BD6\15F\BE\1Cg$=\0C'\01>gR\AB\BC\BA\E0\1C=\11j\89\BE\83\B9+\BE\1Fd\08>f\F0G>\1A\D5\DD\BCTl`\BC0\AB\18>\A7\C9\E1\BD$\03\89\BE\B3\A4.>\C4\E4\9E\BEfp\05\BE\98\EEI=\82\ED\22\BE,\F3\7F\BC\0B\CDQ=~#\0F>\19\C3\D7\BD\B4X\17\BE\DC\CC,\BE;\13\9D\BDRB\80>\0E\D4D\BBqC6\BE\95\\H<\94\85k\BD:\1C\E2\BD\F5\8E\D2\BC3\93\93=\8D\E8\03>\81^\DC\BD\ED\B7\1A\BD\AA\97\11\BEh\F1j\BC\0D\0F\E6\BD$\C0\BE>\93\FDU\BEt\A7\0E>\DC\E3\DE\BD\B0iS>\D7\BE\0B\BE\09\B5\A4\BC/Y\\=\E1=\EB=k\09s\BD\E1\C0\92\BE\C3\0AJ\BE\1E\BA\84>Z88\BD\83\13\04>\0F@\07\BDm\0C\D5=f\ED\D6\BDu\0D\B9\BE\A4\D4\D0\BENj\08?Y\1D\E2\BEb9\F2>\AF\BAl>4;\AC\BE\C5\13\CF>\9A\ED!\BE\D6!\C7\BD\A3\C6g\BDH\C1\AC\BD\19P\92\BDW\EF\1F>J\E39>]++\BE\FE\AA\C1\BD\E7c\F7\BD\CCP\9A<\F7\8A&>\B4\EF\8A\BD\1F\EDo=_M0\BD\96\EB\11>D\01&\BEV\18>\BEt\BDt=) \89>8\B3\E3\BC\19\B1\06\BE\8DU3>|S\1A\BE<\AA\05>\9F\AE.\BE\07\9A\9F=\CF\08\92\BE\9AD\FA=\E8\B3\BD\BD\AC\81\0C>\E1\DBO\BE\159f;\A1\88@>\B6c\E9<Ot\1A\BC2\F4\B9<bF\C9\BD\F0\E78\BE\B2y\EF>\C8Q&\BE\FF0\CE=k\1F\A0\BC\82=\91\BDa\82,\BD\AC0\F2;\BC\8FX\BD\018\ED\BD\04C\01\BE\19yu=K\A8\12\BE\AD\EF\D5\BD\9E\0D)=\18\EB\EF=\7F\E8\F5\BDs@4>\A6\833\BE\22\F6\83>\C8),>\959\9D\BC\FB\F9D\BE\19N\17\BE'\08\17>\C3gr\BE\D3\96\DD=\9AFX=A\F5\81\BE|\DE\C9>{s\F3\BB\00D\F7\BDS\04\0E\BE\F6\F2\C7\BD\00\04G=:M0\BE\E0\DA[=\0D(\89=N\9A\B5<7\F5\9F\B97D\03\BD\04\06t\BD[\82\88=\9E%\1B=\12\84\93\BD\FB\B2m\BC\F6\B0\CA\BD\1Ewn\BD\EFz\8E\BDc\E5\7F\BD$D\E0\BD\B3\CB\0B>\1A\E9\D9=x\0B.\BEP\C9D\BErK\9F\BEa\9B\88\BDNJ\89>\95\94>\BE\A5\9A\CB>\94\11\BF<\A4?l=\91}^>`\97\85>A`\88=\BE7\A6;\F3\FA\02\BF\A9l\14\BD\CEH\05>y]\8E>\DA7\04=\E0\0E\BF\BE).N<\B5(\94\BE\17U\87>\BA\F5C\BE\D8;\83=\A1\D4\DF>g\84\C0\BEI\8F\F1\BD\AD\F5\8A>\FA\8F\A0=\B0w\D9\BD\84\95j=\F9\92\CD\BC6V\05\BDS\A2\C9\BD\F7\A5/\BD\D1\10\89=\99\F1\9D<J\90\04>\1B\9E\06\BE\17\07\D0=\EF$\CA>\ED\16a\BEOC\A9\BE\A3\D8\84\BE\14\E0\D2\BC\8F/@\BEi\9A$=\A9\84\04?\81C\04\BDw\95\07=\F9\CF\87\BDy6\BD>\82\EF\B0=\01\9D^\BE[\B7\A7\BEtBP>\8A\8F*=\C4\D4\18\BD\1CG\83>\82\A8\85\BE\03V\98>p\BE\07\BE\0E\89\B2>x\D5\CC\BEek\C3\BC%\8D\1C>\F0\82\B3\BE\05\91\CD>&:\B9\BB\9E\FB\82\BE\14\F5\FB\BC9\84\F8\BD\EB\D4\10\BE\B4\14r=p\99\B2\BD@\8F\B9=5\D5\14</\0D\D5;\8C\89\C2;\BC\DC\08\BC\DC\226\BE\90f\E6>\B9\FD\1E\BE\E7\C9W\BEg`\88=u?&>\E6B\85\BDU\E3\B6:\F7F=\BE\F2\FC\E6\BD=\F7\CD\BDX\04\C9=j!M\BE'\1E\B6;3N\BA>\A7o\E6=\B9\\\ED\BE'\9C{='U\BF\BE\7F\D3\04?\FA\E0\03>w\14\F2\BD,X\0E\BE\9F\CET>_M\8B\BE\81.\8A>\A8,c\BE\82\BEp>\13\C3\15\BD\9E\E7\F9=") {addr_space = 0 : i32, alignment = 16 : i64}
  llvm.mlir.global internal constant @constant_5(dense<[-0.0822488219, -0.108868778, -0.141039595, -0.204869166, -0.17913565, -0.215438381, -0.133805066, -0.195724562, -0.268250644, -0.258212209, -0.0761560649, 0.0132841459, -0.00444464432, -0.414740831, -0.17879115, -0.0386558883]> : tensor<16xf32>) {addr_space = 0 : i32, alignment = 16 : i64} : !llvm.array<16 x f32>
  llvm.func @free(!llvm.ptr<i8>)
  llvm.func @malloc(i64) -> !llvm.ptr<i8>
  llvm.mlir.global internal constant @constant_4(dense<[-0.161539719, -0.433835655, 0.091641359, -0.0168522168, -0.0650264397, -0.131737873, 0.0204175506, -0.121110231]> : tensor<8xf32>) {addr_space = 0 : i32, alignment = 16 : i64} : !llvm.array<8 x f32>
  llvm.mlir.global internal constant @constant_3(dense<[[-0.0448560268, 0.00779166119, 0.0681008175, 0.0299937408, -0.126409635, 0.14021875, -0.0552849025, -0.0493838154, 0.0843220502, -0.0545404144]]> : tensor<1x10xf32>) {addr_space = 0 : i32, alignment = 16 : i64} : !llvm.array<1 x array<10 x f32>>
  llvm.mlir.global internal constant @constant_1(dense<"0x16E911BCDD9772BE234202BFF73884BD2037113EC08B17BF9B58F3BE48214ABDC7A9443FE9E4863E6BC8FBBE56CF633D6E6D823F18010E3FD621E2BEAA5D23BE0ABB0E3F4B93173F58E896BE5AF91CBFF8B01D3D9B71673E39CD5FBED052F4BE5A5A95BEAC5B23BDA1D85F3E2759FF3E82EBD83E0CDA463D5E38CFBD14C78DBEB52590BBC2F4063FB38BCE3E40751ABEE744A7BE28CD22BE4ECEB73E17CABE3E425311BFA07CC5BE44DD31BE9F82693E145EAA3ED5F5C2BEB3FC6ABEAFA887BD42906EBCFFDF913E8C07C2BCE606D63D6DDB813E1F3AB93EEBE2303F2E7AAB3EFC80D53E3C08C53E70A8A83EE9D8783E092AF0BE55909BBD5BFE13BE65BA31BE70B17CBEA30179BFB33237BF4FC809BF49E51DBF709BE5BE26C24BBE9FADAABE29BAB2BE678A15BE8A3F82BD253897BE6432AABEE8EEA7BEBD37A2BDF9C463BE431AF4BEFDC557BE94A36BBD2AAB273E9BDC253E4C90C8BE5DA0C0BC0773FC3DA4AB2D3DB285693E729EC13DA67BBE3E0EA7603E6D8137BC3D86393EA2B0A73E86C5B33E311AEE3C5F3E563E7272AE3E0CB05BBE3EF4F9BD50021CBB2B2867BE470825BECC5EB63D35E5513EBC1920BED21167BEADE50FBF88B876BD1A24D23EF85C6DBC5829F3BEF06510BFEAABECBDD781113EB6B08D3E3F7C2E3DB2393DBC0DDD1E3C52057C3E3128203F62EA2E3F79BC713EEB072ABEBDE9AABE78C843BEDD205B3DFCF8103E90423B3E104F0CBF4DB83BBFB29816BF03B9C4BE09500A3F8E37B13E9D2C81BE066DB1BE26FA57BE296F613EAFAE283FFEC4BA3E8E7A043EBE60E0BD85B0763D8F0F9B3E78AC723EB034F03EEFA6643E47A5C83D643A0F3F16945BBEA954EABEE4E858BEEC93BA3E4560F93E56BBD0BE69C0DBBE017C7DBE8C71D43E589B993E0171EABED09A9BBE5960B7BD345D8E3EDD5AEA3D177330BE250FB4BE71AD1BBEF884B23E88413E3E142D913D9365093E3C2A3DBD26EDB4BC482C07BEF8C5BB3D562A6D3EB0F2AD3EC102293E71C2C03EEEB5473EFA5DA13E2230113F57ACF1BD7AAF483E91BC073EFDBF433DD1D9083EF975E83C8E7D0EBEFC59F7BDE4454ABEDE9500BF71BB12BD4B6242BE1AE6DABE88CA91BE19EB42BE"> : tensor<8x1x5x5xf32>) {addr_space = 0 : i32, alignment = 16 : i64} : !llvm.array<8 x array<1 x array<5 x array<5 x f32>>>>
  llvm.mlir.global internal constant @constant_0("\0A\E3F\BD\\e\BA\BD\AF7\D7\BB1|\03\BE\15\07\DF=\CF\86\AC=Hn,\BE\83\EB\8A\BEM\DB\9B\BC\88\D9\8D=\9C\D1\22=\1A\EE@\BC1i\81\BD\07{\1A\BE\FBH\E6\BD?\19\8F=\89\87I:\89\B7\AA=Ed9\BE*\B3\F2\BDE\8E];\81\AA\80>\19CF>\F7S_\BD57\03\BE\DD\1C\D9\BEF\8F\8A\BE\8C\D6\84\BE!\F7\A5=\ED)\B4=\8F\00\1F<<\EFj\BE#\1B\83\BDx\BB\B2<\A5GK\BD\A6\88->\04Dq>\FB5\9F\BC\19F\0A\BEDX/\BD>B\87\BD\02\9B>>U\D79>\F9\\\14\BE\F6\9C\F6<:4\0F\BEo\A9\E8=m#\D7=\B2\18R=\03\B2l=g\C9\1E\BE\DF1\09\BE\EC\82\A1=P\95\EE=r\8D\0A\BE\9B\04\FF\BD\F2\1CT\BE\8D\D0\11\BE\FC\B9{\BD\90\B3\AD\BDu\FBA\BEj\ECa\BE\CB\C3]\BE\18\87\B1\BD\A4\ED\84=\AD\C2\84\BE\8B\DB\D4\BD\09{\AA\BE\9F\E1\09\BE+\9F\01\BDx\B2\E7<\EDk\B7=\08\A7\DE\BD\00\F0?\BE\01.e\BE\D8Q\D3=g\FEB\BD\19\14\D9\BC<\14\B0\BCN\1D\EB<a\07D=\7FQ\CB\BA>\B5\D4=FL\B4\BD\BE\FC`\BD\8C\1B\9D=2g\D8<\03\FB\83\BE\E6\AB\91\BE\22\A1U\BE\AF\90\92<\1E\DD\8A=<\B8\0C\BD\FA\F4\9B\BE\ED\AC\01\BEh\CE*\BC\84z\F0=\10\F7->(W\89\BD\19~a=\FE\083>\04,\86\BDmQ\0E\BE\CD\02\9E\BE\F7\05\D6\BD\0Ay\BD=\22\94\99>\D6fz=\8FCe\BE\D9\F7^\BE<\97\B1\BD\83x\0D=\A0\82\F9=\D9\DC\12\BE\B3\BA\10\BE`\B5\D8\BEc\03\11\BD\BD\CAY=h'\C6<\96\A7\83\BC\1E\99\F6\BDU\81&\BE\9F\22\C6\BD_\06\12=\BD\92]<\CCN\13>_|\A1<o\A2\AC\BE\FF\82d\BE1\EB%\BE\98\7F+>\DFp\E7>\F8\1F\89>\BE\AD\FF\BD\19~_\BE\CD\BD\18\BE\E2\BB\9B\BDP\D7\83>\C3\B0\D2=\7FO\85=\92\82\D7\BEit\9F\BE\CF\84\13\BD\07\AB?=I\85\EA=9\0FZ\BDVm\0B\BE\FD]\88\BEZ.Z\BE\EF\BF\FD\BC\DB\9A^=\CF\9E.\BE/[\94\BE\9F\A7)\BD5\8F|\BE\0D_\CB=R\EEG>\18\0D\C9\BD\92}\8A\BE\17]\19\BE\BAA\AF\BD/\95\01;\88\88]=zz?=\C1\F1$\BE\DA\B4\BE<Y\91\85=\8B\D4{>A`x=p:R<K\F9\C1\BD)\B4\D8\BD\C9\D8j>\EF4Q>\D3\1B\B8\BD){}\BE\95\BB\13>O\D2T=\19@\C4\BC_\CD\CC=\88\F8i\BD\BEX\9B\BDRLk\BD<\90Q=\F4R\B1=\E4\14\7F=\1C5\1E\BE\9B\E3\0F\BEt\9E\A5<\1Ai\E2<$#\D0\BD\80^\EB<\D4\14\03\BE\94rh\BEo\9D\89\BENp\08>\FF\E2\9F=\FB\D4\FC\BD\19\E3\14\BE\12\0E1\BE\CCi\99=B\E0[>\C4\DA\98\BC\1AX>\BCS\8D!\BE\D4\F2 \BD\10\F6j\BC\A8!\0F\BD\08\D0\0C>\02\E5\80>C'3=\86\0B\C9\BE\E0\8D\9F\BDe\93\19>G!S>lP\10\BE\8C\C7E\BE\83\9A1\BDs\C8\B8=GH^>\0F\09\AC\BD\DF\14O\BE\9E\B9\06\BE\83\8A\CC\BD.G\E1\BA\F1'\BC\BE\86\C7\9E\BEc/\D3\BE\F5\AF\04\BD\BA\BF\13\BE\DDo\AA\BD\9F\EE\84\BD\B8\22\88\BE_\E8q\BDU\8B\D1\BD8\ED\14=\B7j\0C>\C2\87\19\BDB\22\BF\BD\BE\15\E2;\97\DA\A5<\88nk>\D4\BF\13\BC\D3H/\BE(\BC8\BE\12\CC\BD<<\BC\1D\BED\18V\BC\CE\FD\07\BD\CF\84\AE\BD\AC?c\BEx\17\81\BE\C1(=\BE\E3Kf\BD\E7\99\C3=\CEX\D4\BD3\DB-\BE\9B#!\BE=\D9\EE:?F\C8;\F2\93\C4\BB\D1\0EV>m\DD\82=\14\\)>H\A2\8D>f}k\BDe6\B2=\93F\17>=\BA\0B>#H\1C\BC\CB\E2\02>\D9\CF\90\BC\E2\87\9F\BDW\FA\05\BD\ACD\1B\BE\92\AF\0B>\19F\F6<\98b\92\BDw#!\BE>\8F\A3\BD\9A#\C7<\D6\9B\D7;\1F\00\0E\BE7P\E8=\17$s>$Y\89\BD\B4P\02\BE\12y\C6\BC\BB\E4^>\B3Jv>\B6\AEi\BE\09t\0C\BC#\E3H\BE\C7\E4\B6\BD9\B76\BE\99\E8K\BEur\9E\BE\86\B3\E2\BD\C6j\F4\BD\05\C4*=+\1A<<\E5\87\B9\BD\85\\%\BE\86~%\BEy\C1\BF\BD\D5D\CF=\E8\18l>#\10\AB>\AC\89\22\BEiF\E5\BC\D5\EE\1B>\BB\D4\07=\0E\F7P>xY\DC=\9C8\02>\84\8A\D8<N\F9=\BE9\\\\\BE\87\12\1B\BE)\08G\BEA<\D0\BD*\DA\88\BD\DB\F39\BE\DD\DFf\BE\AB\DE~\BDpeW\BE9q\B2\BDz\D8\06\BE\CA\F0\F3\BD_+\19\BE\FE\AD\CC=\D0\D4\F4=\\\ECi>\BB.\EA\BC\FF$5=@L!>l-\BC=\00\E7h>\AB\A5\B2\BC\F7ID>:\EB\96=\95fH=\DC\99 \BD\91\BA@\BD\00ij\BEU\08\14\BD\AB\AE)=L\F9\9E\BD\E7\B1\85\BE|\C7\BA\BD\B9\131\BE;\10t\BE\D5\AE\D5=`u\FF\BC)\EC\82\BB\86UL\BD\FF\BA\0B>\E0s^>V}M\BD\D1\F0+\BDM\EB\81\BD\8F!\8D\BD\D1\EF\0B<\05ty>/:\0D>\EB\BD6\BC\0B\\\12\BE\CB`\E4=\CF\C7\95=$\CA\B3\BD}-I=\1B\8D?\BD\F1\09@\BE\FCc*\BE\E3\10P\BD\E2\94\AD\BD\8D\C2\DB<*#\B1\BD\8C\F4>\BEh7\F1;o\A7\0B\BE\1F\EAv\BE\BD\13\8D\BE\8C\1C\D9\BD\A9)W\BA=\8D\9E\BD\A7\9D\E6=\DA\E7\C8=\87F\22\BD\22!\03>\DE>\B3=\97t\8A>z\8CO>d\80T>\F4\04#=\DC\DC\18\BE\04\A8\BF\BDs\E1\DC\BDhbG\BEm\A6\8A\BEPp \BE\D2\15\DA\BCL\B8\C6=\96Z\0E\BCaRw\BC\D2\F27\BE\1C\0Fp\BDl\03\A2\BD\88\F9a\BE\85Y\DC=\83D\02\BFt\AC\9E\BEs\D6\11\BE\D8\07d<bH\08\BD\84\90z\BD\FBri\BE3\F5,\BEGe\F0\BD7Z\BA\BD\F0\06\85=\ACFq\BE\CC6\89\BC\AC`\EF<g\B5V>,s/\BE\22\B4\A0>\A7hc>\D5\19s\BE\08\DE.\BE\8C:_\BE\E0AK>\0B\FB,>N-|=\15[/\BD\C0i\89\BE\92\CC\87=\A1u\95>\D2\CC\19=\9BY+>c\CF\A5\BEW\8A\84\BEZ\B7\94\BD\9E\13H\BEv\1B\91=\91g\9D<Hu\95\BD\8Ama\BD\90K\D8\BCF\80@\BE*@\BE=\9E\D6A\BC\E9\AC<\BE=\E8\F8\BC\8C\04\A6\BD\D4K\F2=\B9\13\0B=\F5;\1B\BEe9\FF\BD\10A\B8>\95\92\9B>\E7\9C#>\96y\F0=\8B\032>)t^>F\B5\C9\BC\90}T\BD\D0\AB\A4\BCP\FF\D9=\FAv\EC\BD\0E\F0\D1=.\16\82\BD=\9B\EE\BD\0D\BC\08\BE\07\EB\94\BDX\1C\A0=\AB\05\A1<.|\D9=\C0T\A9=\0B\13\1E>\9B\11\97\BE\9D\BAD\BEP\AE\95\BD\1F\C5C=\17\ADN>G\D2b\BENU\92\BER\C9\C9\BE}1\04\BE+Y\8C\BD+.\82>\D3\8F\C7=U\96o\BD\DA\9F\0C\BE\E9\83\81\BE\EA\DA\87>\DB\E59=\EA\F8~=#\DD7>\10w3>6N\B5=\C0X\BD<\C8\BD\9D\BD\F9\EE\9F=\CF\B9>\BD\00\8C\AC\BDZW\84\BDO\88\00\BE\F6\22\AC\BD@\B8h<|\0E\11=\E4\97(\BE\DA\80z\BE;#\BD\BE\C7\D58\BE\F3\BB\0E>\85\C1\D2==\BF\CC\BD|\17\1F\BE\BF\8E\CD\BE\B1\14\A4=gP\EE=\DE\FCG=\0C\E2S>\90~\D6=s\0F\98\BB\81*w;(ZA\BEBw\BB=\82\A3\B5\BD\09>>\BD\A4\9D%\BE\D2N\1D\BD\AA3G\BD\13\88T\BDt\FC\86=\0F\CC\B3<|\A3\02\BE4IF\BE\ADH\8A\BE^L\C1=\AA\C3h>\D8L\C3=\0B\CD&\BD!\A3s\BE?k\0F\BEi:$=\F8\F1[>\E8/\8E=.\FC\9B>\DFk\8A\BD\96#w\BDDjc\BC\94\A7d>c\A9\F6=\CD\03\80\BD\CA1\9F\BD\8B\D1\8F;\BDB\87\BD\02\08\9A\BE\1A\10\0E\BE\1C6b\BE_2%\BErY\8B\BE\D1d\91\BE\B9\CE\\\BE=\0A\97\BD\CE\A6H\BE\00\E5\8B\BE1h\86\BEV\C4>\BE\BE\DBf>$\84\AD<J\ECT:\1EE7<\8C\CE\86=S\F9\09\BD\14vS\BE\14\8BR\BE\04qT\BEBv\A2\BC\C8\E0N=\0E\8A\9A;\AA\14N\BD\BE\E2q>\A0\F3\83\BD\03\03[=b\BE\89>\E5\F6\B0>\F9dQ>m\BD\D4\BE!\0D|\BE\0B\FF\D5\BD\14\877\BD\C2\A0\DC<\B6P\B2=w\CCe\BE\06~j\BE\9DC\D5;\08\17\94\BC\F58\AC>!;S=\B3\A3\D1\BD\8C\D6l\BD\FE\19$\BE\93\E8\1E\BC\90?V\BE\BC\EC\B2=\ACC\CA\BDS\CF\0B\BE\E5IP\BD\1AO#\BEaf\A6=(\F2o=\1A\AFg\BD$\B2=\BC\0E\BC\00\BE\17]\1D>\A7\EC\10\BD\EC\80\A7\BC\83\A9)\BE\C5s\A9\BE\9B\98e\BE)\0E\95<\9Fci\BE\BC\01\8E=\98\8C\FF=\CBZ\FE=\AC\9EM\BDU\1D\BE:h\C0\C7=\CB\E1\85>g\F6-=\1C\ED\BB\BD56\88>@TE<1\07\82=\F9]\95>k\D8V\BE(\DB\A5\BD\F3\18\1B\BE\D4\BB\8A<\89\07\D7<\1DP\93\BE\05^\1F\BE\F0R\ED\BD>\EC)\BE\D1\15G\BD/P\BB\BD\E9Q\AF\BE\80\EE\A8\BD\C3\E9\15\BE\99\BF|=\A8\92\83\BD\AB\B1\D7=)\84\05=\AEv$\BD\DAj+\BD\C0\ED\15\BE\BDw>=\BC0D\BE&\12\C7\BD\99>\DB\BC\BF\B6\0E\BC\84\D8;\BE\DA\10\05=\87\DA`=5ug=rS\B9=\87*\95\BD\B6\FF&=\F8\07\91<\C1\C5\BD<\18\EC\AE=h\10\96=MO\97=\B5\87I>\EF\11\08>\98\1C\A6\BDq\83\BC\BD\1C\8D\AD\BC\82\08\85=)`\88<n\B8L\BE\A0\B6\C8\BE\C1\A3Z=\\\E1\17>\AF\80\82\BC\D2\C7?\BD6-@\BE2\D8\1E\BD'\C4\C4\BDi4w\BE\DE\FD\E1\BD\0E\A3\FF\BD\1B\D7F\BE\D83X\BE\B8\01\B7\BD\1D\B9\E5\BD\EF\83J\BE\E3\B5\E9\BDc\1At\BD\85-\CA=R\B0G\BB\D6?\C2=\9Ff\8D\BE\84p\8D\BE\9D\F1\DB=\AB\E9*>\0B\08\1F\BE\9A\C8\CD\BDi\15g\BD\B1u-\BE\00\85\E2=\D0\C3\03\BE\1C\1Ei\BE|<\C5\BDx\BD\D0\BD\D1\F4\D1\BD+o\BA\BD\A6P\CA\BD\C5\A8\01\BE\F7\A7\8F\BD\CF\87\09\BD\91\DAP\BE\AD\A5\0E\BEo*f\BE\C4 \AB\BDrt\C3<{\BAgt;\F8\A8!\BE\B8\13r\BEh\13?\BE\C7\DE\A9=\C4\E1\FC;\07wB\BE\B2\DC\16\BD8\92\11\BE\AA\EB;\BD\A0C\17=\C9\DF\90\BE\\})\BE~\F6=\BET\91k\BE\AB\8E6\BD\C7)T\BE\19\1E\7F\BD\CB\C4\D9\BC\A3\F6\B9\BD\B3\EC\90\BC\04\E9Z\BE\81\07.\BE6\EAN\BD\86tgt;cz\D6\BD\9D\BC<\BEYn\A7\BD\96\9F\C5<\D9\E9\A1>\1D\EC\A8\BCm\CB\17\BDW<\82\BC\A7\DC\8E=\81\E9\D0>F\D1D>\C5\BA\1B\BE\B2\F8\A4\BD\05~B>\AB\DB\82>\D9\A8\B9;\869\82\BD \A0\C0\BC\A2\BD\E9<\DF&\DD\BD\03\8A\A0\BD\B9\E7\E2;Tv\F5\BCL\80P>\0A\01\D3=\E7_{=<\EB\D8\BD\CE\14\9D=-\E9\88:7\D2D>9Ro=\9E-V\BE\AC\C9\E2\BDHN\1B>X\1C\18\BD\C2\E7]\BDK\83f\BD:;->\90\081>\E1-\93\BD\0A\8C\1E\BErE\C7=\E9\AD\B0\BD\1A\A4\1A=E\B6\F8\BD\97\A34\BE\CF^\19\BD\D1+\F8\BD\0BM\85\BD\BB\EF=\BC\DCr>\BE]\C53>\86\88i>Im\E6=\06\03\AB=l\D0\F6\BD\D5\F3/>\DE\A3Z>\02?`=\CFU\83>\F9\E58\BD\A2 \9D\BD|\03\F1\BC%\08\C3>\8A>\F0=\9A\BB\81<\13\947\BEK\22\90\BCy\0E\D7=\E9P\E7;\B0Ju\BD\A5\9B\92\BBR\CB\0F\BE\B5\CB\88\BD\BB/G\BEdOD\BD\11\B9f<V\8CY\BD\1F\94\C7=_\BA:>\CAu\8B>6\D5\17>\CB/\DF\BD\D8\1F\C9\BB`?n<\07\15\EF<\00\AC-\BD\9E3\15\BE\9B\BC\87\BE\02sO\BE\C2em\BE\22\0ED>\06\B9\08>#\B3\1B\BE\86\9Ca\BE\E2R\96\BE\84\D9\93\BD\E7nV\BDCP\90=n\1A+>9\EF&>v\B69\BD\AFV)\BE<5!\BE;\9B\B0\BD\D7\96\0F\BCy\C1\85\BDM\D7\EF\BDv\03\94\BE;\C3\11\BE\A7;\8F\BD\B4N\96\BD\CE\99@=e\C4\90=\91\C0><\A5\8B\C8:\C0/\89>\93[\D4>\BB\EC\A9>\1DvY=\EF\E9\BA\BD\88}\BA\BDq\EB\A4\BDV\D1\9E\BD\9E\D5\1B\BE*8\8E\BD\FA\8D#\BE\17\1B\90<^k\89<\B8\83\D5\BD\CBj\1A\BE\00\AD\0A\BE\D8\14a\BC\0E+\DF\BC\DA\F7\F8=\C8\FEJ\BE\F0[\D5\BC\86\05\D2<\FD\CDq\BD\A0\FFf;\D2N\C1\BDZ\D5\05\BE\84\A4q\BE\A7\E0\DC\BD\C3\0D\89\BE\09G\8F\BD\F9[\DE<\06\1E\96>\8B x>\06g\E8=\9F\C6\C2=|O\94\BB\CB\80\8D=3<\F2<\18\F5\06\BDdY\AB\BD\D6\16 \BDK \14=f?v\BDP\FD\AF=A~\8D\BD\AF\C0\1A=\16\AB\E7=\D1,\95\BB\00\9DT\BD\01\11\87\BD\AE\D7\1D\BDd\0A\92\BC\9B\CD]\BEH\8A\87\BEu\CFo\BE\E1a\0D\BD\E7x\C8=kM;>\E9\18gt;B3{>\80B3=\F6\17J>2\D9\96=G\95e>\93\DCu\BD@\DB\8B\BC\C1?\C6\BD\09\9C\C3\BD(\11\C5;6\9D\00\BE\EB9\C6=\CAhgt;3\82\C2\BD\FE\A7\87\BE/\E3P\BE\BBua<\1EF\1C=\F1\E2\BF\BD*\07!\BE\CA0\92\BD\CE?\DB\BD\DC\E7\08\BD\07\1F\18=\F8\DD\B8\BDH\90\AC\BDq\DE\00\BE\CA\C6\1A\BE\1An\E4;\AFeU=\DA\D6\AA<\10>\E6=\E3R\D4\BD`,\19=\D3N\87=\8A\C0\DE<\1C1b<\05,\E3\BD\C2\FDl\BE-\C2;=\E3\88\A8=\FB\DAf\BE\DB\00\D2\BD\99#\DF\BD\02f\C8\BD\AA\82\FB\BC\A5\A5A>\22\DE5=\C1\8B\9A\BCO\88\0A\BE3@/\BE|\049>UV\DD='\CE\82\BC\00`\0B\BEh\1D_\BEu\DA\F2\BDU\1F\B8\BDH\14\03\BE\1F\D1u\BD3\A4\BE\BD\BB\D4(\BE\AC\7F\8D\BDT\FDf=O\80\A8=\BA\E7\01\BE\EA\FC\9D=\A7:\A7>\1B\09#>\9D\AA%\BD\C0\E2\00\BE\BD9\86>\BF\F4\A3>'s\EF=\03\BE\97>\8C\D4\D2>E\D3\82\BDi>\C5=N\C2\D0\BD\8F\10\94\BD \AF\91<\0E\FB\F9\BD\AA\F5\8C=\C7\FB\A4\BE\8A\11\E5\BEOCY\BE\A0\813\BD7\81R\BEd1N\BE\C8\C5g\BEZj\A6\BE\90\D7=\BD\06\FA\1C\BE@\E05\BE\F0K\B6\BD\03\FF\A6\BE\D6\EE\D8=\E2\1A\96>\C7\D3\BC=D\02\DC\BDO5\EF\BDp\1C\E5=T}gt;2\ABC>\03\D3\8A\BC\92\12\BA\BD\B6\06\0E<\85F\B4\BD+jb>\D4\D7\A2>\F0\F3\0D\BET\AFw=\97\9Clt;\92jf=\F9\03e>\AD\9F'=\BAI\84\BB\1B\E3I:\06z\8F>\12s\F4<\97L\0B\BD\B1oR\BE\BB1]\BE|\CE\D2\BEw>J\BEL\96]\BE\03\0B\06\BE%\F4c\BENn\81\BEeS\89\BD\EE\EF\03\BE:\C8\E5<F\10\89=\0C\B6\A9\BCz~\AF\BDN!*>\16\00\0B>\C2\1EU=\0D\BF\1A\BE\C5\CE3\BE\0B!Q>8\C7c\BD\B4\E4\1E\BE\B5Q\81\BE\90\B66=\D6P)>\83\96\9F>\13\84:<\A5Av=\A4t\1B\BEN\02\E0<\FC.=\BDSv\CB\BD=3\B9=\15\B5\FA\BD5\DDf\BDKF\CA\BDWy\E6\BC\97\CC\C6\BDS\91\EB\BB\0868\BE\C5\1C\83\BDN\87\DE\BCT\B5\8A\BE?z8\BE\92\17\BE\BEN\F5{<\8F\03a\BE\BA\BF\93\BCxe\1D\BE^\81*\BE[\BF\03\BE\F2\8D\8A\BE\04\0F(\BD_d\22>\F2c\E5=k\F4\A4=4\82I\BE\B0\FF\B5\BE\AE\C1\0B>Q^_>\B0U\F7<\B1\93:\BCT\F1h\BEv;\81\BCHB->\E7a\1D>\8D\E5\80=\1A4 \BE\92\17P<e\9D\0F=\B7y\D3\BCC\BA\C5\BC\BC\9B9\BC\AC\F4%=^\AB\FF;.\D4\D9=\E5\E2*\BE\13\DD\AF\BEm\C5\A2\BD\08&\88\BD/k\C1\BB\10#*\BE^\E0\BE\BE\BF\84_\BEN\07\FA=\05\AB\92=\A0\FF\EE\BDvh\85\BE\F2E\E4\BD\9C\E2\AB>8\05\C3=\DE8\BE=\0Fo\B2\BA\87\C9<=\CEr\DE=&\CF\8C\BD\D1\11\92=h\C3\1F=\94z\83\BCA\B6 \BD\01\98\1E\BE)\A4\FF=\B7\9AV>\CEC\09\BC\B29\85<c\F4\07>\22\1F\89=\9B\1A\12\BE\CA\10E=\15\DD\22>\DFW+>Y \F1\BD\07u\10\BE\87t\8D\BD\CC\82\FC=\8Fz\CD\BD\08P\07\BDw\1C\92\BDVIQ\BD-_\\\BEK}!\BEc\C8\EF=;\B7)9\A9\DB\16>\ED\9El\BC\1B\C7\9D=\17\02\06\BC#\D5\C2\BD\85\EC\AB\BC\E2\FB\FC=+\\\05>\80V\9E=\DC;\B6=]\AA\\=\02\9DJ=\1C;S\BD\A0\AB$=\0E\98v=<\1E\A4=`\BFL>q\FC<>\0C\A3\81\BDSqx\BC\E0\B7\CA=y\1CO>\B2\EA\C2\BDB\01$\BE\B1,l\BE\A9z\8B\BD\B3\D6\9B\BD\16\D9\9B=\DE\F82=\E3rv\BD\88)]\BE\88\1A\1D\BE\AB5K=7\CEa<4\D0\0D\BE\CDl\00>H`\BB=\BDx\AD\BD8s\99\BDx\8F\BE<\14\E4\92>\F7}\94>\DA\D5\C9\BD# \CB\BDMKE>\C7~|\BC\A5\E7\8C=\F1?6\BE\FBQe<\9E\FC\18\BC\C0\DA\CE\BEe\1C\BA\BE3\02\C9<R\A6\EF\BD\AC\90I\BEn\9Ex\BE\97\01\97\BEA\85\C3\BDr\FD\98\BE\FB.V\BE\D20\84\BD\91\89\BF\BD5\C4\05\BE\93\18\9E\BD\1F\1C~\BC\1Eb\08\BET\F5\CD=\86\A3<\BE\83:\EF=;8\0E>/)\06\BEdy\AA<\EE\8AC<\AC\C3\88<\D2|\FC\BDX\871\BE%\D4\DA=\CC=S\BE\D9A'\BBGM\A4\BD\7Fe\82\BCc@_>\F7\A8J\BEC`+\BE\C6#\83\BD\045\02\BE5\\\07>\D26\19\BEO\E7\D8\BD\C2E\86\BD\CB\C5\C4=\FAB\E1>\8Er\EC\BD\D5\F0C\BE\CA{)\BER,\05\BE\81\C3r\BD(#R\BE'\D2\99\BE9\E0\0F\BE~\DFR<\F6\9A%>\A1eg=\E6P]\BE<\1F\12\BE\CBOF\BD\03\15\85=[w\CB\BC}\97V\BE\C1\F8\07\BEu9U>\EC\A9\98>|\AB\CA\BEol\A1:3|gt;\FC\CB\18>x\120\BEv\8Ee\BE\C5\B0\FA\BD\8E\F6\FB<\22\FB\AE\BD\8F\E8u\BEq-T\BE\16=\E7\BD\16M\9F\BD(\84\FB\BE|z\85\BE\E8v\C0=\AFHw\BD(\130\BE\06<\C2\BD\CDRq>@\F0\F4<\E2\F5\08\BEz-\EF\BD s\82=A\8DF>\E9F\95<\8Ej\E6\BD\FDo\B8\BD\86\C0t\BBj\0C*\BDp\BC\E2<\A9P\89\BD\F4U\DD\BD\0A\16\95=\B7\DD\C49\EC\BE\0C>UB\A3\BD\94\B5M=\FB\B4\98\BD\A2\A0\14=\98\C5\89=\F0\BC\A0<\DA\B2\E6\BBb\1D!\BB\EE\18\16>\9D\96\B8\BD\FE\F1\8C\BCZ\DEB\BB\E6\95&=\BBv\08>\04@E\BE\E5\C0\1D=e\9A\9B=\A7\7F\1F\BD\B3\8BP>\BB\96_\BD\E2\FB\07\BEd\DC.\BE\F7&\AA=T>\13=_\1E\07>\E0\EFg=\01|\17\BE\D1\A7R\BD[\12\CC<6\81\C2=\1E\A4\B3=\81\EF<\BE\94\A8\A7\BEnw0\BEY\B8\7F>\FF\FA\E3=\96b\FA\BD\18\82\88\BE\A4\CDc\BD\C5F\AD>R\000\BC?\CA\0A\BE9/\BF\BC\03e\22\BE\97\1A\08>\BE\97*\BE^\16\16=\B1\01\BA>\D9O\AD\BB\EE\FE\B6\BD\8A\DB+\BE\06\B8\D4>\0A\10\AC=1\E8\B3\BB\8F\E80\BE\AC\F65\BE\EA4\82\BEIrD\BE\AD\12\\\BE\A5\CD\F8<\89'\9D\BE\91\05\17\BE\F5\15'\BE\EB\A5\B9\BC\C8\B9\22\BE\AF\A2\B0\BEH\CA\87<N\CC\82>h\D1\D6>`\025\BE\0B\DD&\BEr\0E\19>q\BCN=?\C2-==\16\A7\BE\A7<\A2\BC\B7\CD\B0=h\D48<\D6\C41\BD\CB\A0\D5<\F4\E5\BC=*\D0\0A\BC8\94\BB\BC\B0\06\E0\BD\CC\8EC=\A3\CB\B0=\A5!\B2\BD\A9\F4\D3\BD\ED\D2r\BEs%y<\80\D6\9B>\E1\ED\07=\22\C4+\BE \F3\DC=qS\12>\11!\22>\91\13\D0\BD\CD\1Eg>\9FV\9C=RP\11=\16b\13\BC\88\C6z>#\862=\19\E3\07>Tn\EE\BD\F6Z@=\BD\A4\00\BE\0C\96\05\BE\E1\99\84>\99\C2\15>\AC\DEd<\ED-9\BE`:\FB\BDj\E4]>E\90\05>\A0\E6}\BE\C6\D3\9E\BD\1C\AF\D8=\91\D1\B0>o\F5\1B>\B3\B68\BE\D5:\9C=\97\CB%\BD\EB\94\A1>nJq\BE[F\CA\BD;-\AA\BC%\C0\03>\FFn\FF;H\0Fd\BD\1B\AD&\BDMG\94<\DD\B3\9B=\B6\F0\17\BD\8DjF\BE\9F@\8C\BE)8p=q\A0\A2;\C0\0D\C7\BD\D0dI\BE\82\A9\9D\BD\18\E7b=3\0E\15\BD\B1A\83\BE\87$\12>Y\D2\8B=%\C0\0C\BDK\F8\\\BE\15FM\BEc{2>\03\82!\BC\BC?1\BE\F2\F6\81<\97\8D\0E\BD\D7\18\96=\92\CC\17>\00\07g>\EA*\C0=\C5\B9\CB<J\94\D6<\D6n@=\AE\C14<hl\E8\BDe:\05>L\01\F2<\E6]\A7=\D5}4\BE\9B\DB\82\BE}\12\CD=N&\E7\BD]5i\BE\13Y\83\BE\0D\04J>\01\1E\98>\8F{\0A\BE\C5[.\BE\96[=\BE\9F\A7r=\CCt\A9=\82n\FA\BD\B9\0B\F0=\B0\0Ez>\BD\D7\AD>{\B8$\BC\E6\ABR\BE\03\0D\E1\BD\16\02\83\BCF\BE\B0\BD9\18`\BE:\E6\9C\BA\A3t\C6\BD\08v\92\BE\D7F\81\BEu\12\97\BE\C6\8EK\BE\A3\1B}\BE\B2\ED\84\BE\AA\03\D9\BD\EDq\1B\BE\EE\D8\07\BEl\FD\B1\BEf\D8\B4\BE\84\B0\DC\BCR\069\BD>\FB\09>\B5.\86=\ACH\F0=\FA\94<>\9FnQ>\D4T\1F\BEWd\0D\BE\C2\A8=\BD\9D\8B\82=\97=J=7)9\BE\E9\0Ex\BDC\90j\BE[\88\E3\BDKm\8A\BE\94\89\AA\BD\D8\D46\BE\A6\DB\8C\BE\83\EB1\BEA\B3k\BDT\E2\82\BE\CC\\\B0\BE\03\08\AA\BEv\97\07\BECY\1A\BE\9E\D7;\BD\E3\978\BE\9D&\A0\BC\F1\0D\BE=\80r\9E<\A2\E6W\BE0E\BB<EM\09\BD\18=\0F\BE\F5y\8E\BDz\833\BES\16\04>\05\EB\C2=\D2N-\BB1\8E\0E\BE,S\C7\BD\F5\C4\18>=\C3\9F=-b\82\BD0\CA\00\BD\03=M\BE\A2\FB~=M|\1D\BE\E9U\0F>\B4\8E\12=\09\18\91\BE\8C\D7\A0=cd\06=\AA\DB\99<A\95\FC\BD\0F(\98\BD-\A6*>\DB\A35>m\13\1A>QV7\BE\A90\96=\ADs\11>h{#\BC%\B6Z\BE\1E\99H\BD\08\A9A>5z\03\BA\E3\ACx\BE\BF!\15\BE/\\\08\BD\DE\AE\D8=6\85\A1\BE\91\A3\1A\BE\10\01S;\C8\A5\17>\BD\82e\BE\1E\8D\81\BD\9B\B9Y\BExK.=\92\E4\BA=\15B,\BEP\EA\E7\BB\BB\E7\99\BE\D3]r\BE^[A\BEo\13}\BD\80}\85=an\9F\BE\9F3+\BEcre\BE+\89\C0\BDck\C1\BDG\FCS>?\\\08?\F1\CD\D2=\B5\22\0E\BC\A7\E0c>}Y\C5>\0C\7F\81=\A9\F5?=nOu\BE:\A3\18>\88\86\84=z\84=>\13\A4\B3=\CB\02\8D\BC(\BE\D9\BD\C3N\15>p\F5\93>l\F9\DF=$\A2\DE\BC\BC*\AC\BC\F9q\88\BD\80\EAn>9\FC\1A>\02\E4@\BET\8C\8E\BC\B4\EB\D8=\F7C\8A\BEg4\A5\BDk4\D8=:\9C6\BD\B2\81\85\BE\1D\CE:\BE\D7\C1\DF=\BC\8C%\BE\90d5=\A5s\CF= !\C4=\84#K\BC1\FC\E2\BD{Mz\BD\B8\8E\9B<\F4\84\C4\BD=t\BE\BE\BE\18\F7=\\_!>\AB\98>>\09\D7S\BE_\9BL\BE\8C{O>\05\1D\DB=\90\E3\14\BE:;\8A\BE\90\9D;\BE\08\B2\9B\BD\BD\88\D3\BD\BC\C5\99\BEX\A2y\BEa\87\1D\BE\F9\B1\\\BEW\96\1E<\18\B3C=\AC\D1\1C\BC%\F6\17\BE\A0\9D2\BE\DE\C6Q\BD\BE\F5\EA<\D0\0F\1B\BC\EE\FB3\BE\9AC\B8\BDm\B2\CB\BD\BD\98\A4\BC\02*\83\BD\A8\C6]\BB\B1\10C\BEH\03\F1;\C7\03U=\A1t@>\99\A3\C0>\0C.\06>\B9#l>r\91\8C>j\10D>\A9\F1\9C\BD\FE\FE\A8\BC\82\E9\D2=\E1w\DB\BB\9A{\DE\BC\CC\0C\93>\8A\0F\16\BD\9D\03f>+\C2:>\E8\B8#\BE\8B\19\86=\ECB\D6\BD\16\84>\BEO\8B\95\BD\A9Z/\BD\A4\A0\AB=\05\AE\A5\BE\B9\82\C5=\B1\8A\05\BE`\EF.=\A7\CC\10\BE\CC\AB`\BD\C0\F1\88\BD\8B\A22\BD\0Alt;\BC\B0\BC\E0\BD\E4\96\A7\BC\E1\FF\9C\BA`\11\CA\BCQ\02\99\BD\C6\AC\A0>\18\C5\D2\BCw\1B1>\89#->\892_=\7FJo>\8A\84R=\1A=\A7\BD\D7\8C\A1\BB\8C\CB\D5\BD\06o\BA\BD;\84\05\BE\223\CA<\11\13\BE=\B2\9D\B7\BD}\8B^\BE\C9\B5\F2\BD%9\AB=\E3\04\14\BE\0Ej\99\BE\07pq\BD\01\1CT>9\0E\01\BCjR\1E>\8C\11\09<\\\1D\90=\ADs\DB\BD&\9CG\BD<_\85\BC\0F1\EB=T\F5@=\0B\B4\B2\BD\BB\15}\BE\E7\05\A1\BEs\E9Y\BEY\D3\88\BC\04\C4\D5\BEa\02\AA\BE\00\0D\F2\BE\92\00\E1\BEh\9C\94\BE\F2(\B0\BE\B8=\BC\BE\C9e\A5\BEE]\D2\BD%\0B\F1=\F64K\BE\97j\B9\BD\88\22i\BC\EA\90\A6\BD\DDc\11\BD\EF%\C3\BDKqf\BD\00*\B1=%\08\10\BEI!\D4\BD\D1_\1B>>\18&>`7\D3\BD\A03\B0\BD\E9\05K\BE\D3M\CA\BC\05\F3\86\BD\E55M=s\0C\D3=\D27\1F>\B8;C\BE\1F\D2\D3\BD\FC\A1\16>\9C\FA\CA=\F5Q\D5<\22@t\BE\7Fr\B4\BC\F7o\8E\BE\8AW\1A\BE\89o'>\D5\04\B9=&\18a=y\99Y\BE\1A\CC3=\8Dl_>[\DF\0F>`\15@;*Y\D8\BD\BCK\04>\F2\804<\12\EBu>0%\AA\BEqc\B8\BDQ\B1\15\BE\1E0_\BE\AB\8D\96<\A2\8A\CC\BD\83\96\BB\BE\ED\A8\D5\BEHT\EE\BD\90B\AB\BC^N\F3=\ED\B43>\A6B =\C1\1C9\BE\0B\BC\C6;a8\81\BD\8F\8C\F2=\B6r\D3>\1Fp\DF\BD>\DB\D2=\0C\EF!\BE\BCi\11>\13\9A\98>9\B2\B8<\A5\0F\1C\BE\E6\F2\A0\BB\99C\05>\D5\DF\E6>\E8\F7\93=\A9\7F\05\BE=\81\09\BEZkc;\A9CT>m\F6\15<\E0\13\D0=\08\94\91\BC\A6\85\D2\BD\B5S\87\BD\8BT\B1\BD\85\F9\F9=\F9\92E>\13\17\D4\BC\F9\D0\96\BCI\B74\BE\A1\1B\AC\BD\A8T\F1\BC#<G\BE\11\22\FD\BDM\C8\B9\BE\EF\CF\EA\BD\A3[\D1\BD\19\09\BE\BD\8F+\19>\00:\1C\BE#Vh\BE\F7%\16\BE\F1\1D\19\BE]z\CC=\F0|\95<\07\99p>\D46\DD=\8Cv\0C\BD\AEtU\BDW\92\8D\BD\00\FD\0A>\87\AB(>\82vF\BEH\A3\F1=~\DD\B3\BD\C9~?=\EEq\1E\BE\DD\9B\F7\BD~\EA\A1<\D4\9C(\BEi \03=\B4\8A\92\BE\A4\09\83\BEb\CF\A6<V\0F\EB\BD{\D2S\BD5IU\BE\CE\D3L\BD\8F7\89\BD0;\86\BE\BB\93$=e\0F7\BE\BA\03\C4\BD\81\E9\C6\BD7\CA\84\BD.\01P=\B0\9C\A5=\AD\A1\10\BEz>\17\BE\0A=\D9=G\EB\ED\BD\AF\C3\C2\BD\8E\86\8A\BE\A8\D0\EF\BC}&0>Y\F3\B6\BD\E7\F3\EE\BD\DEq\16\BEj\17}\BC\BA\DA\BE>\A3K\D9\BD\1C\BE\95\BD\B2\CD]\BC\05G\C3<^\8F\0E>Ca\B6=;{W\BB\E3\99\9E\BEI\B7N\BE\E2V\01\BEsf\EA=Q\8C\F2<\FC5Z\BDf\0C\8E\BE\A5mH\BD\F9%\B4\BD\1C\9F\D7\BD\DB\DF\95\BD\81\A5V\BE\C0\A2\19\BEI\CD?<\A12\07\BE\A9\BB\0F\BE\DF\F2\0F\BE\FE9\ED=\11\B1\F8\BC\F4\B18\BE\7F\1F\D1\BD\FF\A3\83=\B62>>2IP\BE\13\FDc\BE\8C\D9\B4\BEa%5\BE\D0\11z>D\E8\C6\BDZ\ED[\BC\FA\F2U\BD\F1\84\81\BD=A\95>\E4\F6\1B\BDh\1A#>:@*<\DB\1A\90=\22/\A4>p\00\D1=\16\DA\94>\0A\8E\15>\A8\1A#>\C3\F2\BB>\18\98@>\19.\90=\E1\B8\C7=Lp\AC\BD\8E\CF\91<\D8\97\C2=\09\0Cd\BD\BDx\BA=\D4\BD\08=\9Ek3=\1BMC\BDz\0B^>\ED\7F{\BC>E\13\BEO3\99<G\89\F8=\D4P2=\17k\84\BB\8Cq\80\BB\B6\F9?\BE\D5\8A\9C=$O_\BE6\16\FF\BD\9Bq3>\DD\1A8\BE\13\81\05\BD\95\B6\A5\BE\C1IY\BE82*\BE\07\07\86;B\91x=\85(\A0=\DE\07\17\BDT\A0g\BC\82\16\DD\BDkd\DC=\19\F7\19>\91\BE\22\BE\A63\C4\BD\DB~\8F\BDi\05H\BD\D8\1D\02\BEr,\CA<\A8\C6\DE<]~\F7\BC\AD\A7W\BE\DB\B0\D8<\14\CB\09>E\C4\EC=\D8\15G\BDH\CF\18=\DD%\89>5A\D0=\EC\1C\1E>\A9\8A\AA>j&\9C<\DF\94\8D\BD]\D2\B6\BDW\9C\0D\BET\ACK\BD\DF\BD\8A=MS\1A\BE\FAZ\A7\BB\E4\E4\81<\8AQ4\BDHd\D4=\92\E9l\BE\7F\F3\C7\BD\B7\1D\98\BD\9E\B7r=\9D98>&R\A7\BC\9C~U=e\04\9D=\80\06\9B\BD\D4B\FB=\CF[<=\82\C2\E5=\9C\A5(>\E2vN\BB\F6S\AF\BDG\8E/\BEa\E69\BE\C2\C1L\BE\D2\A5\E1\BC\A0\1A\D6\BD~/!\BE\EAy\A0\BD\80\00\\\BD\9F8\90<*j8\BD\F6\B9\D0\BC,o{\BD\8Cm\AE<\AC~\86=\\!\03\BE\8B/\9E==n)>\19\F3\14=Z\AFk\BE\F1R\11>\9A\ACi>\C2-\A3>-\90?\BE\CAA\C8\BE\89\C7\98\B9\A3\10M\BDI)\EB\BD\89\F7\F8\BDI\E5\FD=\01\E5\9D;c\06\22\BD\96\E3.\BD\AA:\90=\C1v3\BC\B5<o=\02\F2\C5\BC\95\1E\B3=A/\EE<\03\C8\BF=\09\FB\A6\BD\94F\C6<\AD\B1[\BD`\08\91\BD\FF/s\BDB\8Cw\BEh/\0D\BE\AD\E5\81\BE\E2\93\D4\BD\84b\B9=\08,\E0\BB\D5\FD?\BE\\2b\BEA\FE\BB\BD\FC\E0n\BB\91\0DM\BE\E3-\04\BE\FD\DB\C1\BD\BD\B5';\EA\19\1D<\CB\04I=\03\1E\85>@~\00=\CF\A0\8A\BD\CD*k\BDbyB>7\\Q<\9F5\09\BE\D8\F3M\BE\89\95\E1\BD\E9V#\BE\0E\14M\BD\A1\81}\BE\DA3'\BE\DD>r=\C78D\BD\C5:\9F\BC\06s-\BEAz\B9;\B1\ED\9A\BDc%,\BEd\80\B4\BD\FD\07*\BE{\E4\E1\BDn)\1B\BD B,>'\FFX>\9A\1Fm=Xe\0E\BDC\A7\D2\BD\22\D7\DA=e\FB?=I\07D\BD\97\B8C\BE\9E]\F0\BD\0F\F3C\BE\F93\05\BE\EBC%\BE\87h\8C\BE\17v\E9\BD\B5\B7\16\BB\C5\C8\09\BD\C8\83,\BC\02]%\BEx\E6\09\BD]\9EI<V\80\02=\09\99\E7=\98]\98\BD\8D%\10\BD\AC\C6\E2\BC\CE\04\0C>\EB\A1\82\BB\B3\AF\F5\BD\EA\D1N;\1D\17K=]<\0C\BD0y\83\BDZ\FC\CB\BD\A6=\A2\BD\92}\CC\BD6\99\BA\BC\FA\8D\06=\D4Q\9D\BDY\9A\81=\02\AD\BD\BD\BA?o\BE\C0\114\BERr\F8\BD\D7\0F\F2=4_\CE8\0F3-\BE\CE\A0\12\BEIB\B6\BD\D3W\BF\BD$b\B9\BD&\C0\99\BD\D8\97\A4\BD\8B\EA\C4\BC\F0~\E7\BCw.\9F<\D0lC>\85.Q>\CDd\96:\88w\EF\BD\AD1q>3Vb>\DCb\B3=\7F\D0\81\BE\91A\A3\BD\AC^u\BEr\FD\0E>\AA_j>\ACs5\BE\04W\83\BD\F4e0\BE\01\C2F\BD\05\B9\00\BE\10\1E\9D\BD\0F\FB\89\BD\AD3\F9\BD\D2\A7w\BDgo\99=\06Z\AB\BD0\0A$\BE\87<\C6=RA\D6<\FC(\ED\BC\FD\8B\E6=\8B4\AD<Krq>\C5\87\0D>\81@0\BE\\M\83>\F0\E9\19>7\B7\1D\BE\C3\15\A8\BBf\D8\D6\BD\95\BF\01=\E9T\03\BEV\9D\83<`\F9\CC\BD\DDF'=\FB\E7\AE=\A6g\81\BE\F5n\9A<\9E\1Cp\BB\EA\99\A9\BCS\18\1A\BD\9F\BC\B7=\A8\1D\F6\BDt\F8\8B\BD\CE\8E\9B\BD\F0\05\DA;\C0Z\FF=\CFQ\01\BDU\95\8E\BE\D4\F1\B4=\CD\00\BF=$\94S=\B9\C5Q>\98\E2\92>^\91(={\A7-\BEY\C4\B5<\EF\C2\0D\BD\E0\\\9F=\95/\F6<H\F3\F0\BDy\1C\05\BE\B1\F5\0F=\1C\98~=\84\F2\00>g[\D4\BD\D9\94s\BE!\FF\06<\0F\93t=x=I>\D8Rt<\A2\C2R\BD\F1\F6\07<\7F\A9\C4<\83 \1D\BE\EC\D2h\BE\E1\D92\BE\EEK\B2\BD\96\D5\A7\BD\81\CD\CD<#\CCK\BE-\10\9F\BE\D9^\86\BE\7F8U\BE6\97\01\BE\7F\FA\C0\BC\94\92\1F\BE\C0\BB\16\BE\DA\B8\D1\BD\B0~\D0=m/#=\D2\FF(>3\90b\BD\22]!\BD\A6{\E3=\D8eo=\E1,\CA>m\11\15= \82\D0<\12S\06>a\C6\D1>[\E4\F0>g\F8\F5\BB\F8\15\DF<\C1Y\C6<\A5!\DB\BC\B3\7F\02\BE\9B\C3\DD;G\A3\C3=\91\F6x=\C2\D4\B2\BD\B1\13\E5<a\19\DF\BD\9B_\A5=\01\FD[<M\A4\1A=\D0\01|>\7F\A7\BF\B76\E9\AC\BD\EE\F7Y\BD@m~\BD\B48\BA=\88\EA\18<\C6\90-=\8Ci$\BE\C1o,\BC67V\BD\F2\AE1>\ADyM=~\13\CE\BDO\1DL\BC\0B4I='\E5\1E\BE\AEdc=8t\C9=\14 \07\BE\81#\D6<\802\A8<y\FC\96={2\FC=\E2\EE&\BDU+\FC=\D1\A5\90<#H\C0\BD\ED\0F0=\E5h\1A=RF\DA\BD\D8\B7p\BC\09\A7\EA<\FB\96\9E\BA2\92\0B\BE \9D\BD\BE\C2V\0F>\0En\92\BD\B6:D>R\\X>2\9D\F3\BBp)\B3=Z\DA\0F=J\14\8C<Y\98h<9O(=o\A8r\BD\07\9A]\BC\B5\01\CC\BD\F4\DA\09\BE\BD;[\BD\AA\CCW=\ADe\0C\BE\82\93\F9\BD\F4!\02\BEx\F7\01\BEF\E0\DE=t\B5\B9=\E8\17p\BD$\9D\99\BDxK\D5\BD\A5\05Y>\04\CEX>\E2\AA\8C=#\19\82\BE\C8\EC$\BE\E4;\8D<\88\FD/=\EA\B7\DD=\0F\CF&\BE\F7n\7F\BE\0Ey\A4:\92\EB\BB\BDm`\91\BD\A2\81\CF\BD\F9\BBY\BE\CBJk=1\B8c<\C1\F2W\BA\AA\D6\06\BE\9B\A0]\BE\99R\DA<\A0m#\BDHpV\BE\A3\8A\FB\BD\FF\06\D0<\DCM\1B=^\B1\F0=?\B3\F5\BDS%.\BE\D2|\C7\BD\C7\FDP>O\ECA>,C*\BD\8F\CE?=\C4e`\BD\9E\0D\9A\BD\A0\09\A3\BD\FDl\DE\BD\90\9D\05\BE\BAA\9C\BCZ{U\BE\E4\0A\01\BE\CCAT\BDG=\09\BE;\10\83\BE\C6\FCA\BD\FA\88\1E=\8D\A1%\BE\8F\EDA\BE\14fs\BEG\0D\C0=S\84\01=o\850>\A9\EB\1A>\CE\B9\88=;/\8E<%p~\BE\0B\8F\8D=\CE\D9\A9=\16\C3\15>\BD\00\18>e\B9/\BE\82^\C1\BDj\CFM;\9E\DC@=)t\18=l{\B6\BD\B3\16\06=K|1\BE\96\F8\FF\BD/\E7\F5==k\13\BC\A2\B2\BD;T\A8S\BE\AE\A8\90=\FEZ\96\BB_|\AC\BD\BE#D=\1FpY<9\F0(=i\11\9F\BD\85\C45=Z\E2\9D=\D4\86\81\BB\D9d7<8bl>;_\10=D\0B\12\BEF\9C\C9\BB\82w\E2=\03\A2#>_7\B3\BD\E4\02K\BEoAK\BDr^\C5\BA\E6y\1D\BD4\E8 \BD\A9d\90<\97JU;O\10?\BE\A7\CD\84>Vb\F6;\93`s\BE(\BCS\BE\AE\A2I=\97T\E9=$\08\19\BE\AE\01\93\BE\C0F=\BE\F0\8E\D7\BC\0ARf\BETB\0E\BEr*S\BE\B4`\0E\BE\8Bd\A3\BD\18CB\BE\B5\DF\09\BE\D6\0B\15\BE\A1ig\BD\DE\A2\16\BE\F7`D=\CF~n=\AC\AB\AC\BC)\A0\83<~z>>\D29\\='@\8A<cb\DC\BD\06\C5\1B;\99G*\BE%\06\E3\BC\80d\93\BD\BD\C3\15\BE8\B2K\BE\F2\91!<fI\FF\BCR\D4\AC\BDGBi\BDU#\F9<\10\E1\16\BE]\\z\BCY\F91=\A1\FB\CA\BD\00\A9\89=+s\0C\BE\B5G\A0\BD#uy=\04\F0\F2<Z\95\A5=I\D3`>\AAP\FF;\1F\F54\BE\09\06\1B\BC\9B6[\BC\0A\0Fn\BD\9Ez_\BE\AA\9B5\BD\8E\1B\0B\BD\ADq5\BE\89@\88;q\EE\81\BD\DB/\C3=\22\0Ct\BD\14\86/\BD\93\EA\03\BDT\8B\8F\BC|\1E_<.oB=\E3[7\BD\0D\96\09\BE\9D\0F/\BDC\D2\07\BD\B8q(\BDaW\F0<\E5\91v>\83eN\BEnq\84\BB\F0\D5\1D>c\9E6\BE\AA\13@\BB\11+u\BC\8FfF>9\96\0E=\7F!\86\BD6%V=\D3\E9\80>\EF\94\1F>\06 \E4\BD:Q\8D\BD\D1\BF\03\BE\AA\AB\8A\BD\89\F3b\BE\EEY\98\BD\BF\11\FA<7\F2O\BEJ\EFc\BE\B7\9C\EC\BD\F1\B9\DF\BDq67>\91\16F>\01\E9\96=3rf>\9FZ\84\BD\E7g\D0<\B0\14\A6=\EEm\84>\CC\87\0A>\C3\82\02\BCW\99H<\06x\CF=\0C9p>;?\C7\BD\DA\DD\86\BE@\95\94\BDXs|= \\\C3\BD,\FA@\BEX\9E\ED\BD\C1f\1B\BE\C2\C4\9D\BDYb\B7\BD\95\93\94<$\DC\C8\BC\FE\B3\CE\BDD\ADV\BE\80\11\BF=nB\1F\BDZgT\BE@*H\BEa\874\BE3*\F0\BD\06\ED%>\E0\AB7\BE\F8%c\BEWfj=\EE\BE\92\BD\E3\DB\D4;\15\03Q>\91\91\10?oRL>\87\88\07\BEO\94\94>)\EE\89>W\A9\A0>O\B4\EE=\C0\FB\D4=\08\BD\A1=y:\85>x^%>\B5\B3H\BD\A1\DF\BB\BD#'g\BD<w\FE\BD)m\86\BE\C7\C5\0F\BE\0C,\08=\D3yz\BD\03\90!<\BF+r>\88bK\BE\B1W\89=\C9w\03=\DC\FC\A5>\A7\0D\1A>\F4h\90\BC\07uL>\16\E33\BE\14i >\17\E1\ED\BD\BE\0F/\BE\AC)_;\09d\E8\BD\D3*\01=\EAl\08\BE\F5\DDV\BE\9A\9E\05<\B3\0A\96\BCU\9E\14\BD\AB\C4\16\BE!\B3e\BE\C3\0A\F9=\D8l\C0=\1E\BF\1B=v\A2\93\BD\F4\13\9B\BE\C1!\C0=Ch\04>\A3\1C\F4\BD.\F1P\BE\8D5\CD\BD2P\AA=o\8A\95\BE\874\A6\BE\E0\E3\0C\BEi\8C\9E=\C6rh=\DCzE=p\F6*\BE\BFY,\BE\B9\A8\83\BEvB\B4<X\B3\B8=\96\97\C6=\81\07\B9=\0A[\04\BE\15\B1\8A;\DD\16\14\BD*\7F\8A<;\1D/\BE\15\18\03\BE\0BW!;i\03\03\BE$\E6\87\BE\FE\0Ai\BE\FCrN\BDkXG=\A6\A1H\BDs\D2\08>\19j\A7=\87x\93\BD\D3\D0\BD=-\DDX=X\CE\D1=\E9\ED1<\8C\F3\EF\BD\8E\E2Q<5\EF\09>$t\EC==\C4:\BE\F5A\99\BD\EA\FC\13>\B7jD=\E9\E3\B3\BD\D6\1A%\BE\F0\0F\11\BD\99\BA\E0;\22\B0Q\BE^/\AD\BD~a\C1\BC \80\BF\BDh\D1\8D\BD\05(\0F\BEr\10\D6\BD(J\EE=\D4#\AD=\C2Vs<t\14\08\BE\B7\84(\BD\09\B7\09>\C8\0D\D9<\A9%+<\85\94\F9=rH\F9=\03\AE\8A\BD\FCSF=\E4c\EA=\DB\CE\96=\16\ADI=V:\AA\BD9\7F\EA\BDV\F4P\BC\BA\F7\F9\BD\BEU\B4\BDC\E3)>\F7(\01\BEG \1D>\CC\91\D0\BDA\E0\91\BE\E4\F0I\BE:\9E\14>^\92\EF\BD@U\22\BE?zq\BE;F\12\BE\CD\D5\A8=B-\CB;\12\E9\FD<\920V\BE\E3\BAG\BE\9Ac\15\BDu\8F!\BE,AJ\BE\D6\AA\A4\BEC\03s\BE\13\0D\FA<\F8\DF\9F\BEJ*\AA\BE\15a\B6\BE\85\E0\95=\AF\CEP>\A3',\BEt\81}\BEZ\C4]\BEc\F0\94>\D5\1F\CC>\1E\FA\F8\BD\8A\143=\F4\B1\A7>\1A3\B9>\18\1C\81\BE\A9\DB\DA=\1A*\E0\BC\ACqI\BE\E2\1CN\BE\0AH\82\BED*\C7=\DA\AFl>,\97\93=\04\BA\FD=\\\A1\F3=3C!>w\0B\F7<\B5\A4\B4\BD\DA\DA.>\CC~\22>\93\86\01\BE\BC\DCT\BE(dM\BD\FEI\D4=\0E1\10\BE\D7O\15>\E3\BC\A1\BD\AD&\BE\BD`\D3\FD\BC6\E8\B1\BD\A4\9AY>\DB\0Fv=w\EA\A2=\14LF\BD\D5\9F\EC\BC\F4\11\1E\BD\95\85\CA\BC\9D\02\EC\BD\DEB#=\BE\D9\02\BD\AE\F7s\BE\AF\A4\0D\BD\F4\16\C7\BD&\E0\88=H$\8B\BC\87-\CE=\89\F2\D6\BD;%\0E\BE\8B\84\11\BE\F9\BB\8D\BE\F8\A3\A0>FY+\BD\8E\AEZ\BEj\BA(\BD\11\E3\04\BE\11\8Ev\BD\8D\14E=\0BD\B6=\B7\CD\DA=\B9\85n>\E7/'\BE\C3\16l\BE\9F\1A\1E\BEa\9D\9C\BDaC\99\BB\B0\01b=\89<\99\BD\DE\\\CD\BC\91G->\09\19\AB=0\8D6>:\F6[=\85\03\F8<f\0E\13>\1CK\CB=IV\87>\1B\A1\09=5G\0A<dV\8E>\04\14^>^\0F\9A\BDE\F2\09>L\C9\A2=\F8lW>\D2La>=\F8\C8\BD\FE:\81\BD\F4\BB\22\BC\81\0C9\BE\B8\95H\BE\BClt;\BEWp\E0\BDB\ED\9B<\0D\F6\11>\EFC*>g\8E\13\BDJ\94\D1\BDIKs\BD>\BD5\BD\D2\02\BD;\8Av\00\BD\BC\19\0E\BE\BEFV\BE\EFF\8B\BE\14\1D:\BE\CD\06\C5\BD+3*=]w\8E9M\09\B9\BD\B9\C6\B6\BD\C2\A6\AD=\E4\02\B6\BC\98>\C6\BD\FD:\F0;G\C5/=4\92\10\BE\D3\8A7\BE\D7\E9A\BEM\FF\A0\BD\93s\F8=\15\85\B1<\C3\E7\9C\BD\DEG\8F\BE6X\C5\BD\8B\C7y>\E20;>E\CE\99\BC\F5\22\80\BEG\CDn\BCT\BF\F0=\E1\DB\96\BE\80\02\93\BC<\8BA\BDz\19(\BED{\88\BDG\86\95=\7F\86>\BD\F84\DF\BD\92\1C\82;\EF\A7\AE=\E3~,=\0A!@>/\BFL\BEa\11\18\BE8Q\C9\BC\94\C8W\BE\D6D\B6=\\j_=!\B5\E3\BDS\EB4>\F8\88\9A\BDI\E1E=\B4\DE[\BE\EA+\CA\BD\CB\D1=>\01\03=\BE\C95\A9\BD\D1\AB\DA\BC\CB\CF\DC\BD\E4\FB\CE\BD\97>Y=&\C7!\BE$\ED\82\BD\FC\F4\C9=I\F3\F4<\D9\22\C7:Ju\85>\13&f=\CB\1Bn\BE\BAq\9E;%\FF2\BE\9F\F6I>2j\8B=\9Ai\85:\0BT\7F=\F3J\FD\BD0\A1\13\BE$\B0\18\BE\D7j<\BE\18\B6\15>\D5e?\BE^\8F2\BE\07a\87;\E8\B7\0E\BE\8C3^\BD\00]\BB<\C2\C6_\BD\8F\894<y;\FF\BD(\BF%\BD\8B\16Z>-I\C9=`\F0\AB=\CD\0F\80\BDC\A7\D7\BD\D9\FD::\14\E5\94>Yi\BF=\CF\FF<\BD\11F\AC<^\C0\A3=;\8D\BF>\09+V=2d,\BE$\81\A7=\A9\EF\E8=\CD\A4\1C>q\DBp>\93\93?>l\90\0C>C=\ED\BD2\ED\01\BET\EF]\BE\17J'\BEz\80j\BE\13\CFC\BEv=\C8\BD\92\15*\BD\93\E6R\BD{\18\EE\BCg\06\CA\BDz\88\B9\BD\0E\BFJ\BE\C7\96\87\BD\B3\0A\EC\BD\98\C1\A7=\E1\D8\1A=&\D5y\BE\91\F5\1F\BE\B4\D4\11\BD\0F\EF\87\BEH\19\D5\BC+/\08=\83\CF\15\BE\11\B0\1F=n\DD\A2\BEE\B9\10>y\CD^>\8E}\BF\BC\DFyJ\BE\1A\07\05\BEjv0>g\E91>\DF\A8\DA\BC\17\B5t\BD\A8q\1A>mZ5>\C8Kg\BD\13(G\BEl\8B\E6\BD\1D\E7\D0= W\83=\BEq\B7<\18VG\BD\F4\9F\89\BD\DF?$\BE8\02\99>>s\C0=\D7\87T\BDd\0AR\BE\0D\0B\8A\BD\A8\84\C0>9\86\91=|P\B8\BD\F0\B8\B5\BD\168\E1=\DBF\9F>x\1B#\BD\19\F40\BE\91\A9\B4\BD&G\A8=\C2J5>\FDB\92\BC\9A\FD\85\BE\8B^&\BD91\0E>Z\E6\80\BD\11\8Bo\BE\122+\BE \1D\86\BDL\AD\A9\BD\99\1DS<\1Eh\FB<\A7'8\BEH\00\7F<\C56M=y\C4\DD\BD\C5\B7:\BE\AB<J\BD\0D\A4\F4=\BB\E2z\BE:\8B5\BE\A7\D1\83\BE9\06\02\BE\9D\11\E0=\D7dI\BE\DB\04;\BEH\E5\FA\BD(\12\FA\BD\DB\E4C\BE\AB\A0\9C\BE\A8n\BB\BDvUl\BD#s\05<\0F,\F4\BD\91\CF\A8\BE\F8vA=\F5b\81=\BF~Q=\04\BA\09\BE\E7@\AA\BD\D2<\F7=B\D3\D0=\C2\AEt\BE(\E2\C8\BD\ED@\01\BD>\8A\9B>H\8A\A3='\83u\BE\A7N6\BE\B2&\91\BC\F4x\81>\918}:#R\8F\BE\F2\82\AB\BD\A6\96\96>\AB\8Er<\8C\AB\D9\BD\D5*s\BE\AF9\85\BC\AB\16\B2\BE\9A\C6\D5\BE\F7s\0C\BD\1F\1F\F6\BC\C9j%\BE7\0B\90\BE\AF\03\17\BE\F6\94z=\BA\88\EC;\DA\BDY\BE2\10X\BD\E8.\07=\A1\F0P=\18Y\B6\BDY\BA\9C\BD\D1\87\12\BE\10K7=.Z\22=9\B5\03\BE0{\9E\BC\D6V\B4\BD\853\05=.\A3\E5\BD\93\83a<\8F6=\BEY\1Cj\BE\F6\1E\A1\BE0k\A2\BEX)\C9\BD\95\DDD<\E1S\B0\BD\B6\D9\7F\BE+7\D3\BC\E4\BF!\BEK\12'<\F4\9A\80<\95?2=\0D\AAk\BCO\C0\D3<\8E\95\0F>\1C\0D2\BE\A2X\0F\BC\12e\E4\BD{\BE\E8=\D8\F8\8B\BD\83;\81\BEx\8F\86\BDT\19\E5\BD\10\DE\CF\BD\E1\9A\12\BE\AC\B1\F6\BD\F3\9Ai\BE\10:w\BE\A1\9D\B3\BDc\AB\09\BE4\B6\C2;k\8E\9D\BE\1CTZ\BC\B5\D5\05=\F4\A2\C1\BCz%\C7=\F7\DEQ\BE\C0=/=5-\12>\85\0E\BC=bC?\BE\AAN\16>\B4\87*>a\BD\06>\1C\B9!<u\AA%\BE\B9b\BA>\E9\83P>:\14\C3=~<d\BB\0E1\16\BE\01\BA\F6;&\15\85=\81ft=\D2e\8C=k\F1\9D\BEw\9F~\BE\F2\DAn<\D5\F9\07>\E6\EFI>\CE_\DD\BEC\1A\8E=\ECn\85\BD\B2q\10\BE\C7\F8\C0\BD.\12\D1\BD\A7I\C2\BB\02\8D\E5\BA\C2\ECU\BE?\C2\C2\BD{\92U\BEh\F2R=\9E\1C\10\BE\92\BD_<\18A\E9\BD") {addr_space = 0 : i32, alignment = 16 : i64}
  llvm.func @main_graph(%arg0: !llvm.ptr<f32>, %arg1: !llvm.ptr<f32>, %arg2: i64, %arg3: i64, %arg4: i64, %arg5: i64, %arg6: i64, %arg7: i64, %arg8: i64, %arg9: i64, %arg10: i64) -> !llvm.struct<(ptr<f32>, ptr<f32>, i64, array<2 x i64>, array<2 x i64>)> attributes {input_names = ["Input3"], llvm.emit_c_interface, output_names = ["Plus214_Output_0"]} {
    %0 = llvm.mlir.constant(128 : index) : i64
    %1 = llvm.mlir.constant(3136 : index) : i64
    %2 = llvm.mlir.constant(1568 : index) : i64
    %3 = llvm.mlir.constant(196 : index) : i64
    %4 = llvm.mlir.constant(6272 : index) : i64
    %5 = llvm.mlir.constant(784 : index) : i64
    %6 = llvm.mlir.constant(25 : index) : i64
    %7 = llvm.mlir.constant(200 : index) : i64
    %8 = llvm.mlir.constant(0 : index) : i64
    %9 = llvm.mlir.constant(0.000000e+00 : f32) : f32
    %10 = llvm.mlir.constant(0xFF800000 : f32) : f32
    %11 = llvm.mlir.constant(1 : index) : i64
    %12 = llvm.mlir.constant(8 : index) : i64
    %13 = llvm.mlir.constant(28 : index) : i64
    %14 = llvm.mlir.constant(-1 : index) : i64
    %15 = llvm.mlir.constant(2 : index) : i64
    %16 = llvm.mlir.constant(30 : index) : i64
    %17 = llvm.mlir.constant(5 : index) : i64
    %18 = llvm.mlir.constant(-2 : index) : i64
    %19 = llvm.mlir.constant(14 : index) : i64
    %20 = llvm.mlir.constant(16 : index) : i64
    %21 = llvm.mlir.constant(4 : index) : i64
    %22 = llvm.mlir.constant(3 : index) : i64
    %23 = llvm.mlir.constant(-3 : index) : i64
    %24 = llvm.mlir.constant(10 : index) : i64
    %25 = llvm.mlir.constant(256 : index) : i64
    %26 = llvm.mlir.addressof @constant_0 : !llvm.ptr<array<12800 x i8>>
    %27 = llvm.bitcast %26 : !llvm.ptr<array<12800 x i8>> to !llvm.ptr<f32>
    %28 = llvm.mlir.addressof @constant_1 : !llvm.ptr<array<8 x array<1 x array<5 x array<5 x f32>>>>>
    %29 = llvm.bitcast %28 : !llvm.ptr<array<8 x array<1 x array<5 x array<5 x f32>>>>> to !llvm.ptr<f32>
    %30 = llvm.mlir.addressof @constant_3 : !llvm.ptr<array<1 x array<10 x f32>>>
    %31 = llvm.bitcast %30 : !llvm.ptr<array<1 x array<10 x f32>>> to !llvm.ptr<f32>
    %32 = llvm.mlir.addressof @constant_4 : !llvm.ptr<array<8 x f32>>
    %33 = llvm.bitcast %32 : !llvm.ptr<array<8 x f32>> to !llvm.ptr<f32>
    %34 = llvm.mlir.null : !llvm.ptr<f32>
    %35 = llvm.getelementptr %34[6272] : (!llvm.ptr<f32>) -> !llvm.ptr<f32>
    %36 = llvm.ptrtoint %35 : !llvm.ptr<f32> to i64
    %37 = llvm.add %36, %20  : i64
    %38 = llvm.call @malloc(%37) : (i64) -> !llvm.ptr<i8>
    %39 = llvm.bitcast %38 : !llvm.ptr<i8> to !llvm.ptr<f32>
    %40 = llvm.ptrtoint %39 : !llvm.ptr<f32> to i64
    %41 = llvm.sub %20, %11  : i64
    %42 = llvm.add %40, %41  : i64
    %43 = llvm.urem %42, %20  : i64
    %44 = llvm.sub %42, %43  : i64
    %45 = llvm.inttoptr %44 : i64 to !llvm.ptr<f32>
    %46 = llvm.mlir.null : !llvm.ptr<f32>
    %47 = llvm.getelementptr %46[1] : (!llvm.ptr<f32>) -> !llvm.ptr<f32>
    %48 = llvm.ptrtoint %47 : !llvm.ptr<f32> to i64
    %49 = llvm.alloca %48 x f32 : (i64) -> !llvm.ptr<f32>
    llvm.br ^bb1(%8 : i64)
  ^bb1(%50: i64):  // 2 preds: ^bb0, ^bb23
    %51 = llvm.icmp "slt" %50, %11 : i64
    llvm.cond_br %51, ^bb2, ^bb24
  ^bb2:  // pred: ^bb1
    llvm.br ^bb3(%8 : i64)
  ^bb3(%52: i64):  // 2 preds: ^bb2, ^bb22
    %53 = llvm.icmp "slt" %52, %11 : i64
    llvm.cond_br %53, ^bb4, ^bb23
  ^bb4:  // pred: ^bb3
    llvm.br ^bb5(%8 : i64)
  ^bb5(%54: i64):  // 2 preds: ^bb4, ^bb21
    %55 = llvm.icmp "slt" %54, %12 : i64
    llvm.cond_br %55, ^bb6, ^bb22
  ^bb6:  // pred: ^bb5
    %56 = llvm.mul %52, %12  : i64
    %57 = llvm.add %56, %54  : i64
    llvm.br ^bb7(%8 : i64)
  ^bb7(%58: i64):  // 2 preds: ^bb6, ^bb20
    %59 = llvm.icmp "slt" %58, %13 : i64
    llvm.cond_br %59, ^bb8, ^bb21
  ^bb8:  // pred: ^bb7
    llvm.br ^bb9(%8 : i64)
  ^bb9(%60: i64):  // 2 preds: ^bb8, ^bb19
    %61 = llvm.icmp "slt" %60, %13 : i64
    llvm.cond_br %61, ^bb10, ^bb20
  ^bb10:  // pred: ^bb9
    llvm.store %9, %49 : !llvm.ptr<f32>
    llvm.br ^bb11(%8 : i64)
  ^bb11(%62: i64):  // 2 preds: ^bb10, ^bb18
    %63 = llvm.icmp "slt" %62, %11 : i64
    llvm.cond_br %63, ^bb12, ^bb19
  ^bb12:  // pred: ^bb11
    %64 = llvm.mul %58, %14  : i64
    %65 = llvm.add %64, %15  : i64
    %66 = llvm.icmp "sgt" %65, %8 : i64
    %67 = llvm.select %66, %65, %8 : i1, i64
    %68 = llvm.mul %58, %14  : i64
    %69 = llvm.add %68, %16  : i64
    %70 = llvm.icmp "slt" %69, %17 : i64
    %71 = llvm.select %70, %69, %17 : i1, i64
    llvm.br ^bb13(%67 : i64)
  ^bb13(%72: i64):  // 2 preds: ^bb12, ^bb17
    %73 = llvm.icmp "slt" %72, %71 : i64
    llvm.cond_br %73, ^bb14, ^bb18
  ^bb14:  // pred: ^bb13
    %74 = llvm.mul %60, %14  : i64
    %75 = llvm.add %74, %15  : i64
    %76 = llvm.icmp "sgt" %75, %8 : i64
    %77 = llvm.select %76, %75, %8 : i1, i64
    %78 = llvm.mul %60, %14  : i64
    %79 = llvm.add %78, %16  : i64
    %80 = llvm.icmp "slt" %79, %17 : i64
    %81 = llvm.select %80, %79, %17 : i1, i64
    llvm.br ^bb15(%77 : i64)
  ^bb15(%82: i64):  // 2 preds: ^bb14, ^bb16
    %83 = llvm.icmp "slt" %82, %81 : i64
    llvm.cond_br %83, ^bb16, ^bb17
  ^bb16:  // pred: ^bb15
    %84 = llvm.add %62, %52  : i64
    %85 = llvm.add %72, %58  : i64
    %86 = llvm.add %85, %18  : i64
    %87 = llvm.add %82, %60  : i64
    %88 = llvm.add %87, %18  : i64
    %89 = llvm.mul %50, %5  : i64
    %90 = llvm.mul %84, %5  : i64
    %91 = llvm.add %89, %90  : i64
    %92 = llvm.mul %86, %13  : i64
    %93 = llvm.add %91, %92  : i64
    %94 = llvm.add %93, %88  : i64
    %95 = llvm.getelementptr %arg1[%94] : (!llvm.ptr<f32>, i64) -> !llvm.ptr<f32>
    %96 = llvm.load %95 : !llvm.ptr<f32>
    %97 = llvm.mul %57, %6  : i64
    %98 = llvm.mul %62, %6  : i64
    %99 = llvm.add %97, %98  : i64
    %100 = llvm.mul %72, %17  : i64
    %101 = llvm.add %99, %100  : i64
    %102 = llvm.add %101, %82  : i64
    %103 = llvm.getelementptr %29[%102] : (!llvm.ptr<f32>, i64) -> !llvm.ptr<f32>
    %104 = llvm.load %103 : !llvm.ptr<f32>
    %105 = llvm.load %49 : !llvm.ptr<f32>
    %106 = llvm.fmul %96, %104  : f32
    %107 = llvm.fadd %105, %106  : f32
    llvm.store %107, %49 : !llvm.ptr<f32>
    %108 = llvm.add %82, %11  : i64
    llvm.br ^bb15(%108 : i64)
  ^bb17:  // pred: ^bb15
    %109 = llvm.add %72, %11  : i64
    llvm.br ^bb13(%109 : i64)
  ^bb18:  // pred: ^bb13
    %110 = llvm.add %62, %11  : i64
    llvm.br ^bb11(%110 : i64)
  ^bb19:  // pred: ^bb11
    %111 = llvm.load %49 : !llvm.ptr<f32>
    %112 = llvm.getelementptr %33[%57] : (!llvm.ptr<f32>, i64) -> !llvm.ptr<f32>
    %113 = llvm.load %112 : !llvm.ptr<f32>
    %114 = llvm.fadd %111, %113  : f32
    %115 = llvm.mul %50, %4  : i64
    %116 = llvm.mul %57, %5  : i64
    %117 = llvm.add %115, %116  : i64
    %118 = llvm.mul %58, %13  : i64
    %119 = llvm.add %117, %118  : i64
    %120 = llvm.add %119, %60  : i64
    %121 = llvm.getelementptr %45[%120] : (!llvm.ptr<f32>, i64) -> !llvm.ptr<f32>
    llvm.store %114, %121 : !llvm.ptr<f32>
    %122 = llvm.add %60, %11  : i64
    llvm.br ^bb9(%122 : i64)
  ^bb20:  // pred: ^bb9
    %123 = llvm.add %58, %11  : i64
    llvm.br ^bb7(%123 : i64)
  ^bb21:  // pred: ^bb7
    %124 = llvm.add %54, %11  : i64
    llvm.br ^bb5(%124 : i64)
  ^bb22:  // pred: ^bb5
    %125 = llvm.add %52, %11  : i64
    llvm.br ^bb3(%125 : i64)
  ^bb23:  // pred: ^bb3
    %126 = llvm.add %50, %11  : i64
    llvm.br ^bb1(%126 : i64)
  ^bb24:  // pred: ^bb1
    %127 = llvm.mlir.null : !llvm.ptr<f32>
    %128 = llvm.getelementptr %127[6272] : (!llvm.ptr<f32>) -> !llvm.ptr<f32>
    %129 = llvm.ptrtoint %128 : !llvm.ptr<f32> to i64
    %130 = llvm.add %129, %20  : i64
    %131 = llvm.call @malloc(%130) : (i64) -> !llvm.ptr<i8>
    %132 = llvm.bitcast %131 : !llvm.ptr<i8> to !llvm.ptr<f32>
    %133 = llvm.ptrtoint %132 : !llvm.ptr<f32> to i64
    %134 = llvm.sub %20, %11  : i64
    %135 = llvm.add %133, %134  : i64
    %136 = llvm.urem %135, %20  : i64
    %137 = llvm.sub %135, %136  : i64
    %138 = llvm.inttoptr %137 : i64 to !llvm.ptr<f32>
    llvm.br ^bb25(%8 : i64)
  ^bb25(%139: i64):  // 2 preds: ^bb24, ^bb35
    %140 = llvm.icmp "slt" %139, %11 : i64
    llvm.cond_br %140, ^bb26, ^bb36
  ^bb26:  // pred: ^bb25
    llvm.br ^bb27(%8 : i64)
  ^bb27(%141: i64):  // 2 preds: ^bb26, ^bb34
    %142 = llvm.icmp "slt" %141, %12 : i64
    llvm.cond_br %142, ^bb28, ^bb35
  ^bb28:  // pred: ^bb27
    llvm.br ^bb29(%8 : i64)
  ^bb29(%143: i64):  // 2 preds: ^bb28, ^bb33
    %144 = llvm.icmp "slt" %143, %13 : i64
    llvm.cond_br %144, ^bb30, ^bb34
  ^bb30:  // pred: ^bb29
    llvm.br ^bb31(%8 : i64)
  ^bb31(%145: i64):  // 2 preds: ^bb30, ^bb32
    %146 = llvm.icmp "slt" %145, %13 : i64
    llvm.cond_br %146, ^bb32, ^bb33
  ^bb32:  // pred: ^bb31
    %147 = llvm.mul %139, %4  : i64
    %148 = llvm.mul %141, %5  : i64
    %149 = llvm.add %147, %148  : i64
    %150 = llvm.mul %143, %13  : i64
    %151 = llvm.add %149, %150  : i64
    %152 = llvm.add %151, %145  : i64
    %153 = llvm.getelementptr %45[%152] : (!llvm.ptr<f32>, i64) -> !llvm.ptr<f32>
    %154 = llvm.load %153 : !llvm.ptr<f32>
    %155 = llvm.fcmp "oge" %154, %9 : f32
    %156 = llvm.select %155, %154, %9 : i1, f32
    %157 = llvm.mul %139, %4  : i64
    %158 = llvm.mul %141, %5  : i64
    %159 = llvm.add %157, %158  : i64
    %160 = llvm.mul %143, %13  : i64
    %161 = llvm.add %159, %160  : i64
    %162 = llvm.add %161, %145  : i64
    %163 = llvm.getelementptr %138[%162] : (!llvm.ptr<f32>, i64) -> !llvm.ptr<f32>
    llvm.store %156, %163 : !llvm.ptr<f32>
    %164 = llvm.add %145, %11  : i64
    llvm.br ^bb31(%164 : i64)
  ^bb33:  // pred: ^bb31
    %165 = llvm.add %143, %11  : i64
    llvm.br ^bb29(%165 : i64)
  ^bb34:  // pred: ^bb29
    %166 = llvm.add %141, %11  : i64
    llvm.br ^bb27(%166 : i64)
  ^bb35:  // pred: ^bb27
    %167 = llvm.add %139, %11  : i64
    llvm.br ^bb25(%167 : i64)
  ^bb36:  // pred: ^bb25
    llvm.call @free(%38) : (!llvm.ptr<i8>) -> ()
    %168 = llvm.mlir.null : !llvm.ptr<f32>
    %169 = llvm.getelementptr %168[1568] : (!llvm.ptr<f32>) -> !llvm.ptr<f32>
    %170 = llvm.ptrtoint %169 : !llvm.ptr<f32> to i64
    %171 = llvm.add %170, %20  : i64
    %172 = llvm.call @malloc(%171) : (i64) -> !llvm.ptr<i8>
    %173 = llvm.bitcast %172 : !llvm.ptr<i8> to !llvm.ptr<f32>
    %174 = llvm.ptrtoint %173 : !llvm.ptr<f32> to i64
    %175 = llvm.sub %20, %11  : i64
    %176 = llvm.add %174, %175  : i64
    %177 = llvm.urem %176, %20  : i64
    %178 = llvm.sub %176, %177  : i64
    %179 = llvm.inttoptr %178 : i64 to !llvm.ptr<f32>
    %180 = llvm.mlir.null : !llvm.ptr<f32>
    %181 = llvm.getelementptr %180[1] : (!llvm.ptr<f32>) -> !llvm.ptr<f32>
    %182 = llvm.ptrtoint %181 : !llvm.ptr<f32> to i64
    %183 = llvm.alloca %182 x f32 : (i64) -> !llvm.ptr<f32>
    llvm.br ^bb37(%8 : i64)
  ^bb37(%184: i64):  // 2 preds: ^bb36, ^bb53
    %185 = llvm.icmp "slt" %184, %11 : i64
    llvm.cond_br %185, ^bb38, ^bb54
  ^bb38:  // pred: ^bb37
    llvm.br ^bb39(%8 : i64)
  ^bb39(%186: i64):  // 2 preds: ^bb38, ^bb52
    %187 = llvm.icmp "slt" %186, %12 : i64
    llvm.cond_br %187, ^bb40, ^bb53
  ^bb40:  // pred: ^bb39
    llvm.br ^bb41(%8 : i64)
  ^bb41(%188: i64):  // 2 preds: ^bb40, ^bb51
    %189 = llvm.icmp "slt" %188, %19 : i64
    llvm.cond_br %189, ^bb42, ^bb52
  ^bb42:  // pred: ^bb41
    llvm.br ^bb43(%8 : i64)
  ^bb43(%190: i64):  // 2 preds: ^bb42, ^bb50
    %191 = llvm.icmp "slt" %190, %19 : i64
    llvm.cond_br %191, ^bb44, ^bb51
  ^bb44:  // pred: ^bb43
    llvm.store %10, %183 : !llvm.ptr<f32>
    %192 = llvm.mul %188, %15  : i64
    %193 = llvm.icmp "slt" %192, %8 : i64
    %194 = llvm.select %193, %8, %192 : i1, i64
    %195 = llvm.mul %190, %15  : i64
    %196 = llvm.icmp "slt" %195, %8 : i64
    %197 = llvm.select %196, %8, %195 : i1, i64
    %198 = llvm.mul %188, %18  : i64
    %199 = llvm.add %198, %13  : i64
    %200 = llvm.mul %188, %15  : i64
    %201 = llvm.add %200, %15  : i64
    %202 = llvm.icmp "sgt" %199, %13 : i64
    %203 = llvm.select %202, %13, %199 : i1, i64
    %204 = llvm.icmp "slt" %203, %201 : i64
    %205 = llvm.select %204, %203, %201 : i1, i64
    %206 = llvm.icmp "slt" %205, %15 : i64
    %207 = llvm.select %206, %205, %15 : i1, i64
    llvm.br ^bb45(%8 : i64)
  ^bb45(%208: i64):  // 2 preds: ^bb44, ^bb49
    %209 = llvm.icmp "slt" %208, %207 : i64
    llvm.cond_br %209, ^bb46, ^bb50
  ^bb46:  // pred: ^bb45
    %210 = llvm.mul %190, %18  : i64
    %211 = llvm.add %210, %13  : i64
    %212 = llvm.mul %190, %15  : i64
    %213 = llvm.add %212, %15  : i64
    %214 = llvm.icmp "sgt" %211, %13 : i64
    %215 = llvm.select %214, %13, %211 : i1, i64
    %216 = llvm.icmp "slt" %215, %213 : i64
    %217 = llvm.select %216, %215, %213 : i1, i64
    %218 = llvm.icmp "slt" %217, %15 : i64
    %219 = llvm.select %218, %217, %15 : i1, i64
    llvm.br ^bb47(%8 : i64)
  ^bb47(%220: i64):  // 2 preds: ^bb46, ^bb48
    %221 = llvm.icmp "slt" %220, %219 : i64
    llvm.cond_br %221, ^bb48, ^bb49
  ^bb48:  // pred: ^bb47
    %222 = llvm.add %208, %194  : i64
    %223 = llvm.add %220, %197  : i64
    %224 = llvm.mul %184, %4  : i64
    %225 = llvm.mul %186, %5  : i64
    %226 = llvm.add %224, %225  : i64
    %227 = llvm.mul %222, %13  : i64
    %228 = llvm.add %226, %227  : i64
    %229 = llvm.add %228, %223  : i64
    %230 = llvm.getelementptr %138[%229] : (!llvm.ptr<f32>, i64) -> !llvm.ptr<f32>
    %231 = llvm.load %230 : !llvm.ptr<f32>
    %232 = llvm.load %183 : !llvm.ptr<f32>
    %233 = llvm.fcmp "ogt" %232, %231 : f32
    %234 = llvm.select %233, %232, %231 : i1, f32
    llvm.store %234, %183 : !llvm.ptr<f32>
    %235 = llvm.add %220, %11  : i64
    llvm.br ^bb47(%235 : i64)
  ^bb49:  // pred: ^bb47
    %236 = llvm.add %208, %11  : i64
    llvm.br ^bb45(%236 : i64)
  ^bb50:  // pred: ^bb45
    %237 = llvm.load %183 : !llvm.ptr<f32>
    %238 = llvm.mul %184, %2  : i64
    %239 = llvm.mul %186, %3  : i64
    %240 = llvm.add %238, %239  : i64
    %241 = llvm.mul %188, %19  : i64
    %242 = llvm.add %240, %241  : i64
    %243 = llvm.add %242, %190  : i64
    %244 = llvm.getelementptr %179[%243] : (!llvm.ptr<f32>, i64) -> !llvm.ptr<f32>
    llvm.store %237, %244 : !llvm.ptr<f32>
    %245 = llvm.add %190, %11  : i64
    llvm.br ^bb43(%245 : i64)
  ^bb51:  // pred: ^bb43
    %246 = llvm.add %188, %11  : i64
    llvm.br ^bb41(%246 : i64)
  ^bb52:  // pred: ^bb41
    %247 = llvm.add %186, %11  : i64
    llvm.br ^bb39(%247 : i64)
  ^bb53:  // pred: ^bb39
    %248 = llvm.add %184, %11  : i64
    llvm.br ^bb37(%248 : i64)
  ^bb54:  // pred: ^bb37
    llvm.call @free(%131) : (!llvm.ptr<i8>) -> ()
    %249 = llvm.mlir.addressof @constant_5 : !llvm.ptr<array<16 x f32>>
    %250 = llvm.bitcast %249 : !llvm.ptr<array<16 x f32>> to !llvm.ptr<f32>
    %251 = llvm.mlir.null : !llvm.ptr<f32>
    %252 = llvm.getelementptr %251[3136] : (!llvm.ptr<f32>) -> !llvm.ptr<f32>
    %253 = llvm.ptrtoint %252 : !llvm.ptr<f32> to i64
    %254 = llvm.add %253, %20  : i64
    %255 = llvm.call @malloc(%254) : (i64) -> !llvm.ptr<i8>
    %256 = llvm.bitcast %255 : !llvm.ptr<i8> to !llvm.ptr<f32>
    %257 = llvm.ptrtoint %256 : !llvm.ptr<f32> to i64
    %258 = llvm.sub %20, %11  : i64
    %259 = llvm.add %257, %258  : i64
    %260 = llvm.urem %259, %20  : i64
    %261 = llvm.sub %259, %260  : i64
    %262 = llvm.inttoptr %261 : i64 to !llvm.ptr<f32>
    %263 = llvm.mlir.null : !llvm.ptr<f32>
    %264 = llvm.getelementptr %263[1] : (!llvm.ptr<f32>) -> !llvm.ptr<f32>
    %265 = llvm.ptrtoint %264 : !llvm.ptr<f32> to i64
    %266 = llvm.alloca %265 x f32 : (i64) -> !llvm.ptr<f32>
    llvm.br ^bb55(%8 : i64)
  ^bb55(%267: i64):  // 2 preds: ^bb54, ^bb77
    %268 = llvm.icmp "slt" %267, %11 : i64
    llvm.cond_br %268, ^bb56, ^bb78
  ^bb56:  // pred: ^bb55
    llvm.br ^bb57(%8 : i64)
  ^bb57(%269: i64):  // 2 preds: ^bb56, ^bb76
    %270 = llvm.icmp "slt" %269, %11 : i64
    llvm.cond_br %270, ^bb58, ^bb77
  ^bb58:  // pred: ^bb57
    llvm.br ^bb59(%8 : i64)
  ^bb59(%271: i64):  // 2 preds: ^bb58, ^bb75
    %272 = llvm.icmp "slt" %271, %20 : i64
    llvm.cond_br %272, ^bb60, ^bb76
  ^bb60:  // pred: ^bb59
    %273 = llvm.mul %269, %20  : i64
    %274 = llvm.add %273, %271  : i64
    llvm.br ^bb61(%8 : i64)
  ^bb61(%275: i64):  // 2 preds: ^bb60, ^bb74
    %276 = llvm.icmp "slt" %275, %19 : i64
    llvm.cond_br %276, ^bb62, ^bb75
  ^bb62:  // pred: ^bb61
    llvm.br ^bb63(%8 : i64)
  ^bb63(%277: i64):  // 2 preds: ^bb62, ^bb73
    %278 = llvm.icmp "slt" %277, %19 : i64
    llvm.cond_br %278, ^bb64, ^bb74
  ^bb64:  // pred: ^bb63
    llvm.store %9, %266 : !llvm.ptr<f32>
    llvm.br ^bb65(%8 : i64)
  ^bb65(%279: i64):  // 2 preds: ^bb64, ^bb72
    %280 = llvm.icmp "slt" %279, %12 : i64
    llvm.cond_br %280, ^bb66, ^bb73
  ^bb66:  // pred: ^bb65
    %281 = llvm.mul %275, %14  : i64
    %282 = llvm.add %281, %15  : i64
    %283 = llvm.icmp "sgt" %282, %8 : i64
    %284 = llvm.select %283, %282, %8 : i1, i64
    %285 = llvm.mul %275, %14  : i64
    %286 = llvm.add %285, %20  : i64
    %287 = llvm.icmp "slt" %286, %17 : i64
    %288 = llvm.select %287, %286, %17 : i1, i64
    llvm.br ^bb67(%284 : i64)
  ^bb67(%289: i64):  // 2 preds: ^bb66, ^bb71
    %290 = llvm.icmp "slt" %289, %288 : i64
    llvm.cond_br %290, ^bb68, ^bb72
  ^bb68:  // pred: ^bb67
    %291 = llvm.mul %277, %14  : i64
    %292 = llvm.add %291, %15  : i64
    %293 = llvm.icmp "sgt" %292, %8 : i64
    %294 = llvm.select %293, %292, %8 : i1, i64
    %295 = llvm.mul %277, %14  : i64
    %296 = llvm.add %295, %20  : i64
    %297 = llvm.icmp "slt" %296, %17 : i64
    %298 = llvm.select %297, %296, %17 : i1, i64
    llvm.br ^bb69(%294 : i64)
  ^bb69(%299: i64):  // 2 preds: ^bb68, ^bb70
    %300 = llvm.icmp "slt" %299, %298 : i64
    llvm.cond_br %300, ^bb70, ^bb71
  ^bb70:  // pred: ^bb69
    %301 = llvm.mul %269, %12  : i64
    %302 = llvm.add %279, %301  : i64
    %303 = llvm.add %289, %275  : i64
    %304 = llvm.add %303, %18  : i64
    %305 = llvm.add %299, %277  : i64
    %306 = llvm.add %305, %18  : i64
    %307 = llvm.mul %267, %2  : i64
    %308 = llvm.mul %302, %3  : i64
    %309 = llvm.add %307, %308  : i64
    %310 = llvm.mul %304, %19  : i64
    %311 = llvm.add %309, %310  : i64
    %312 = llvm.add %311, %306  : i64
    %313 = llvm.getelementptr %179[%312] : (!llvm.ptr<f32>, i64) -> !llvm.ptr<f32>
    %314 = llvm.load %313 : !llvm.ptr<f32>
    %315 = llvm.mul %274, %7  : i64
    %316 = llvm.mul %279, %6  : i64
    %317 = llvm.add %315, %316  : i64
    %318 = llvm.mul %289, %17  : i64
    %319 = llvm.add %317, %318  : i64
    %320 = llvm.add %319, %299  : i64
    %321 = llvm.getelementptr %27[%320] : (!llvm.ptr<f32>, i64) -> !llvm.ptr<f32>
    %322 = llvm.load %321 : !llvm.ptr<f32>
    %323 = llvm.load %266 : !llvm.ptr<f32>
    %324 = llvm.fmul %314, %322  : f32
    %325 = llvm.fadd %323, %324  : f32
    llvm.store %325, %266 : !llvm.ptr<f32>
    %326 = llvm.add %299, %11  : i64
    llvm.br ^bb69(%326 : i64)
  ^bb71:  // pred: ^bb69
    %327 = llvm.add %289, %11  : i64
    llvm.br ^bb67(%327 : i64)
  ^bb72:  // pred: ^bb67
    %328 = llvm.add %279, %11  : i64
    llvm.br ^bb65(%328 : i64)
  ^bb73:  // pred: ^bb65
    %329 = llvm.load %266 : !llvm.ptr<f32>
    %330 = llvm.getelementptr %250[%274] : (!llvm.ptr<f32>, i64) -> !llvm.ptr<f32>
    %331 = llvm.load %330 : !llvm.ptr<f32>
    %332 = llvm.fadd %329, %331  : f32
    %333 = llvm.mul %267, %1  : i64
    %334 = llvm.mul %274, %3  : i64
    %335 = llvm.add %333, %334  : i64
    %336 = llvm.mul %275, %19  : i64
    %337 = llvm.add %335, %336  : i64
    %338 = llvm.add %337, %277  : i64
    %339 = llvm.getelementptr %262[%338] : (!llvm.ptr<f32>, i64) -> !llvm.ptr<f32>
    llvm.store %332, %339 : !llvm.ptr<f32>
    %340 = llvm.add %277, %11  : i64
    llvm.br ^bb63(%340 : i64)
  ^bb74:  // pred: ^bb63
    %341 = llvm.add %275, %11  : i64
    llvm.br ^bb61(%341 : i64)
  ^bb75:  // pred: ^bb61
    %342 = llvm.add %271, %11  : i64
    llvm.br ^bb59(%342 : i64)
  ^bb76:  // pred: ^bb59
    %343 = llvm.add %269, %11  : i64
    llvm.br ^bb57(%343 : i64)
  ^bb77:  // pred: ^bb57
    %344 = llvm.add %267, %11  : i64
    llvm.br ^bb55(%344 : i64)
  ^bb78:  // pred: ^bb55
    llvm.call @free(%172) : (!llvm.ptr<i8>) -> ()
    %345 = llvm.mlir.null : !llvm.ptr<f32>
    %346 = llvm.getelementptr %345[3136] : (!llvm.ptr<f32>) -> !llvm.ptr<f32>
    %347 = llvm.ptrtoint %346 : !llvm.ptr<f32> to i64
    %348 = llvm.add %347, %20  : i64
    %349 = llvm.call @malloc(%348) : (i64) -> !llvm.ptr<i8>
    %350 = llvm.bitcast %349 : !llvm.ptr<i8> to !llvm.ptr<f32>
    %351 = llvm.ptrtoint %350 : !llvm.ptr<f32> to i64
    %352 = llvm.sub %20, %11  : i64
    %353 = llvm.add %351, %352  : i64
    %354 = llvm.urem %353, %20  : i64
    %355 = llvm.sub %353, %354  : i64
    %356 = llvm.inttoptr %355 : i64 to !llvm.ptr<f32>
    llvm.br ^bb79(%8 : i64)
  ^bb79(%357: i64):  // 2 preds: ^bb78, ^bb89
    %358 = llvm.icmp "slt" %357, %11 : i64
    llvm.cond_br %358, ^bb80, ^bb90
  ^bb80:  // pred: ^bb79
    llvm.br ^bb81(%8 : i64)
  ^bb81(%359: i64):  // 2 preds: ^bb80, ^bb88
    %360 = llvm.icmp "slt" %359, %20 : i64
    llvm.cond_br %360, ^bb82, ^bb89
  ^bb82:  // pred: ^bb81
    llvm.br ^bb83(%8 : i64)
  ^bb83(%361: i64):  // 2 preds: ^bb82, ^bb87
    %362 = llvm.icmp "slt" %361, %19 : i64
    llvm.cond_br %362, ^bb84, ^bb88
  ^bb84:  // pred: ^bb83
    llvm.br ^bb85(%8 : i64)
  ^bb85(%363: i64):  // 2 preds: ^bb84, ^bb86
    %364 = llvm.icmp "slt" %363, %19 : i64
    llvm.cond_br %364, ^bb86, ^bb87
  ^bb86:  // pred: ^bb85
    %365 = llvm.mul %357, %1  : i64
    %366 = llvm.mul %359, %3  : i64
    %367 = llvm.add %365, %366  : i64
    %368 = llvm.mul %361, %19  : i64
    %369 = llvm.add %367, %368  : i64
    %370 = llvm.add %369, %363  : i64
    %371 = llvm.getelementptr %262[%370] : (!llvm.ptr<f32>, i64) -> !llvm.ptr<f32>
    %372 = llvm.load %371 : !llvm.ptr<f32>
    %373 = llvm.fcmp "oge" %372, %9 : f32
    %374 = llvm.select %373, %372, %9 : i1, f32
    %375 = llvm.mul %357, %1  : i64
    %376 = llvm.mul %359, %3  : i64
    %377 = llvm.add %375, %376  : i64
    %378 = llvm.mul %361, %19  : i64
    %379 = llvm.add %377, %378  : i64
    %380 = llvm.add %379, %363  : i64
    %381 = llvm.getelementptr %356[%380] : (!llvm.ptr<f32>, i64) -> !llvm.ptr<f32>
    llvm.store %374, %381 : !llvm.ptr<f32>
    %382 = llvm.add %363, %11  : i64
    llvm.br ^bb85(%382 : i64)
  ^bb87:  // pred: ^bb85
    %383 = llvm.add %361, %11  : i64
    llvm.br ^bb83(%383 : i64)
  ^bb88:  // pred: ^bb83
    %384 = llvm.add %359, %11  : i64
    llvm.br ^bb81(%384 : i64)
  ^bb89:  // pred: ^bb81
    %385 = llvm.add %357, %11  : i64
    llvm.br ^bb79(%385 : i64)
  ^bb90:  // pred: ^bb79
    llvm.call @free(%255) : (!llvm.ptr<i8>) -> ()
    %386 = llvm.mlir.null : !llvm.ptr<f32>
    %387 = llvm.getelementptr %386[256] : (!llvm.ptr<f32>) -> !llvm.ptr<f32>
    %388 = llvm.ptrtoint %387 : !llvm.ptr<f32> to i64
    %389 = llvm.add %388, %20  : i64
    %390 = llvm.call @malloc(%389) : (i64) -> !llvm.ptr<i8>
    %391 = llvm.bitcast %390 : !llvm.ptr<i8> to !llvm.ptr<f32>
    %392 = llvm.ptrtoint %391 : !llvm.ptr<f32> to i64
    %393 = llvm.sub %20, %11  : i64
    %394 = llvm.add %392, %393  : i64
    %395 = llvm.urem %394, %20  : i64
    %396 = llvm.sub %394, %395  : i64
    %397 = llvm.inttoptr %396 : i64 to !llvm.ptr<f32>
    %398 = llvm.mlir.null : !llvm.ptr<f32>
    %399 = llvm.getelementptr %398[1] : (!llvm.ptr<f32>) -> !llvm.ptr<f32>
    %400 = llvm.ptrtoint %399 : !llvm.ptr<f32> to i64
    %401 = llvm.alloca %400 x f32 : (i64) -> !llvm.ptr<f32>
    llvm.br ^bb91(%8 : i64)
  ^bb91(%402: i64):  // 2 preds: ^bb90, ^bb107
    %403 = llvm.icmp "slt" %402, %11 : i64
    llvm.cond_br %403, ^bb92, ^bb108
  ^bb92:  // pred: ^bb91
    llvm.br ^bb93(%8 : i64)
  ^bb93(%404: i64):  // 2 preds: ^bb92, ^bb106
    %405 = llvm.icmp "slt" %404, %20 : i64
    llvm.cond_br %405, ^bb94, ^bb107
  ^bb94:  // pred: ^bb93
    llvm.br ^bb95(%8 : i64)
  ^bb95(%406: i64):  // 2 preds: ^bb94, ^bb105
    %407 = llvm.icmp "slt" %406, %21 : i64
    llvm.cond_br %407, ^bb96, ^bb106
  ^bb96:  // pred: ^bb95
    llvm.br ^bb97(%8 : i64)
  ^bb97(%408: i64):  // 2 preds: ^bb96, ^bb104
    %409 = llvm.icmp "slt" %408, %21 : i64
    llvm.cond_br %409, ^bb98, ^bb105
  ^bb98:  // pred: ^bb97
    llvm.store %10, %401 : !llvm.ptr<f32>
    %410 = llvm.mul %406, %22  : i64
    %411 = llvm.icmp "slt" %410, %8 : i64
    %412 = llvm.select %411, %8, %410 : i1, i64
    %413 = llvm.mul %408, %22  : i64
    %414 = llvm.icmp "slt" %413, %8 : i64
    %415 = llvm.select %414, %8, %413 : i1, i64
    %416 = llvm.mul %406, %23  : i64
    %417 = llvm.add %416, %19  : i64
    %418 = llvm.mul %406, %22  : i64
    %419 = llvm.add %418, %22  : i64
    %420 = llvm.icmp "sgt" %417, %19 : i64
    %421 = llvm.select %420, %19, %417 : i1, i64
    %422 = llvm.icmp "slt" %421, %419 : i64
    %423 = llvm.select %422, %421, %419 : i1, i64
    %424 = llvm.icmp "slt" %423, %22 : i64
    %425 = llvm.select %424, %423, %22 : i1, i64
    llvm.br ^bb99(%8 : i64)
  ^bb99(%426: i64):  // 2 preds: ^bb98, ^bb103
    %427 = llvm.icmp "slt" %426, %425 : i64
    llvm.cond_br %427, ^bb100, ^bb104
  ^bb100:  // pred: ^bb99
    %428 = llvm.mul %408, %23  : i64
    %429 = llvm.add %428, %19  : i64
    %430 = llvm.mul %408, %22  : i64
    %431 = llvm.add %430, %22  : i64
    %432 = llvm.icmp "sgt" %429, %19 : i64
    %433 = llvm.select %432, %19, %429 : i1, i64
    %434 = llvm.icmp "slt" %433, %431 : i64
    %435 = llvm.select %434, %433, %431 : i1, i64
    %436 = llvm.icmp "slt" %435, %22 : i64
    %437 = llvm.select %436, %435, %22 : i1, i64
    llvm.br ^bb101(%8 : i64)
  ^bb101(%438: i64):  // 2 preds: ^bb100, ^bb102
    %439 = llvm.icmp "slt" %438, %437 : i64
    llvm.cond_br %439, ^bb102, ^bb103
  ^bb102:  // pred: ^bb101
    %440 = llvm.add %426, %412  : i64
    %441 = llvm.add %438, %415  : i64
    %442 = llvm.mul %402, %1  : i64
    %443 = llvm.mul %404, %3  : i64
    %444 = llvm.add %442, %443  : i64
    %445 = llvm.mul %440, %19  : i64
    %446 = llvm.add %444, %445  : i64
    %447 = llvm.add %446, %441  : i64
    %448 = llvm.getelementptr %356[%447] : (!llvm.ptr<f32>, i64) -> !llvm.ptr<f32>
    %449 = llvm.load %448 : !llvm.ptr<f32>
    %450 = llvm.load %401 : !llvm.ptr<f32>
    %451 = llvm.fcmp "ogt" %450, %449 : f32
    %452 = llvm.select %451, %450, %449 : i1, f32
    llvm.store %452, %401 : !llvm.ptr<f32>
    %453 = llvm.add %438, %11  : i64
    llvm.br ^bb101(%453 : i64)
  ^bb103:  // pred: ^bb101
    %454 = llvm.add %426, %11  : i64
    llvm.br ^bb99(%454 : i64)
  ^bb104:  // pred: ^bb99
    %455 = llvm.load %401 : !llvm.ptr<f32>
    %456 = llvm.mul %402, %25  : i64
    %457 = llvm.mul %404, %20  : i64
    %458 = llvm.add %456, %457  : i64
    %459 = llvm.mul %406, %21  : i64
    %460 = llvm.add %458, %459  : i64
    %461 = llvm.add %460, %408  : i64
    %462 = llvm.getelementptr %397[%461] : (!llvm.ptr<f32>, i64) -> !llvm.ptr<f32>
    llvm.store %455, %462 : !llvm.ptr<f32>
    %463 = llvm.add %408, %11  : i64
    llvm.br ^bb97(%463 : i64)
  ^bb105:  // pred: ^bb97
    %464 = llvm.add %406, %11  : i64
    llvm.br ^bb95(%464 : i64)
  ^bb106:  // pred: ^bb95
    %465 = llvm.add %404, %11  : i64
    llvm.br ^bb93(%465 : i64)
  ^bb107:  // pred: ^bb93
    %466 = llvm.add %402, %11  : i64
    llvm.br ^bb91(%466 : i64)
  ^bb108:  // pred: ^bb91
    llvm.call @free(%349) : (!llvm.ptr<i8>) -> ()
    %467 = llvm.mlir.addressof @constant_6 : !llvm.ptr<array<10240 x i8>>
    %468 = llvm.bitcast %467 : !llvm.ptr<array<10240 x i8>> to !llvm.ptr<f32>
    %469 = llvm.mlir.null : !llvm.ptr<f32>
    %470 = llvm.getelementptr %469[10] : (!llvm.ptr<f32>) -> !llvm.ptr<f32>
    %471 = llvm.ptrtoint %470 : !llvm.ptr<f32> to i64
    %472 = llvm.add %471, %0  : i64
    %473 = llvm.call @malloc(%472) : (i64) -> !llvm.ptr<i8>
    %474 = llvm.bitcast %473 : !llvm.ptr<i8> to !llvm.ptr<f32>
    %475 = llvm.ptrtoint %474 : !llvm.ptr<f32> to i64
    %476 = llvm.sub %0, %11  : i64
    %477 = llvm.add %475, %476  : i64
    %478 = llvm.urem %477, %0  : i64
    %479 = llvm.sub %477, %478  : i64
    %480 = llvm.inttoptr %479 : i64 to !llvm.ptr<f32>
    %481 = llvm.mlir.undef : !llvm.struct<(ptr<f32>, ptr<f32>, i64, array<2 x i64>, array<2 x i64>)>
    %482 = llvm.insertvalue %474, %481[0] : !llvm.struct<(ptr<f32>, ptr<f32>, i64, array<2 x i64>, array<2 x i64>)> 
    %483 = llvm.insertvalue %480, %482[1] : !llvm.struct<(ptr<f32>, ptr<f32>, i64, array<2 x i64>, array<2 x i64>)> 
    %484 = llvm.insertvalue %8, %483[2] : !llvm.struct<(ptr<f32>, ptr<f32>, i64, array<2 x i64>, array<2 x i64>)> 
    %485 = llvm.insertvalue %11, %484[3, 0] : !llvm.struct<(ptr<f32>, ptr<f32>, i64, array<2 x i64>, array<2 x i64>)> 
    %486 = llvm.insertvalue %24, %485[3, 1] : !llvm.struct<(ptr<f32>, ptr<f32>, i64, array<2 x i64>, array<2 x i64>)> 
    %487 = llvm.insertvalue %24, %486[4, 0] : !llvm.struct<(ptr<f32>, ptr<f32>, i64, array<2 x i64>, array<2 x i64>)> 
    %488 = llvm.insertvalue %11, %487[4, 1] : !llvm.struct<(ptr<f32>, ptr<f32>, i64, array<2 x i64>, array<2 x i64>)> 
    %489 = llvm.mlir.null : !llvm.ptr<f32>
    %490 = llvm.getelementptr %489[1] : (!llvm.ptr<f32>) -> !llvm.ptr<f32>
    %491 = llvm.ptrtoint %490 : !llvm.ptr<f32> to i64
    %492 = llvm.alloca %491 x f32 : (i64) -> !llvm.ptr<f32>
    llvm.br ^bb109(%8 : i64)
  ^bb109(%493: i64):  // 2 preds: ^bb108, ^bb116
    %494 = llvm.icmp "slt" %493, %11 : i64
    llvm.cond_br %494, ^bb110, ^bb117
  ^bb110:  // pred: ^bb109
    llvm.br ^bb111(%8 : i64)
  ^bb111(%495: i64):  // 2 preds: ^bb110, ^bb115
    %496 = llvm.icmp "slt" %495, %24 : i64
    llvm.cond_br %496, ^bb112, ^bb116
  ^bb112:  // pred: ^bb111
    llvm.store %9, %492 : !llvm.ptr<f32>
    llvm.br ^bb113(%8 : i64)
  ^bb113(%497: i64):  // 2 preds: ^bb112, ^bb114
    %498 = llvm.icmp "slt" %497, %25 : i64
    llvm.cond_br %498, ^bb114, ^bb115
  ^bb114:  // pred: ^bb113
    %499 = llvm.mul %493, %25  : i64
    %500 = llvm.add %499, %497  : i64
    %501 = llvm.getelementptr %397[%500] : (!llvm.ptr<f32>, i64) -> !llvm.ptr<f32>
    %502 = llvm.load %501 : !llvm.ptr<f32>
    %503 = llvm.mul %497, %24  : i64
    %504 = llvm.add %503, %495  : i64
    %505 = llvm.getelementptr %468[%504] : (!llvm.ptr<f32>, i64) -> !llvm.ptr<f32>
    %506 = llvm.load %505 : !llvm.ptr<f32>
    %507 = llvm.fmul %502, %506  : f32
    %508 = llvm.load %492 : !llvm.ptr<f32>
    %509 = llvm.fadd %507, %508  : f32
    llvm.store %509, %492 : !llvm.ptr<f32>
    %510 = llvm.add %497, %11  : i64
    llvm.br ^bb113(%510 : i64)
  ^bb115:  // pred: ^bb113
    %511 = llvm.load %492 : !llvm.ptr<f32>
    %512 = llvm.mul %8, %24  : i64
    %513 = llvm.add %512, %495  : i64
    %514 = llvm.getelementptr %31[%513] : (!llvm.ptr<f32>, i64) -> !llvm.ptr<f32>
    %515 = llvm.load %514 : !llvm.ptr<f32>
    %516 = llvm.fadd %511, %515  : f32
    %517 = llvm.mul %493, %24  : i64
    %518 = llvm.add %517, %495  : i64
    %519 = llvm.getelementptr %480[%518] : (!llvm.ptr<f32>, i64) -> !llvm.ptr<f32>
    llvm.store %516, %519 : !llvm.ptr<f32>
    %520 = llvm.add %495, %11  : i64
    llvm.br ^bb111(%520 : i64)
  ^bb116:  // pred: ^bb111
    %521 = llvm.add %493, %11  : i64
    llvm.br ^bb109(%521 : i64)
  ^bb117:  // pred: ^bb109
    llvm.call @free(%390) : (!llvm.ptr<i8>) -> ()
    llvm.return %488 : !llvm.struct<(ptr<f32>, ptr<f32>, i64, array<2 x i64>, array<2 x i64>)>
  }
  llvm.func @_mlir_ciface_main_graph(%arg0: !llvm.ptr<struct<(ptr<f32>, ptr<f32>, i64, array<2 x i64>, array<2 x i64>)>>, %arg1: !llvm.ptr<struct<(ptr<f32>, ptr<f32>, i64, array<4 x i64>, array<4 x i64>)>>) attributes {input_names = ["Input3"], llvm.emit_c_interface, output_names = ["Plus214_Output_0"]} {
    %0 = llvm.load %arg1 : !llvm.ptr<struct<(ptr<f32>, ptr<f32>, i64, array<4 x i64>, array<4 x i64>)>>
    %1 = llvm.extractvalue %0[0] : !llvm.struct<(ptr<f32>, ptr<f32>, i64, array<4 x i64>, array<4 x i64>)> 
    %2 = llvm.extractvalue %0[1] : !llvm.struct<(ptr<f32>, ptr<f32>, i64, array<4 x i64>, array<4 x i64>)> 
    %3 = llvm.extractvalue %0[2] : !llvm.struct<(ptr<f32>, ptr<f32>, i64, array<4 x i64>, array<4 x i64>)> 
    %4 = llvm.extractvalue %0[3, 0] : !llvm.struct<(ptr<f32>, ptr<f32>, i64, array<4 x i64>, array<4 x i64>)> 
    %5 = llvm.extractvalue %0[3, 1] : !llvm.struct<(ptr<f32>, ptr<f32>, i64, array<4 x i64>, array<4 x i64>)> 
    %6 = llvm.extractvalue %0[3, 2] : !llvm.struct<(ptr<f32>, ptr<f32>, i64, array<4 x i64>, array<4 x i64>)> 
    %7 = llvm.extractvalue %0[3, 3] : !llvm.struct<(ptr<f32>, ptr<f32>, i64, array<4 x i64>, array<4 x i64>)> 
    %8 = llvm.extractvalue %0[4, 0] : !llvm.struct<(ptr<f32>, ptr<f32>, i64, array<4 x i64>, array<4 x i64>)> 
    %9 = llvm.extractvalue %0[4, 1] : !llvm.struct<(ptr<f32>, ptr<f32>, i64, array<4 x i64>, array<4 x i64>)> 
    %10 = llvm.extractvalue %0[4, 2] : !llvm.struct<(ptr<f32>, ptr<f32>, i64, array<4 x i64>, array<4 x i64>)> 
    %11 = llvm.extractvalue %0[4, 3] : !llvm.struct<(ptr<f32>, ptr<f32>, i64, array<4 x i64>, array<4 x i64>)> 
    %12 = llvm.call @main_graph(%1, %2, %3, %4, %5, %6, %7, %8, %9, %10, %11) : (!llvm.ptr<f32>, !llvm.ptr<f32>, i64, i64, i64, i64, i64, i64, i64, i64, i64) -> !llvm.struct<(ptr<f32>, ptr<f32>, i64, array<2 x i64>, array<2 x i64>)>
    llvm.store %12, %arg0 : !llvm.ptr<struct<(ptr<f32>, ptr<f32>, i64, array<2 x i64>, array<2 x i64>)>>
    llvm.return
  }
  llvm.func @run_main_graph(%arg0: !llvm.ptr<i8>) -> !llvm.ptr<i8> {
    %0 = llvm.mlir.constant(8 : i64) : i64
    %1 = llvm.mlir.constant(2 : i64) : i64
    %2 = llvm.mlir.constant(0 : i64) : i64
    %3 = llvm.mlir.constant(1 : i64) : i64
    %4 = llvm.call @omTensorListGetOmtArray(%arg0) : (!llvm.ptr<i8>) -> !llvm.ptr<ptr<i8>>
    %5 = llvm.alloca %3 x !llvm.struct<(ptr<f32>, ptr<f32>, i64, array<2 x i64>, array<2 x i64>)> : (i64) -> !llvm.ptr<struct<(ptr<f32>, ptr<f32>, i64, array<2 x i64>, array<2 x i64>)>>
    %6 = llvm.load %4 : !llvm.ptr<ptr<i8>>
    %7 = llvm.alloca %3 x !llvm.struct<(ptr<f32>, ptr<f32>, i64, array<4 x i64>, array<4 x i64>)> : (i64) -> !llvm.ptr<struct<(ptr<f32>, ptr<f32>, i64, array<4 x i64>, array<4 x i64>)>>
    %8 = llvm.mlir.undef : !llvm.struct<(ptr<f32>, ptr<f32>, i64, array<4 x i64>, array<4 x i64>)>
    %9 = llvm.call @omTensorGetDataPtr(%6) : (!llvm.ptr<i8>) -> !llvm.ptr<i8>
    %10 = llvm.bitcast %9 : !llvm.ptr<i8> to !llvm.ptr<f32>
    %11 = llvm.insertvalue %10, %8[0] : !llvm.struct<(ptr<f32>, ptr<f32>, i64, array<4 x i64>, array<4 x i64>)> 
    %12 = llvm.insertvalue %10, %11[1] : !llvm.struct<(ptr<f32>, ptr<f32>, i64, array<4 x i64>, array<4 x i64>)> 
    %13 = llvm.insertvalue %2, %12[2] : !llvm.struct<(ptr<f32>, ptr<f32>, i64, array<4 x i64>, array<4 x i64>)> 
    %14 = llvm.call @omTensorGetShape(%6) : (!llvm.ptr<i8>) -> !llvm.ptr<i64>
    %15 = llvm.call @omTensorGetStrides(%6) : (!llvm.ptr<i8>) -> !llvm.ptr<i64>
    %16 = llvm.load %14 : !llvm.ptr<i64>
    %17 = llvm.insertvalue %16, %13[3, 0] : !llvm.struct<(ptr<f32>, ptr<f32>, i64, array<4 x i64>, array<4 x i64>)> 
    %18 = llvm.load %15 : !llvm.ptr<i64>
    %19 = llvm.insertvalue %18, %17[4, 0] : !llvm.struct<(ptr<f32>, ptr<f32>, i64, array<4 x i64>, array<4 x i64>)> 
    %20 = llvm.getelementptr %14[1] : (!llvm.ptr<i64>) -> !llvm.ptr<i64>
    %21 = llvm.load %20 : !llvm.ptr<i64>
    %22 = llvm.insertvalue %21, %19[3, 1] : !llvm.struct<(ptr<f32>, ptr<f32>, i64, array<4 x i64>, array<4 x i64>)> 
    %23 = llvm.getelementptr %15[1] : (!llvm.ptr<i64>) -> !llvm.ptr<i64>
    %24 = llvm.load %23 : !llvm.ptr<i64>
    %25 = llvm.insertvalue %24, %22[4, 1] : !llvm.struct<(ptr<f32>, ptr<f32>, i64, array<4 x i64>, array<4 x i64>)> 
    %26 = llvm.getelementptr %14[2] : (!llvm.ptr<i64>) -> !llvm.ptr<i64>
    %27 = llvm.load %26 : !llvm.ptr<i64>
    %28 = llvm.insertvalue %27, %25[3, 2] : !llvm.struct<(ptr<f32>, ptr<f32>, i64, array<4 x i64>, array<4 x i64>)> 
    %29 = llvm.getelementptr %15[2] : (!llvm.ptr<i64>) -> !llvm.ptr<i64>
    %30 = llvm.load %29 : !llvm.ptr<i64>
    %31 = llvm.insertvalue %30, %28[4, 2] : !llvm.struct<(ptr<f32>, ptr<f32>, i64, array<4 x i64>, array<4 x i64>)> 
    %32 = llvm.getelementptr %14[3] : (!llvm.ptr<i64>) -> !llvm.ptr<i64>
    %33 = llvm.load %32 : !llvm.ptr<i64>
    %34 = llvm.insertvalue %33, %31[3, 3] : !llvm.struct<(ptr<f32>, ptr<f32>, i64, array<4 x i64>, array<4 x i64>)> 
    %35 = llvm.getelementptr %15[3] : (!llvm.ptr<i64>) -> !llvm.ptr<i64>
    %36 = llvm.load %35 : !llvm.ptr<i64>
    %37 = llvm.insertvalue %36, %34[4, 3] : !llvm.struct<(ptr<f32>, ptr<f32>, i64, array<4 x i64>, array<4 x i64>)> 
    llvm.store %37, %7 : !llvm.ptr<struct<(ptr<f32>, ptr<f32>, i64, array<4 x i64>, array<4 x i64>)>>
    llvm.call @_mlir_ciface_main_graph(%5, %7) : (!llvm.ptr<struct<(ptr<f32>, ptr<f32>, i64, array<2 x i64>, array<2 x i64>)>>, !llvm.ptr<struct<(ptr<f32>, ptr<f32>, i64, array<4 x i64>, array<4 x i64>)>>) -> ()
    %38 = llvm.load %5 : !llvm.ptr<struct<(ptr<f32>, ptr<f32>, i64, array<2 x i64>, array<2 x i64>)>>
    %39 = llvm.call @malloc(%0) : (i64) -> !llvm.ptr<i8>
    %40 = llvm.bitcast %39 : !llvm.ptr<i8> to !llvm.ptr<ptr<i8>>
    %41 = llvm.call @omTensorCreateUntyped(%1) : (i64) -> !llvm.ptr<i8>
    %42 = llvm.extractvalue %38[0] : !llvm.struct<(ptr<f32>, ptr<f32>, i64, array<2 x i64>, array<2 x i64>)> 
    %43 = llvm.bitcast %42 : !llvm.ptr<f32> to !llvm.ptr<i8>
    %44 = llvm.extractvalue %38[1] : !llvm.struct<(ptr<f32>, ptr<f32>, i64, array<2 x i64>, array<2 x i64>)> 
    %45 = llvm.bitcast %44 : !llvm.ptr<f32> to !llvm.ptr<i8>
    llvm.call @omTensorSetDataPtr(%41, %3, %43, %45) : (!llvm.ptr<i8>, i64, !llvm.ptr<i8>, !llvm.ptr<i8>) -> ()
    llvm.call @omTensorSetDataType(%41, %3) : (!llvm.ptr<i8>, i64) -> ()
    %46 = llvm.call @omTensorGetShape(%41) : (!llvm.ptr<i8>) -> !llvm.ptr<i64>
    %47 = llvm.call @omTensorGetStrides(%41) : (!llvm.ptr<i8>) -> !llvm.ptr<i64>
    %48 = llvm.extractvalue %38[3, 0] : !llvm.struct<(ptr<f32>, ptr<f32>, i64, array<2 x i64>, array<2 x i64>)> 
    llvm.store %48, %46 : !llvm.ptr<i64>
    %49 = llvm.extractvalue %38[4, 0] : !llvm.struct<(ptr<f32>, ptr<f32>, i64, array<2 x i64>, array<2 x i64>)> 
    llvm.store %49, %47 : !llvm.ptr<i64>
    %50 = llvm.extractvalue %38[3, 1] : !llvm.struct<(ptr<f32>, ptr<f32>, i64, array<2 x i64>, array<2 x i64>)> 
    %51 = llvm.getelementptr %46[1] : (!llvm.ptr<i64>) -> !llvm.ptr<i64>
    llvm.store %50, %51 : !llvm.ptr<i64>
    %52 = llvm.extractvalue %38[4, 1] : !llvm.struct<(ptr<f32>, ptr<f32>, i64, array<2 x i64>, array<2 x i64>)> 
    %53 = llvm.getelementptr %47[1] : (!llvm.ptr<i64>) -> !llvm.ptr<i64>
    llvm.store %52, %53 : !llvm.ptr<i64>
    llvm.store %41, %40 : !llvm.ptr<ptr<i8>>
    %54 = llvm.call @omTensorListCreateWithOwnership(%40, %3, %3) : (!llvm.ptr<ptr<i8>>, i64, i64) -> !llvm.ptr<i8>
    llvm.return %54 : !llvm.ptr<i8>
  }
  llvm.mlir.global internal constant @_entry_point_arrays() {addr_space = 0 : i32} : !llvm.array<2 x ptr<i8>> {
    %0 = llvm.mlir.undef : !llvm.array<2 x ptr<i8>>
    %1 = llvm.mlir.addressof @_entry_point_0 : !llvm.ptr<array<15 x i8>>
    %2 = llvm.getelementptr %1[0, 0] : (!llvm.ptr<array<15 x i8>>) -> !llvm.ptr<i8>
    %3 = llvm.insertvalue %2, %0[0] : !llvm.array<2 x ptr<i8>> 
    %4 = llvm.mlir.null : !llvm.ptr<i8>
    %5 = llvm.insertvalue %4, %3[1] : !llvm.array<2 x ptr<i8>> 
    llvm.return %5 : !llvm.array<2 x ptr<i8>>
  }
  llvm.func @omQueryEntryPoints(%arg0: !llvm.ptr<i64>) -> !llvm.ptr<ptr<i8>> {
    %0 = llvm.mlir.constant(1 : i64) : i64
    %1 = llvm.mlir.null : !llvm.ptr<i64>
    %2 = llvm.icmp "ne" %arg0, %1 : !llvm.ptr<i64>
    llvm.cond_br %2, ^bb1, ^bb2
  ^bb1:  // pred: ^bb0
    llvm.store %0, %arg0 : !llvm.ptr<i64>
    llvm.br ^bb2
  ^bb2:  // 2 preds: ^bb0, ^bb1
    %3 = llvm.mlir.addressof @_entry_point_arrays : !llvm.ptr<array<2 x ptr<i8>>>
    %4 = llvm.bitcast %3 : !llvm.ptr<array<2 x ptr<i8>>> to !llvm.ptr<ptr<i8>>
    llvm.return %4 : !llvm.ptr<ptr<i8>>
  }
  llvm.func @omInputSignature(%arg0: !llvm.ptr<i8>) -> !llvm.ptr<i8> {
    %0 = llvm.mlir.constant(15 : i64) : i64
    %1 = llvm.mlir.constant(0 : i32) : i32
    %2 = llvm.mlir.addressof @_entry_point_0 : !llvm.ptr<array<15 x i8>>
    %3 = llvm.getelementptr %2[0, 0] : (!llvm.ptr<array<15 x i8>>) -> !llvm.ptr<i8>
    %4 = llvm.call @strncmp(%arg0, %3, %0) : (!llvm.ptr<i8>, !llvm.ptr<i8>, i64) -> i32
    %5 = llvm.icmp "eq" %4, %1 : i32
    llvm.cond_br %5, ^bb1, ^bb2
  ^bb1:  // pred: ^bb0
    %6 = llvm.mlir.addressof @_entry_point_0_in_sig : !llvm.ptr<array<76 x i8>>
    %7 = llvm.bitcast %6 : !llvm.ptr<array<76 x i8>> to !llvm.ptr<i8>
    llvm.return %7 : !llvm.ptr<i8>
  ^bb2:  // pred: ^bb0
    %8 = llvm.mlir.null : !llvm.ptr<i8>
    llvm.return %8 : !llvm.ptr<i8>
  }
  llvm.func @omOutputSignature(%arg0: !llvm.ptr<i8>) -> !llvm.ptr<i8> {
    %0 = llvm.mlir.constant(15 : i64) : i64
    %1 = llvm.mlir.constant(0 : i32) : i32
    %2 = llvm.mlir.addressof @_entry_point_0 : !llvm.ptr<array<15 x i8>>
    %3 = llvm.getelementptr %2[0, 0] : (!llvm.ptr<array<15 x i8>>) -> !llvm.ptr<i8>
    %4 = llvm.call @strncmp(%arg0, %3, %0) : (!llvm.ptr<i8>, !llvm.ptr<i8>, i64) -> i32
    %5 = llvm.icmp "eq" %4, %1 : i32
    llvm.cond_br %5, ^bb1, ^bb2
  ^bb1:  // pred: ^bb0
    %6 = llvm.mlir.addressof @_entry_point_0_out_sig : !llvm.ptr<array<76 x i8>>
    %7 = llvm.bitcast %6 : !llvm.ptr<array<76 x i8>> to !llvm.ptr<i8>
    llvm.return %7 : !llvm.ptr<i8>
  ^bb2:  // pred: ^bb0
    %8 = llvm.mlir.null : !llvm.ptr<i8>
    llvm.return %8 : !llvm.ptr<i8>
  }
}

Use shared library

Mnist-12.onnx를 컴파일하여 나온 shared lib를 사용해 추론해보는 방법에 대해 소개한다.

shared Lib를 사용하려면 ONNX-MLIR Runtime을 사용해야 하며 Python, Java, C++ 언어로 shared lib를 활용가능하다.

Python Inference

  1. Python의 경우 ONNX-MLIR이 로컬PC에 빌드가 완료되어야 한다.
  2. MLIR 빌드가 완료되면 PyCompile.cpython-<target>.so 형태의 파일이 생긴다.(빌드하기)
  3. 작업할 디렉토리에서 빌드가 완료된 파일들에 링크를 걸어줘야 한다.
$ ln -s build/Debug/lib/PyCompile.cpython-<target>.so.
$ ln -s build/Debug/lib/PyRuntime.cpython-<target>.so.
$ ln -s build/Debug/lib/PyCompileAndRuntime.cpython-<target>.so.

http://onnx.ai/onnx-mlir/UsingPyRuntime.html

아래 명령어로 mnist-12.onnx라는 모델을 공유라이브러리 형태로 바꿔준다.

$ docker/onnx-mlir.py --EmitLib mnist/mnist-12.onnx

이렇게 생성된 파일을 가지고 Inference해보자.

input으로는 캐글에서 다운받은 28x28 크기인 숫자 2인 이미지다.

import numpy as np
from PyRuntime import OMExecutionSession
import cv2

def softmax(x):
    """Compute softmax values for each sets of scores in x."""
    e_x = np.exp(x - np.max(x))
    return e_x / e_x.sum()

model = './mnist-12.so' # LeNet from ONNX Zoo compiled with onnx-mlir

# Create a session for this model.
session = OMExecutionSession(shared_lib_path=model)
# Input and output signatures of the default entry point.
print("input signature in json", session.input_signature())
print("output signature in json",session.output_signature())
# Do inference using the default entry point.

img = cv2.imread('img_1.jpg',cv2.IMREAD_GRAYSCALE)
img = np.array(img).astype(np.float32)
#print(img.shape) # 28, 28, 1
img = np.expand_dims(img, axis=0)
img = np.expand_dims(img, axis=0)
# print(img.shape) # 1, 1, 28, 28
img = (img/255.0)

outputs = session.run(input=[img])
outputs = softmax(outputs[0][0])
idx = np.argmax(outputs)

print(f"Label: {idx}, score: {outputs[idx]}")

Output

C++ Inference

  1. ONNX-MLIR이 빌드되지 않아도 사용가능하다.
  2. ONNX-MLIR의 Github에서 다운받은 header파일을 사용한다.

Runtime에 필요한 헤더파일들의 목록이다

  1. OMCompilerMacros.h
  2. OMCompilerTypes.h
  3. OMEntryPoint.h
  4. OMInstrument.h
  5. OMSignature.h
  6. OMTensor.h
  7. OMTensorList.h
  8. OnnxDataType.h
  9. OnnxMlirRuntime.h
  10. OnnxDataTypeMetaData.inc

아래는 C++로 추론하기 위해 사용되는 .cpp 파일이다

run.cpp
#include <iostream>
#include <vector>

#include "/home/jj/workspace/mlir_graph_example/OnnxMlirRuntime.h"

// Declare the inference entry point.
extern "C" OMTensorList *run_main_graph(OMTensorList *);

static float img_data[] = {-0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.029637714847922325f, 0.7467845678329468f,
    1.7777715921401978f, 2.796030282974243f, 1.5104787349700928f,
    1.5104787349700928f, 0.36493754386901855f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, 0.09764464199542999f, 2.5414655208587646f,
    2.783302068710327f, 2.796030282974243f, 2.783302068710327f,
    2.796030282974243f, 2.783302068710327f, 2.4141831398010254f,
    0.6067740321159363f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, 0.4922199249267578f, 2.5414655208587646f,
    2.808758497238159f, 1.7650433778762817f, -0.4242129623889923f,
    -0.4242129623889923f, 2.0323362350463867f, 2.796030282974243f,
    2.808758497238159f, 2.2869009971618652f, -0.15692004561424255f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, 0.09764464199542999f, 2.796030282974243f,
    2.783302068710327f, 1.2431857585906982f, -0.2969306409358978f,
    -0.4242129623889923f, -0.4242129623889923f, 0.4794916808605194f,
    2.783302068710327f, 2.796030282974243f, 2.783302068710327f,
    1.3831963539123535f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.2842023968696594f, 1.7777715921401978f,
    2.808758497238159f, 2.5414655208587646f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    0.09764464199542999f, 2.668747901916504f, 2.808758497238159f,
    2.796030282974243f, 2.808758497238159f, 1.7650433778762817f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, 0.22492696344852448f,
    2.783302068710327f, 2.796030282974243f, 0.466763436794281f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, 2.159618616104126f,
    1.4977505207061768f, 2.5287373065948486f, 2.796030282974243f,
    2.783302068710327f, 0.6195022463798523f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    1.5104787349700928f, 2.796030282974243f, 2.68147611618042f,
    0.08491640537977219f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    0.09764464199542999f, -0.4242129623889923f, 0.6195022463798523f,
    2.5541937351226807f, 2.796030282974243f, 2.5541937351226807f,
    -0.042365945875644684f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    0.09764464199542999f, 2.5414655208587646f, 2.783302068710327f,
    1.6377609968185425f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, 1.0013492107391357f, 2.783302068710327f,
    2.796030282974243f, 1.7650433778762817f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, 0.8740668296813965f, 2.808758497238159f,
    2.796030282974243f, 0.6195022463798523f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.15692004561424255f,
    2.4141831398010254f, 2.808758497238159f, 2.796030282974243f,
    0.36493754386901855f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, 1.3831963539123535f,
    2.796030282974243f, 2.783302068710327f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, 1.1286314725875854f, 2.796030282974243f,
    2.783302068710327f, 0.8740668296813965f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.029637714847922325f,
    2.5414655208587646f, 2.808758497238159f, 2.796030282974243f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    2.808758497238159f, 2.796030282974243f, 2.159618616104126f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    0.22492696344852448f, 2.783302068710327f, 2.796030282974243f,
    2.783302068710327f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, 2.796030282974243f, 2.783302068710327f,
    2.159618616104126f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, 0.22492696344852448f, 2.796030282974243f,
    2.808758497238159f, 2.796030282974243f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.15692004561424255f, 2.808758497238159f,
    2.796030282974243f, 1.3831963539123535f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, 0.22492696344852448f,
    2.783302068710327f, 2.796030282974243f, 2.783302068710327f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, 0.8740668296813965f,
    2.796030282974243f, 2.783302068710327f, 0.8740668296813965f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, 1.905053973197937f, 2.808758497238159f,
    2.796030282974243f, 1.6504892110824585f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.029637714847922325f,
    2.5414655208587646f, 2.808758497238159f, 2.5414655208587646f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, 0.8740668296813965f,
    2.796030282974243f, 2.783302068710327f, 2.668747901916504f,
    0.08491640537977219f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    1.2559140920639038f, 2.783302068710327f, 2.796030282974243f,
    0.466763436794281f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, 1.7777715921401978f, 2.796030282974243f,
    2.821486711502075f, 2.796030282974243f, 0.6195022463798523f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    0.6195022463798523f, 2.808758497238159f, 2.796030282974243f,
    1.1413596868515015f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.2969306409358978f,
    1.7650433778762817f, 2.796030282974243f, 2.783302068710327f,
    2.668747901916504f, 1.6377609968185425f, 0.09764464199542999f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    1.6504892110824585f, 2.668747901916504f, 2.796030282974243f,
    2.274172782897949f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, 1.1413596868515015f,
    2.668747901916504f, 2.808758497238159f, 2.796030282974243f,
    2.5541937351226807f, 1.5104787349700928f, 1.5232069492340088f,
    2.5414655208587646f, 2.808758497238159f, 2.5414655208587646f,
    1.1413596868515015f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, 0.08491640537977219f, 1.4977505207061768f,
    2.5287373065948486f, 2.796030282974243f, 2.783302068710327f,
    2.796030282974243f, 2.783302068710327f, 1.4977505207061768f,
    0.21219873428344727f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f, -0.4242129623889923f,
    -0.4242129623889923f, -0.4242129623889923f};


int main() {
  // Create an input tensor list of 1 tensor.
  int inputNum = 1;
  OMTensor **inputTensors = (OMTensor **)malloc(inputNum * sizeof(OMTensor *));
  // The first input is of tensor<1x1x28x28xf32>.
  int64_t rank = 4;
  int64_t shape[] = {1, 1, 28, 28};
  OMTensor *tensor = omTensorCreate(img_data, shape, rank, ONNX_TYPE_FLOAT);
  // Create a tensor list.
  inputTensors[0] = tensor;
  OMTensorList *tensorListIn = omTensorListCreate(inputTensors, inputNum);

  // Compute outputs.
  OMTensorList *tensorListOut = run_main_graph(tensorListIn);

  // Extract the output. The model defines one output of type tensor<1x10xf32>.
  OMTensor *y = omTensorListGetOmtByIndex(tensorListOut, 0);
  float *prediction = (float *)omTensorGetDataPtr(y);

  // Analyze the output.
  int digit = -1;
  float prob = 0.;
  for (int i = 0; i < 10; i++) {
    printf("prediction[%d] = %f\n", i, prediction[i]);
    if (prediction[i] > prob) {
      digit = i;
      prob = prediction[i];
    }
  }

  printf("The digit is %d\n", digit);
  return 0;
}

위 코드와 함께 아래 명령어를 실행한다.

g++ --std=c++11 -O3 run.cpp ./model.so -o mnist -I /home/jj/workspace/onnx-mlir/include

그렇게되면 mnist라는 이름으로 실행가능한 파일이 생긴다.

실행시키면 다음과 같은 결과가 나온다.

https://github.com/onnx/onnx-mlir/blob/main/docs/mnist_example/README.md

ONNX-MLIR 변환과정에서 오류가 발생한 경우

ONNX와 ONNX-MLIR을 개발하는 회사가 달라 모든 모델이 다 변환되지 않는다.

따라서 MobileNetV2-7의 경우에는 ONNX-MLIR로 변환이 잘 되지만 2-12버전의 경우는 변환과정 중 에러가 난다. 아래는 MoibleNetV2-12변환 과정에 오류를 해결하는 방법에 대해 설명한다.

ONNX model Zoo에서 가져온 2-12버전의 MobileNet을 공유라이브러리 형태로 변환하자.

$ docker/onnx-mlir.py --EmitLib mobilenet/mobilenetv2-12.onnx

그러나 에러문구가 뜨면서 mobileNetV2-12.ONNX가 shared-lib로 변환되지 않는다.

반면 mobileNetV2-7.ONNX는 변환이 잘 되는 것을 확인했다.

변환오류 해결하기

왜 안 되는지 파악하기 위해 모델 구조를 비교했다.

류원인 분석

  • 12버전에서는 Clip이라는 Operator가 7버전의 Relu를 대체
  • 하단 출력부의 구조가 다름
  • 12버전에서는 Bias weight가 존재하는데 아마 7버전에는 존재X → BatchNorm을 대체하는 느낌
MobileNetv2-12 상단부
MobileNetv2-12 상단부
MobileNetv2-12 하단부
MobileNetv2-12 하단부
MobileNetv2-7 상단부
MobileNetv2-7 상단부
MobileNetv2-7 하단부
MobileNetv2-7 하단부

따라서 먼저 하단부를 변경하여 시도해보았으나 여전히 같은 오류가 발생한다.

이번엔 Clip 부분을 수정했더니 컴파일이 잘 된다.

변경 전
변경 전
변경 후
변경 후

변경된 (.SO)를 가지고 잘 추론하는지 확인해보기 위해 이미지 한장을 가지고 실험한다.

MoibleNetV2 Code
import numpy as np
from PyRuntime import OMExecutionSession
import cv2

with open("imagenet_classes.txt", "r") as f :
    categories = [s.strip() for s in f.readlines()]


def softmax(x):
    e_x = np.exp(x - np.max(x))
    return e_x / e_x.sum()

def get_image(image_dirs) :
    image_list = []
    for roots, dirs, files in os.walk(image_dirs) :
        for file in files :
            image_dir = os.path.join(roots, file)
            if image_dir.endswith("png") or image_dir.endswith("jpg") or image_dir.endswith("JPEG") :
                image_list.append(image_dir)

    return image_list

def preprocess_image(image_path) :
    image_path = image_path
    image = cv2.imread(image_path, 1) #image read
    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    image_data = cv2.resize(image, (256, 256), interpolation=cv2.INTER_LINEAR).astype(np.float32) # cv2.INTER_LINEAR
    image_data = image_data[16:240, 16:240, :].copy()
    
    image_data = image_data.transpose([2, 0, 1]) # C, H, W
    mean = np.array([0.079, 0.05, 0]) + 0.406 # 0.485, 0.456, 0.406
    std = np.array([0.005, 0, 0.001]) + 0.224 #0.229, 0.224, 0.225

    for channel in range(image_data.shape[0]): 
        image_data[channel, :, :] = (image_data[channel, :, :] / 255 - mean[channel]) / std[channel] #RGB
        
    image_data = np.expand_dims(image_data, axis=0)
    image_data = np.ascontiguousarray(image_data.data)

    return image_data


model = './edited_mobilenet12.so' # LeNet from ONNX Zoo compiled with onnx-mlir

data = "./parrot.jpg"
#image = get_image(data)
input_data = preprocess_image(data)


session = OMExecutionSession(shared_lib_path=model)

print("input signature in json", session.input_signature())
print("output signature in json",session.output_signature())
print(input_data.shape)
outputs = session.run(input=[input_data])


outputs = softmax(outputs[0][0])
idx = np.argmax(outputs)
print(f"Label: {categories[idx]}, score: {outputs[idx]}")