├── CMakeLists.txt
├── Makefile
├── README
├── data
└── last_mag_calibration
├── launch
└── calibrator.launch
├── nodes
├── calibrate_imu.py
└── plot_calibration_data.py
└── package.xml
/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | cmake_minimum_required(VERSION 2.4.6)
2 | project(calibrate_imu)
3 |
4 | find_package(catkin REQUIRED COMPONENTS
5 | rospy
6 | sensor_msgs
7 | geometry_msgs
8 | std_msgs
9 | )
10 |
11 |
12 | catkin_package(
13 | # INCLUDE_DIRS include
14 | # LIBRARIES atu_sonar
15 | # CATKIN_DEPENDS rospy sensor_msgs std_msgs
16 | # DEPENDS system_lib
17 | )
18 |
19 | include_directories(
20 | ${catkin_INCLUDE_DIRS}
21 | )
22 |
--------------------------------------------------------------------------------
/Makefile:
--------------------------------------------------------------------------------
1 | include $(shell rospack find mk)/cmake.mk
--------------------------------------------------------------------------------
/README:
--------------------------------------------------------------------------------
1 | This ROS node will read messages published to the /imu/data and /imu/mag topics. For the moment it only performs magnetometer calibration.
2 |
3 | * To run the node
4 |
5 | rosrun calibrate_imu calibrate_imu.py
6 |
7 | * To start collecting samples from the IMU
8 |
9 | rosservice call /start_sampling
10 |
11 | * To calibrate the magnetometer using the current data samples
12 |
13 | rosservice call /calibrate_mag
14 |
15 | This will store the calibration parameters in a file called "mag_calibration_d_m_y_H_M_S", where d_m_y_H_M_S is the time the file was created. For an example on how to read the file you can look at the plot_calibration_data.py script
16 |
17 | * To visualize the raw data from the magnetometer and the calibrated data
18 |
19 | ./plot_calibration_data.py mag_calibration_d_m_y_H_M_S
20 |
21 | If you have any questions or comments, please shoot me at email at gamboa at cim dot mcgill dot ca
22 |
--------------------------------------------------------------------------------
/data/last_mag_calibration:
--------------------------------------------------------------------------------
1 | cnumpy.core.multiarray
2 | _reconstruct
3 | p0
4 | (cnumpy.matrixlib.defmatrix
5 | matrix
6 | p1
7 | (I0
8 | tp2
9 | S'b'
10 | p3
11 | tp4
12 | Rp5
13 | (I1
14 | (I3
15 | I1
16 | tp6
17 | cnumpy
18 | dtype
19 | p7
20 | (S'f8'
21 | p8
22 | I0
23 | I1
24 | tp9
25 | Rp10
26 | (I3
27 | S'<'
28 | p11
29 | NNNI-1
30 | I-1
31 | I0
32 | tp12
33 | bI00
34 | S'x,\xec+!\x03\xe1\xbf\x80u\xa99R\xd0\xd3\xbfP\xbf,S\xa6\xbe\xe6?'
35 | p13
36 | tp14
37 | b.cnumpy.core.multiarray
38 | _reconstruct
39 | p0
40 | (cnumpy
41 | ndarray
42 | p1
43 | (I0
44 | tp2
45 | S'b'
46 | p3
47 | tp4
48 | Rp5
49 | (I1
50 | (I3
51 | I3
52 | tp6
53 | cnumpy
54 | dtype
55 | p7
56 | (S'f8'
57 | p8
58 | I0
59 | I1
60 | tp9
61 | Rp10
62 | (I3
63 | S'<'
64 | p11
65 | NNNI-1
66 | I-1
67 | I0
68 | tp12
69 | bI00
70 | S'\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf0?'
71 | p13
72 | tp14
73 | b.cnumpy.core.multiarray
74 | _reconstruct
75 | p0
76 | (cnumpy.matrixlib.defmatrix
77 | matrix
78 | p1
79 | (I0
80 | tp2
81 | S'b'
82 | p3
83 | tp4
84 | Rp5
85 | (I1
86 | (I485
87 | I3
88 | tp6
89 | cnumpy
90 | dtype
91 | p7
92 | (S'f8'
93 | p8
94 | I0
95 | I1
96 | tp9
97 | Rp10
98 | (I3
99 | S'<'
100 | p11
101 | NNNI-1
102 | I-1
103 | I0
104 | tp12
105 | bI00
106 | S'5\xad\x1cs\x01\xdc\xce\xbf\xf9\xe2g0\x01P\xd9\xbf/R\x9f\x19\x01k\xe7?#\x02Ww\x016\xcf\xbfp\r\x852\x01}\xd9\xbf/R\x9f\x19\x01k\xe7?\xff\xab\xcb\x7f\x01\xea\xcf\xbf^b\xbf6\x01\xd7\xd9\xbf/R\x9f\x19\x01k\xe7?\xee* \xc4\x00O\xd0\xbf^b\xbf6\x01\xd7\xd9\xbf\xf3\xbc\x90\x18\x81T\xe7?\xff\xab\xcb\x7f\x01\xea\xcf\xbf\xc4\xe1\x16=\x01^\xda\xbf\xf3\xbc\x90\x18\x81T\xe7?w\x00\x03\xc2\x00"\xd0\xbf\xff?2C\x01\xe0\xda\xbf\xb8\'\x82\x17\x01>\xe7?\xff\xab\xcb\x7f\x01\xea\xcf\xbf\xed\x94lG\x01:\xdb\xbf\x05hV\x14\x81\xfa\xe6?w\x00\x03\xc2\x00"\xd0\xbfd\xbf\x89I\x01g\xdb\xbf\xca\xd2G\x13\x01\xe4\xe6?w\x00\x03\xc2\x00"\xd0\xbf\x8er\xdfS\x01C\xdc\xbf\xe7\xb8H\x11\x81\xb9\xe6?\xb2^\x1e\xc8\x00\xa4\xd0\xbf|\xc7\x19X\x01\x9d\xdc\xbf\x8e=9\x12\x81\xcd\xe6?\xee* \xc4\x00O\xd0\xbfj\x1cT\\\x01\xf7\xdc\xbf\xac#:\x10\x01\xa3\xe6?\xb2^\x1e\xc8\x00\xa4\xd0\xbf\xe1Fq^\x01$\xdd\xbfp\x8e+\x0f\x81\x8c\xe6?\xee* \xc4\x00O\xd0\xbf\xcf\x9b\xabb\x01~\xdd\xbf\xbe\xce\xff\x0b\x01I\xe6?eU=\xc6\x00|\xd0\xbf\xe1Fq^\x01$\xdd\xbf\xbe\xce\xff\x0b\x01I\xe6?)\x89;\xca\x00\xd1\xd0\xbf\xcf\x9b\xabb\x01~\xdd\xbf\xbe\xce\xff\x0b\x01I\xe6?\x8e\x08\x93\xd0\x00X\xd1\xbfG\xc6\xc8d\x01\xab\xdd\xbfG\xa4\xe2\t\x01\x1c\xe6?\xa0\xb3X\xcc\x00\xfe\xd0\xbf\x94\xcf\xa9f\x01\xd3\xdd\xbf\xed_\xc6\x05\x81\xc4\xe5?\xa0\xb3X\xcc\x00\xfe\xd0\xbf\x94\xcf\xa9f\x01\xd3\xdd\xbf\xa0\x1f\xf2\x08\x01\x08\xe6?|]\xcd\xd4\x00\xb2\xd1\xbfXq\x8e`\x01Q\xdd\xbf\xed_\xc6\x05\x81\xc4\xe5?|]\xcd\xd4\x00\xb2\xd1\xbf\xcf\x9b\xabb\x01~\xdd\xbf\xb2\xca\xb7\x04\x01\xae\xe5?\xf4\x87\xea\xd6\x00\xdf\xd1\xbf\xe1Fq^\x01$\xdd\xbfv5\xa9\x03\x81\x97\xe5?k\xb2\x07\xd9\x00\x0c\xd2\xbfj\x1cT\\\x01\xf7\xdc\xbf\xb2\xca\xb7\x04\x01\xae\xe5?\x1d;@\xe1\x00\xbb\xd2\xbf|\xc7\x19X\x01\x9d\xdc\xbf\xed_\xc6\x05\x81\xc4\xe5?/\xe6\x05\xdd\x00a\xd2\xbf\x8er\xdfS\x01C\xdc\xbf)\xf5\xd4\x06\x01\xdb\xe5?\x1d;@\xe1\x00\xbb\xd2\xbfAi\xfeQ\x01\x1b\xdc\xbf\xb2\xca\xb7\x04\x01\xae\xe5?\x94e]\xe3\x00\xe8\xd2\xbf\xca>\xe1O\x01\xee\xdb\xbf\xb2\xca\xb7\x04\x01\xae\xe5?/\xe6\x05\xdd\x00a\xd2\xbf\xdb\xe9\xa6K\x01\x94\xdb\xbf;\xa0\x9a\x02\x01\x81\xe5?\xa6\x10#\xdf\x00\x8e\xd2\xbfd\xbf\x89I\x01g\xdb\xbf\xb2\xca\xb7\x04\x01\xae\xe5?\xa6\x10#\xdf\x00\x8e\xd2\xbf\xdb\xe9\xa6K\x01\x94\xdb\xbfv5\xa9\x03\x81\x97\xe5?\x1d;@\xe1\x00\xbb\xd2\xbf\xdb\xe9\xa6K\x01\x94\xdb\xbf;\xa0\x9a\x02\x01\x81\xe5?\x0b\x90z\xe5\x00\x15\xd3\xbf\xdb\xe9\xa6K\x01\x94\xdb\xbf\xff\n\x8c\x01\x81j\xe5?\x1d;@\xe1\x00\xbb\xd2\xbfAi\xfeQ\x01\x1b\xdc\xbf\xff\n\x8c\x01\x81j\xe5?/\xe6\x05\xdd\x00a\xd2\xbf\x8er\xdfS\x01C\xdc\xbf\xff\n\x8c\x01\x81j\xe5?/\xe6\x05\xdd\x00a\xd2\xbf|\xc7\x19X\x01\x9d\xdc\xbf;\xa0\x9a\x02\x01\x81\xe5?\xa6\x10#\xdf\x00\x8e\xd2\xbf\xf3\xf16Z\x01\xca\xdc\xbf\xff\n\x8c\x01\x81j\xe5?k\xb2\x07\xd9\x00\x0c\xd2\xbfj\x1cT\\\x01\xf7\xdc\xbf\x1d\xf1\x8c\xff\x00@\xe5?\xb8\xbb\xe8\xda\x004\xd2\xbfG\xc6\xc8d\x01\xab\xdd\xbfk1a\xfc\x80\xfc\xe4?k\xb2\x07\xd9\x00\x0c\xd2\xbf\x0b\xfa\xc6h\x01\x00\xde\xbf\xa6\xc6o\xfd\x00\x13\xe5?k\xb2\x07\xd9\x00\x0c\xd2\xbf\xe7\xa3;q\x01\xb4\xde\xbfk1a\xfc\x80\xfc\xe4?\xf4\x87\xea\xd6\x00\xdf\xd1\xbf\xd5\xf8uu\x01\x0e\xdf\xbf/\x9cR\xfb\x00\xe6\xe4?\xb8\xbb\xe8\xda\x004\xd2\xbf#\x02Ww\x016\xdf\xbf\xa6\xc6o\xfd\x00\x13\xe5?k\xb2\x07\xd9\x00\x0c\xd2\xbf\x9a,ty\x01c\xdf\xbf/\x9cR\xfb\x00\xe6\xe4?\xf4\x87\xea\xd6\x00\xdf\xd1\xbf#\x02Ww\x016\xdf\xbf\xf3\x06D\xfa\x80\xcf\xe4?\xf4\x87\xea\xd6\x00\xdf\xd1\xbf\xd5\xf8uu\x01\x0e\xdf\xbf/\x9cR\xfb\x00\xe6\xe4?\x8e\x08\x93\xd0\x00X\xd1\xbf\x0b\xfa\xc6h\x01\x00\xde\xbf/\x9cR\xfb\x00\xe6\xe4?\x053\xb0\xd2\x00\x85\xd1\xbfXq\x8e`\x01Q\xdd\xbf\x1d\xf1\x8c\xff\x00@\xe5?\x053\xb0\xd2\x00\x85\xd1\xbf\xf3\xf16Z\x01\xca\xdc\xbf\xe2[~\xfe\x80)\xe5?\x8e\x08\x93\xd0\x00X\xd1\xbf\xed\x94lG\x01:\xdb\xbf;\xa0\x9a\x02\x01\x81\xe5?\x053\xb0\xd2\x00\x85\xd1\xbf\xb26QA\x01\xb8\xda\xbfv5\xa9\x03\x81\x97\xe5?eU=\xc6\x00|\xd0\xbf\xf9\xe2g0\x01P\xd9\xbf\xb2\xca\xb7\x04\x01\xae\xe5?eU=\xc6\x00|\xd0\xbfY\x05\xf5#\x01G\xd8\xbfe\x8a\xe3\x07\x81\xf1\xe5?eU=\xc6\x00|\xd0\xbf\xca\xd2G\x13\x01\xe4\xd6\xbf)\xf5\xd4\x06\x01\xdb\xe5?\xee* \xc4\x00O\xd0\xbf\xdc}\r\x0f\x01\x8a\xd6\xbf\xa0\x1f\xf2\x08\x01\x08\xe6?\xee* \xc4\x00O\xd0\xbf\xa0\x1f\xf2\x08\x01\x08\xd6\xbfe\x8a\xe3\x07\x81\xf1\xe5?\xff\xab\xcb\x7f\x01\xea\xcf\xbf)\xf5\xd4\x06\x01\xdb\xd5\xbf\xa0\x1f\xf2\x08\x01\x08\xe6?\xff\xab\xcb\x7f\x01\xea\xcf\xbf\xb2\xca\xb7\x04\x01\xae\xd5\xbf\xa0\x1f\xf2\x08\x01\x08\xe6?\x11W\x91{\x01\x90\xcf\xbf\xb2\xca\xb7\x04\x01\xae\xd5\xbfG\xa4\xe2\t\x01\x1c\xe6?\xff\xab\xcb\x7f\x01\xea\xcf\xbf\xa0\x1f\xf2\x08\x01\x08\xd6\xbfG\xa4\xe2\t\x01\x1c\xe6?\xee* \xc4\x00O\xd0\xbf\xa0\x1f\xf2\x08\x01\x08\xd6\xbf\x829\xf1\n\x812\xe6?\xee* \xc4\x00O\xd0\xbf)\xf5\xd4\x06\x01\xdb\xd5\xbfG\xa4\xe2\t\x01\x1c\xe6?\xff\xab\xcb\x7f\x01\xea\xcf\xbf\x8et,\r\x01b\xd6\xbf\xbe\xce\xff\x0b\x01I\xe6?\xff\xab\xcb\x7f\x01\xea\xcf\xbf)\xf5\xd4\x06\x01\xdb\xd5\xbf\xbe\xce\xff\x0b\x01I\xe6?\x11W\x91{\x01\x90\xcf\xbf)\xf5\xd4\x06\x01\xdb\xd5\xbf\xbe\xce\xff\x0b\x01I\xe6?#\x02Ww\x016\xcf\xbf\xc4u}\x00\x01T\xd5\xbf\x829\xf1\n\x812\xe6?#\x02Ww\x016\xcf\xbf\x88\x17b\xfa\x00\xd2\xd4\xbf\x829\xf1\n\x812\xe6?5\xad\x1cs\x01\xdc\xce\xbf\x9a\xc2\'\xf6\x00x\xd4\xbfp\x8e+\x0f\x81\x8c\xe6?GX\xe2n\x01\x82\xce\xbf\xacm\xed\xf1\x00\x1e\xd4\xbf5\xf9\x1c\x0e\x01v\xe6?GX\xe2n\x01\x82\xce\xbf5C\xd0\xef\x00\xf1\xd3\xbf\xac#:\x10\x01\xa3\xe6?\xacE k\x012\xce\xbf\xbe\x18\xb3\xed\x00\xc4\xd3\xbfp\x8e+\x0f\x81\x8c\xe6?GX\xe2n\x01\x82\xce\xbf\xf9\xe4\xb4\xe9\x00o\xd3\xbfp\x8e+\x0f\x81\x8c\xe6?#\x02Ww\x016\xcf\xbf\xf9\xe4\xb4\xe9\x00o\xd3\xbf\xe7\xb8H\x11\x81\xb9\xe6?\xff\xab\xcb\x7f\x01\xea\xcf\xbf\x0b\x90z\xe5\x00\x15\xd3\xbf\xe7\xb8H\x11\x81\xb9\xe6?#\x02Ww\x016\xcf\xbf\xa6\x10#\xdf\x00\x8e\xd2\xbf\xca\xd2G\x13\x01\xe4\xe6?\x11W\x91{\x01\x90\xcf\xbf\x94e]\xe3\x00\xe8\xd2\xbf\xe7\xb8H\x11\x81\xb9\xe6?5\xad\x1cs\x01\xdc\xce\xbf/\xe6\x05\xdd\x00a\xd2\xbf\xe7\xb8H\x11\x81\xb9\xe6?GX\xe2n\x01\x82\xce\xbf/\xe6\x05\xdd\x00a\xd2\xbf\x8e=9\x12\x81\xcd\xe6?GX\xe2n\x01\x82\xce\xbf\xf4\x87\xea\xd6\x00\xdf\xd1\xbf\x8e=9\x12\x81\xcd\xe6?5\xad\x1cs\x01\xdc\xce\xbf\x17\xdeu\xce\x00+\xd1\xbf\xca\xd2G\x13\x01\xe4\xe6?GX\xe2n\x01\x82\xce\xbf\xee* \xc4\x00O\xd0\xbf\xca\xd2G\x13\x01\xe4\xe6?5\xad\x1cs\x01\xdc\xce\xbfGX\xe2n\x01\x82\xce\xbf|\x92s\x16\x81\'\xe7?5\xad\x1cs\x01\xdc\xce\xbf\xe1Fq^\x01$\xcd\xbfA\xfdd\x15\x01\x11\xe7?5\xad\x1cs\x01\xdc\xce\xbf\xa0\x8b\x8bE\x01\x12\xcb\xbf|\x92s\x16\x81\'\xe7?\xacE k\x012\xce\xbf\xc4\xe1\x16=\x01^\xca\xbf|\x92s\x16\x81\'\xe7?\xff\xab\xcb\x7f\x01\xea\xcf\xbf\x0b\x8e-,\x01\xf6\xc8\xbf\xf3\xbc\x90\x18\x81T\xe7?\x11W\x91{\x01\x90\xcf\xbf\xb8\'\x82\x17\x01>\xc7\xbf\xb8\'\x82\x17\x01>\xe7?\xff\xab\xcb\x7f\x01\xea\xcf\xbf\xca\xd2G\x13\x01\xe4\xc6\xbf\xf3\xbc\x90\x18\x81T\xe7?eU=\xc6\x00|\xd0\xbf\xca\xd2G\x13\x01\xe4\xc6\xbf\xf3\xbc\x90\x18\x81T\xe7?\xee* \xc4\x00O\xd0\xbf\xdc}\r\x0f\x01\x8a\xc6\xbfj\xe7\xad\x1a\x81\x81\xe7?\xff\xab\xcb\x7f\x01\xea\xcf\xbf\xed(\xd3\n\x010\xc6\xbfj\xe7\xad\x1a\x81\x81\xe7?eU=\xc6\x00|\xd0\xbf\xed(\xd3\n\x010\xc6\xbfj\xe7\xad\x1a\x81\x81\xe7?\xb2^\x1e\xc8\x00\xa4\xd0\xbfe\xc1\xd6\x02\x01\x86\xc5\xbf\x11l\x9e\x1b\x81\x95\xe7?\xa0\xb3X\xcc\x00\xfe\xd0\xbf\x88\x17b\xfa\x00\xd2\xc4\xbfM\x01\xad\x1c\x01\xac\xe7?\x17\xdeu\xce\x00+\xd1\xbf\x9a\xc2\'\xf6\x00x\xc4\xbfM\x01\xad\x1c\x01\xac\xe7?\x17\xdeu\xce\x00+\xd1\xbf\xd0\xc3x\xe9\x00j\xc3\xbfM\x01\xad\x1c\x01\xac\xe7?\x8e\x08\x93\xd0\x00X\xd1\xbfG\\|\xe1\x00\xc0\xc2\xbf\x88\x96\xbb\x1d\x81\xc2\xe7?\x053\xb0\xd2\x00\x85\xd1\xbfY\x07B\xdd\x00f\xc2\xbf\x88\x96\xbb\x1d\x81\xc2\xe7?\xf4\x87\xea\xd6\x00\xdf\xd1\xbf|]\xcd\xd4\x00\xb2\xc1\xbf\xff\xc0\xd8\x1f\x81\xef\xe7?k\xb2\x07\xd9\x00\x0c\xd2\xbf\x8e\x08\x93\xd0\x00X\xc1\xbfv\xeb\xf5!\x81\x1c\xe8?/\xe6\x05\xdd\x00a\xd2\xbf\xc4\t\xe4\xc3\x00J\xc0\xbf\xc4+\xca\x1e\x01\xd9\xe7?\xa6\x10#\xdf\x00\x8e\xd2\xbf\xc4\t\xe4\xc3\x00J\xc0\xbf\xff\xc0\xd8\x1f\x81\xef\xe7?\xa6\x10#\xdf\x00\x8e\xd2\xbfvD\xcfw\x01@\xbf\xbf;V\xe7 \x01\x06\xe8?\xa6\x10#\xdf\x00\x8e\xd2\xbf\x9a\x9aZo\x01\x8c\xbe\xbf;V\xe7 \x01\x06\xe8?\x1d;@\xe1\x00\xbb\xd2\xbf\x9a\x9aZo\x01\x8c\xbe\xbf;V\xe7 \x01\x06\xe8?\x0b\x90z\xe5\x00\x15\xd3\xbf\x05\x9d\xfcU\x01p\xbc\xbf;V\xe7 \x01\x06\xe8?\x82\xba\x97\xe7\x00B\xd3\xbfMI\x13E\x01\x08\xbb\xbf\xb2\x80\x04#\x013\xe8?\xf9\xe4\xb4\xe9\x00o\xd3\xbfMI\x13E\x01\x08\xbb\xbfv\xeb\xf5!\x81\x1c\xe8?\x82\xba\x97\xe7\x00B\xd3\xbf;z\x1a5\x01\xb4\xb9\xbfv\xeb\xf5!\x81\x1c\xe8?\xacm\xed\xf1\x00\x1e\xd4\xbf\xca\xd2G\x13\x01\xe4\xb6\xbfv\xeb\xf5!\x81\x1c\xe8?\x9a\xc2\'\xf6\x00x\xd4\xbf\xed(\xd3\n\x010\xb6\xbfY\x05\xf5#\x01G\xe8?\xd6 C\xfc\x00\xfa\xd4\xbf\x11\x7f^\x02\x01|\xb5\xbfY\x05\xf5#\x01G\xe8?\xc4u}\x00\x01T\xd5\xbf5\xd5\xe9\xf9\x00\xc8\xb4\xbfY\x05\xf5#\x01G\xe8?)\xf5\xd4\x06\x01\xdb\xd5\xbf\xca\xd2G\x13\x01\xe4\xb6\xbf\x94\x9a\x03%\x81]\xe8?\xb2\xca\xb7\x04\x01\xae\xd5\xbf\x11\x7f^\x02\x01|\xb5\xbf\x94\x9a\x03%\x81]\xe8?;\xa0\x9a\x02\x01\x81\xd5\xbf\xff\xafe\xf2\x00(\xb4\xbfY\x05\xf5#\x01G\xe8?\xb2\xca\xb7\x04\x01\xae\xd5\xbf\xff\xafe\xf2\x00(\xb4\xbf\xd0/\x12&\x01t\xe8?\xa0\x1f\xf2\x08\x01\x08\xd6\xbfG\\|\xe1\x00\xc0\xb2\xbf\x0b\xc5 \'\x81\x8a\xe8?\xca\xd2G\x13\x01\xe4\xd6\xbfG\\|\xe1\x00\xc0\xb2\xbfGZ/(\x01\xa1\xe8?A\xfdd\x15\x01\x11\xd7\xbf\xaciS\x7f\x01\xe0\xaf\xbf\xd0/\x12&\x01t\xe8?A\xfdd\x15\x01\x11\xd7\xbf;\xc2\x80]\x01\x10\xad\xbf\x94\x9a\x03%\x81]\xe8?\xa6|\xbc\x1b\x01\x98\xd7\xbf\x17$\x8f=\x01h\xaa\xbf\x0b\xc5 \'\x81\x8a\xe8?Y\x05\xf5#\x01G\xd8\xbf|\x81\x00\xe9\x00`\xa3\xbfGZ/(\x01\xa1\xe8?\xbe\x84L*\x01\xce\xd8\xbf|\x81\x00\xe9\x00`\xa3\xbfGZ/(\x01\xa1\xe8?\xe77\xa24\x01\xaa\xd9\xbf\xc4-\x17\xd8\x00\xf8\xa1\xbfGZ/(\x01\xa1\xe8?M\xb7\xf9:\x011\xda\xbf|\x81\x00\xe9\x00`\xa3\xbf\x0b\xc5 \'\x81\x8a\xe8?\xb26QA\x01\xb8\xda\xbf5\xd5\xe9\xf9\x00\xc8\xa4\xbf\x82\xef=)\x81\xb7\xe8?\xff?2C\x01\xe0\xda\xbf|\x81\x00\xe9\x00`\xa3\xbf\xbe\x84L*\x01\xce\xe8?vjOE\x01\r\xdb\xbf|\x81\x00\xe9\x00`\xa3\xbf\x82\xef=)\x81\xb7\xe8?\xed\x94lG\x01:\xdb\xbf\xed(\xd3\n\x010\xa6\xbfGZ/(\x01\xa1\xe8?d\xbf\x89I\x01g\xdb\xbfY\xe3\x0e\xc9\x00\xb8\xa0\xbf\x82\xef=)\x81\xb7\xe8?Ai\xfeQ\x01\x1b\xdc\xbfY\xe3\x0e\xc9\x00\xb8\xa0\xbf\x82\xef=)\x81\xb7\xe8?\x8er\xdfS\x01C\xdc\xbfY\xe3\x0e\xc9\x00\xb8\xa0\xbf\xbe\x84L*\x01\xce\xe8?\xf3\xf16Z\x01\xca\xdc\xbf\xd0wxN\x01\xd0\x9b\xbf\xf9\x19[+\x81\xe4\xe8?j\x1cT\\\x01\xf7\xdc\xbf\xd0wxN\x01\xd0\x9b\xbf\xf9\x19[+\x81\xe4\xe8?\xcf\x9b\xabb\x01~\xdd\xbf^\xd0\xa5,\x01\x00\x99\xbf\x82\xef=)\x81\xb7\xe8?\x0b\xfa\xc6h\x01\x00\xde\xbf\xed(\xd3\n\x010\x96\xbf\xbe\x84L*\x01\xce\xe8?\xd5\xf8uu\x01\x0e\xdf\xbf\xd0wxN\x01\xd0\x9b\xbf\xbe\x84L*\x01\xce\xe8?\x11W\x91{\x01\x90\xdf\xbfA\x1fKp\x01\xa0\x9e\xbf\xf9\x19[+\x81\xe4\xe8?\xff\xab\xcb\x7f\x01\xea\xdf\xbfA\x1fKp\x01\xa0\x9e\xbf\x82\xef=)\x81\xb7\xe8?\xff\xab\xcb\x7f\x01\xea\xdf\xbfA\x1fKp\x01\xa0\x9e\xbf\xbe\x84L*\x01\xce\xe8?\xff\xab\xcb\x7f\x01\xea\xdf\xbfA\x1fKp\x01\xa0\x9e\xbf\xf9\x19[+\x81\xe4\xe8?w\x00\x03\xc2\x00"\xe0\xbfY\xe3\x0e\xc9\x00\xb8\xa0\xbf\xbe\x84L*\x01\xce\xe8?\x94\xaf\x10\xc5\x00c\xe0\xbfY\xe3\x0e\xc9\x00\xb8\xa0\xbf\xbe\x84L*\x01\xce\xe8?\x0b\xda-\xc7\x00\x90\xe0\xbf|\x81\x00\xe9\x00`\xa3\xbf\xbe\x84L*\x01\xce\xe8?\x82\x04K\xc9\x00\xbd\xe0\xbf5\xd5\xe9\xf9\x00\xc8\xa4\xbf\x82\xef=)\x81\xb7\xe8?5\xc4v\xcc\x80\x00\xe1\xbf\xa6|\xbc\x1b\x01\x98\xa7\xbf\xf9\x19[+\x81\xe4\xe8?\x8e\x08\x93\xd0\x00X\xe1\xbf\xd0wxN\x01\xd0\xab\xbf\xbe\x84L*\x01\xce\xe8?\x053\xb0\xd2\x00\x85\xe1\xbf\xf3\x15jn\x01x\xae\xbf\xbe\x84L*\x01\xce\xe8?|]\xcd\xd4\x00\xb2\xe1\xbf\xaciS\x7f\x01\xe0\xaf\xbf\x82\xef=)\x81\xb7\xe8?\x9a\x0c\xdb\xd7\x00\xf3\xe1\xbf\xb2^\x1e\xc8\x00\xa4\xb0\xbf\xbe\x84L*\x01\xce\xe8?\x117\xf8\xd9\x00 \xe2\xbf\xaciS\x7f\x01\xe0\xaf\xbf\xf9\x19[+\x81\xe4\xe8?M\xcc\x06\xdb\x806\xe2\xbf;\xc2\x80]\x01\x10\xad\xbf\x82\xef=)\x81\xb7\xe8?\x88a\x15\xdc\x00M\xe2\xbf^\xd0\xa5,\x01\x00\xa9\xbf\x82\xef=)\x81\xb7\xe8?\x88a\x15\xdc\x00M\xe2\xbf\xc4-\x17\xd8\x00\xf8\xa1\xbf\x0b\xc5 \'\x81\x8a\xe8?\xc4\xf6#\xdd\x80c\xe2\xbfY\xe3\x0e\xc9\x00\xb8\xa0\xbf\xd0/\x12&\x01t\xe8?\xc4\xf6#\xdd\x80c\xe2\xbf|\x81\x00\xe9\x00`\x93\xbf\x0b\xc5 \'\x81\x8a\xe8?Y\xd0N\xe2\x80\xd1\xe2\xbf\xed(\xd3\n\x010\x96\xbf\xd0/\x12&\x01t\xe8?\x0b\x90z\xe5\x00\x15\xe3\xbf5e\xb6J\x01\x80\x8b\xbf\x94\x9a\x03%\x81]\xe8?\xee\xa9y\xe7\x80?\xe3\xbf|\x81\x00\xe9\x00`\x93\xbf\x94\x9a\x03%\x81]\xe8?\xa0i\xa5\xea\x00\x83\xe3\xbf\xed(\xd3\n\x010\x96\xbf\xd0/\x12&\x01t\xe8?\xdc\xfe\xb3\xeb\x80\x99\xe3\xbf\xd0wxN\x01\xd0\x9b\xbf\xd0/\x12&\x01t\xe8?\x8e\xbe\xdf\xee\x00\xdd\xe3\xbfA\x1fKp\x01\xa0\x9e\xbfY\x05\xf5#\x01G\xe8?5C\xd0\xef\x00\xf1\xe3\xbf|\x81\x00\xe9\x00`\xa3\xbf\xd0/\x12&\x01t\xe8?5C\xd0\xef\x00\xf1\xe3\xbf\xed(\xd3\n\x010\xa6\xbfY\x05\xf5#\x01G\xe8?5C\xd0\xef\x00\xf1\xe3\xbf\xc4-\x17\xd8\x00\xf8\xa1\xbf\x94\x9a\x03%\x81]\xe8?q\xd8\xde\xf0\x80\x07\xe4\xbf5\xd5\xe9\xf9\x00\xc8\xa4\xbfY\x05\xf5#\x01G\xe8?#\x98\n\xf4\x00K\xe4\xbfY\xe3\x0e\xc9\x00\xb8\xa0\xbf\xd0/\x12&\x01t\xe8?\x9a\xc2\'\xf6\x00x\xe4\xbfA\x1fKp\x01\xa0\x9e\xbfY\x05\xf5#\x01G\xe8?\xf3\x06D\xfa\x80\xcf\xe4\xbf\xc4-\x17\xd8\x00\xf8\xa1\xbf\xb2\x80\x04#\x013\xe8?\xa6\xc6o\xfd\x00\x13\xe5\xbf5\xd5\xe9\xf9\x00\xc8\xa4\xbfv\xeb\xf5!\x81\x1c\xe8?Y\x86\x9b\x00\x81V\xe5\xbf5\xd5\xe9\xf9\x00\xc8\xa4\xbf\xb2\x80\x04#\x013\xe8?\xe2[~\xfe\x80)\xe5\xbf;\xc2\x80]\x01\x10\xad\xbf\x94\x9a\x03%\x81]\xe8?;\xa0\x9a\x02\x01\x81\xe5\xbfG\\|\xe1\x00\xc0\xb2\xbf\x94\x9a\x03%\x81]\xe8?;\xa0\x9a\x02\x01\x81\xe5\xbf\xed(\xd3\n\x010\xb6\xbf\xb2\x80\x04#\x013\xe8?)\xf5\xd4\x06\x01\xdb\xe5\xbfp\x9f\x9e<\x01T\xba\xbf\xd0/\x12&\x01t\xe8?e\x8a\xe3\x07\x81\xf1\xe5\xbf\x05\x9d\xfcU\x01p\xbc\xbfY\x05\xf5#\x01G\xe8?G\xa4\xe2\t\x01\x1c\xe6\xbf\x9a\x9aZo\x01\x8c\xbe\xbfY\x05\xf5#\x01G\xe8?G\xa4\xe2\t\x01\x1c\xe6\xbf\xaciS\x7f\x01\xe0\xbf\xbf\x94\x9a\x03%\x81]\xe8?e\x8a\xe3\x07\x81\xf1\xe5\xbf\x9a\x9aZo\x01\x8c\xbe\xbf\xb2\x80\x04#\x013\xe8?\x829\xf1\n\x812\xe6\xbf\xaciS\x7f\x01\xe0\xbf\xbfY\x05\xf5#\x01G\xe8?\xf9c\x0e\r\x81_\xe6\xbf\xbe\xf0\xe5f\x01\xd8\xbd\xbf\x94\x9a\x03%\x81]\xe8?\xac#:\x10\x01\xa3\xe6\xbf\xaciS\x7f\x01\xe0\xbf\xbf;V\xe7 \x01\x06\xe8?\xe7\xb8H\x11\x81\xb9\xe6\xbf\xa0\xb3X\xcc\x00\xfe\xc0\xbf\xb2\x80\x04#\x013\xe8?A\xfdd\x15\x01\x11\xe7\xbf\xa0\xb3X\xcc\x00\xfe\xc0\xbfv\xeb\xf5!\x81\x1c\xe8?|\x92s\x16\x81\'\xe7\xbfk\xb2\x07\xd9\x00\x0c\xc2\xbfv\xeb\xf5!\x81\x1c\xe8?\xca\xd2G\x13\x01\xe4\xe6\xbf\xd0\xc3x\xe9\x00j\xc3\xbf;V\xe7 \x01\x06\xe8?\xb8\'\x82\x17\x01>\xe7\xbfvl\x9c\xfe\x00,\xc5\xbf\xff\xc0\xd8\x1f\x81\xef\xe7?\xf3\xbc\x90\x18\x81T\xe7\xbf\xed(\xd3\n\x010\xc6\xbf;V\xe7 \x01\x06\xe8?/R\x9f\x19\x01k\xe7\xbf\xca\xd2G\x13\x01\xe4\xc6\xbfv\xeb\xf5!\x81\x1c\xe8?M\x01\xad\x1c\x01\xac\xe7\xbf\xb8\'\x82\x17\x01>\xc7\xbf;V\xe7 \x01\x06\xe8?\x88\x96\xbb\x1d\x81\xc2\xe7\xbf\x94\xd1\xf6\x1f\x01\xf2\xc7\xbf\xff\xc0\xd8\x1f\x81\xef\xe7?M\x01\xad\x1c\x01\xac\xe7\xbf\x82&1$\x01L\xc8\xbf\x88\x96\xbb\x1d\x81\xc2\xe7?\x11l\x9e\x1b\x81\x95\xe7\xbf\x82&1$\x01L\xc8\xbf\x88\x96\xbb\x1d\x81\xc2\xe7?\x11l\x9e\x1b\x81\x95\xe7\xbf\x82&1$\x01L\xc8\xbf\x88\x96\xbb\x1d\x81\xc2\xe7?M\x01\xad\x1c\x01\xac\xe7\xbf\x82&1$\x01L\xc8\xbf\xc4+\xca\x1e\x01\xd9\xe7?\xc4+\xca\x1e\x01\xd9\xe7\xbf\x0b\x8e-,\x01\xf6\xc8\xbf\x88\x96\xbb\x1d\x81\xc2\xe7?\xff\xc0\xd8\x1f\x81\xef\xe7\xbf\xe77\xa24\x01\xaa\xc9\xbf\x88\x96\xbb\x1d\x81\xc2\xe7?Y\x05\xf5#\x01G\xe8\xbf\xc4\xe1\x16=\x01^\xca\xbfM\x01\xad\x1c\x01\xac\xe7?v\xeb\xf5!\x81\x1c\xe8\xbf\x8e\xe0\xc5I\x01l\xcb\xbf\x11l\x9e\x1b\x81\x95\xe7?;V\xe7 \x01\x06\xe8\xbf\x05\x9d\xfcU\x01p\xcc\xbf\x11l\x9e\x1b\x81\x95\xe7?Y\x05\xf5#\x01G\xe8\xbf\xcf\x9b\xabb\x01~\xcd\xbfj\xe7\xad\x1a\x81\x81\xe7?Y\x05\xf5#\x01G\xe8\xbfGX\xe2n\x01\x82\xce\xbfj\xe7\xad\x1a\x81\x81\xe7?\x94\x9a\x03%\x81]\xe8\xbf#\x02Ww\x016\xcf\xbf/R\x9f\x19\x01k\xe7?\xd0/\x12&\x01t\xe8\xbfw\x00\x03\xc2\x00"\xd0\xbf\xb8\'\x82\x17\x01>\xe7?\x82\xef=)\x81\xb7\xe8\xbf)\x89;\xca\x00\xd1\xd0\xbf\xb8\'\x82\x17\x01>\xe7?\xbe\x84L*\x01\xce\xe8\xbf\x053\xb0\xd2\x00\x85\xd1\xbf|\x92s\x16\x81\'\xe7?\xf9\x19[+\x81\xe4\xe8\xbf/\xe6\x05\xdd\x00a\xd2\xbfA\xfdd\x15\x01\x11\xe7?\x82\xef=)\x81\xb7\xe8\xbf\xa6\x10#\xdf\x00\x8e\xd2\xbfA\xfdd\x15\x01\x11\xe7?GZ/(\x01\xa1\xe8\xbf\xf9\xe4\xb4\xe9\x00o\xd3\xbfA\xfdd\x15\x01\x11\xe7?\x82\xef=)\x81\xb7\xe8\xbfG\xee\x95\xeb\x00\x97\xd3\xbf\x05hV\x14\x81\xfa\xe6?\x82\xef=)\x81\xb7\xe8\xbf\xacm\xed\xf1\x00\x1e\xd4\xbf\x05hV\x14\x81\xfa\xe6?\x82\xef=)\x81\xb7\xe8\xbf\xbe\x18\xb3\xed\x00\xc4\xd3\xbf\x05hV\x14\x81\xfa\xe6?\xbe\x84L*\x01\xce\xe8\xbf\xbe\x18\xb3\xed\x00\xc4\xd3\xbf\xca\xd2G\x13\x01\xe4\xe6?\x82\xef=)\x81\xb7\xe8\xbf\xacm\xed\xf1\x00\x1e\xd4\xbf\x8e=9\x12\x81\xcd\xe6?\xf9\x19[+\x81\xe4\xe8\xbf\xbe\x18\xb3\xed\x00\xc4\xd3\xbf\x8e=9\x12\x81\xcd\xe6?\xbe\x84L*\x01\xce\xe8\xbf5C\xd0\xef\x00\xf1\xd3\xbf\x8e=9\x12\x81\xcd\xe6?\xa0\x9eK,\x81\xf8\xe8\xbf\xbe\x18\xb3\xed\x00\xc4\xd3\xbf\x8e=9\x12\x81\xcd\xe6?\xdc3Z-\x01\x0f\xe9\xbf\x11\xedD\xf8\x00\xa5\xd4\xbf\xe7\xb8H\x11\x81\xb9\xe6?\x8e\xf3\x850\x81R\xe9\xbf\x11\xedD\xf8\x00\xa5\xd4\xbf\xe7\xb8H\x11\x81\xb9\xe6?\x8e\xf3\x850\x81R\xe9\xbf\xd6 C\xfc\x00\xfa\xd4\xbfp\x8e+\x0f\x81\x8c\xe6?\xa0\x9eK,\x81\xf8\xe8\xbfMK`\xfe\x00\'\xd5\xbf\xac#:\x10\x01\xa3\xe6?\xdc3Z-\x01\x0f\xe9\xbf\xc4u}\x00\x01T\xd5\xbf\xac#:\x10\x01\xa3\xe6?\x17\xc9h.\x81%\xe9\xbfMK`\xfe\x00\'\xd5\xbf\xe7\xb8H\x11\x81\xb9\xe6?\x17\xc9h.\x81%\xe9\xbfMK`\xfe\x00\'\xd5\xbf\xe7\xb8H\x11\x81\xb9\xe6?\xa0\x9eK,\x81\xf8\xe8\xbfMK`\xfe\x00\'\xd5\xbfp\x8e+\x0f\x81\x8c\xe6?\xdc3Z-\x01\x0f\xe9\xbf\x88\x17b\xfa\x00\xd2\xd4\xbf\x8e=9\x12\x81\xcd\xe6?\xbe\x84L*\x01\xce\xe8\xbf\xc4u}\x00\x01T\xd5\xbfp\x8e+\x0f\x81\x8c\xe6?\xbe\x84L*\x01\xce\xe8\xbf\xc4u}\x00\x01T\xd5\xbf\xe7\xb8H\x11\x81\xb9\xe6?\x82\xef=)\x81\xb7\xe8\xbf\xb2\xca\xb7\x04\x01\xae\xd5\xbfp\x8e+\x0f\x81\x8c\xe6?\xf9\x19[+\x81\xe4\xe8\xbf\xa0\x1f\xf2\x08\x01\x08\xd6\xbfp\x8e+\x0f\x81\x8c\xe6?\xf9\x19[+\x81\xe4\xe8\xbfA\xfdd\x15\x01\x11\xd7\xbf\xf9c\x0e\r\x81_\xe6?\xa0\x9eK,\x81\xf8\xe8\xbf\xb8\'\x82\x17\x01>\xd7\xbfp\x8e+\x0f\x81\x8c\xe6?\xf9\x19[+\x81\xe4\xe8\xbf/R\x9f\x19\x01k\xd7\xbf5\xf9\x1c\x0e\x01v\xe6?\xf9\x19[+\x81\xe4\xe8\xbf\xd0/\x12&\x01t\xd8\xbfp\x8e+\x0f\x81\x8c\xe6?GZ/(\x01\xa1\xe8\xbf\xd0/\x12&\x01t\xd8\xbf\xf9c\x0e\r\x81_\xe6?\x0b\xc5 \'\x81\x8a\xe8\xbf\xbe\x84L*\x01\xce\xd8\xbf5\xf9\x1c\x0e\x01v\xe6?\xbe\x84L*\x01\xce\xe8\xbfGZ/(\x01\xa1\xd8\xbf\xf9c\x0e\r\x81_\xe6?\x82\xef=)\x81\xb7\xe8\xbfY\x05\xf5#\x01G\xd8\xbf\x829\xf1\n\x812\xe6?GZ/(\x01\xa1\xe8\xbf\xbe\x84L*\x01\xce\xd8\xbfG\xa4\xe2\t\x01\x1c\xe6?\x82\xef=)\x81\xb7\xe8\xbfY\x05\xf5#\x01G\xd8\xbf\xbe\xce\xff\x0b\x01I\xe6?GZ/(\x01\xa1\xe8\xbfY\x05\xf5#\x01G\xd8\xbf\xbe\xce\xff\x0b\x01I\xe6?GZ/(\x01\xa1\xe8\xbf5\xafi,\x01\xfb\xd8\xbf\xbe\xce\xff\x0b\x01I\xe6?\x0b\xc5 \'\x81\x8a\xe8\xbf5\xafi,\x01\xfb\xd8\xbfG\xa4\xe2\t\x01\x1c\xe6?\x94\x9a\x03%\x81]\xe8\xbfM\xb7\xf9:\x011\xda\xbfG\xa4\xe2\t\x01\x1c\xe6?\x0b\xc5 \'\x81\x8a\xe8\xbf\xd6\x8c\xdc8\x01\x04\xda\xbfG\xa4\xe2\t\x01\x1c\xe6?\xd0/\x12&\x01t\xe8\xbf\xff?2C\x01\xe0\xda\xbf\xa0\x1f\xf2\x08\x01\x08\xe6?\x94\x9a\x03%\x81]\xe8\xbfvjOE\x01\r\xdb\xbf\xa0\x1f\xf2\x08\x01\x08\xe6?v\xeb\xf5!\x81\x1c\xe8\xbf\xdb\xe9\xa6K\x01\x94\xdb\xbfG\xa4\xe2\t\x01\x1c\xe6?Y\x05\xf5#\x01G\xe8\xbfS\x14\xc4M\x01\xc1\xdb\xbf\xa0\x1f\xf2\x08\x01\x08\xe6?;V\xe7 \x01\x06\xe8\xbfAi\xfeQ\x01\x1b\xdc\xbfe\x8a\xe3\x07\x81\xf1\xe5?;V\xe7 \x01\x06\xe8\xbf\xdb\xe9\xa6K\x01\x94\xdb\xbf\xa0\x1f\xf2\x08\x01\x08\xe6?;V\xe7 \x01\x06\xe8\xbf\xdb\xe9\xa6K\x01\x94\xdb\xbf\xa0\x1f\xf2\x08\x01\x08\xe6?;V\xe7 \x01\x06\xe8\xbfS\x14\xc4M\x01\xc1\xdb\xbfe\x8a\xe3\x07\x81\xf1\xe5?;V\xe7 \x01\x06\xe8\xbf\xca>\xe1O\x01\xee\xdb\xbfe\x8a\xe3\x07\x81\xf1\xe5?\x88\x96\xbb\x1d\x81\xc2\xe7\xbfS\x14\xc4M\x01\xc1\xdb\xbfe\x8a\xe3\x07\x81\xf1\xe5?\xc4+\xca\x1e\x01\xd9\xe7\xbf\xca>\xe1O\x01\xee\xdb\xbf)\xf5\xd4\x06\x01\xdb\xe5?;V\xe7 \x01\x06\xe8\xbf\x05\x9d\xfcU\x01p\xdc\xbf\xb2\xca\xb7\x04\x01\xae\xe5?\xc4+\xca\x1e\x01\xd9\xe7\xbfj\x1cT\\\x01\xf7\xdc\xbf)\xf5\xd4\x06\x01\xdb\xe5?\x88\x96\xbb\x1d\x81\xc2\xe7\xbf\xe1Fq^\x01$\xdd\xbfv5\xa9\x03\x81\x97\xe5?M\x01\xad\x1c\x01\xac\xe7\xbf\x94\xcf\xa9f\x01\xd3\xdd\xbf;\xa0\x9a\x02\x01\x81\xe5?\x88\x96\xbb\x1d\x81\xc2\xe7\xbf^\xceXs\x01\xe1\xde\xbfv5\xa9\x03\x81\x97\xe5?\x88\x96\xbb\x1d\x81\xc2\xe7\xbf\x82$\xe4j\x01-\xde\xbfv5\xa9\x03\x81\x97\xe5?\x11l\x9e\x1b\x81\x95\xe7\xbf\xe7\xa3;q\x01\xb4\xde\xbf;\xa0\x9a\x02\x01\x81\xe5?/R\x9f\x19\x01k\xe7\xbfpy\x1eo\x01\x87\xde\xbf\xff\n\x8c\x01\x81j\xe5?\x11l\x9e\x1b\x81\x95\xe7\xbf\x82$\xe4j\x01-\xde\xbfv5\xa9\x03\x81\x97\xe5?/R\x9f\x19\x01k\xe7\xbf\x0b\xfa\xc6h\x01\x00\xde\xbf\xff\n\x8c\x01\x81j\xe5?\xf3\xbc\x90\x18\x81T\xe7\xbf\xe7\xa3;q\x01\xb4\xde\xbf;\xa0\x9a\x02\x01\x81\xe5?|\x92s\x16\x81\'\xe7\xbf\x0b\xfa\xc6h\x01\x00\xde\xbf\x1d\xf1\x8c\xff\x00@\xe5?\xb8\'\x82\x17\x01>\xe7\xbf^\xceXs\x01\xe1\xde\xbf\xff\n\x8c\x01\x81j\xe5?A\xfdd\x15\x01\x11\xe7\xbf^\xceXs\x01\xe1\xde\xbf\x1d\xf1\x8c\xff\x00@\xe5?A\xfdd\x15\x01\x11\xe7\xbf\x11W\x91{\x01\x90\xdf\xbfY\x86\x9b\x00\x81V\xe5?\xe7\xb8H\x11\x81\xb9\xe6\xbf\xff\xab\xcb\x7f\x01\xea\xdf\xbf\x1d\xf1\x8c\xff\x00@\xe5?\xca\xd2G\x13\x01\xe4\xe6\xbf\xb2\x95\x11\xc3\x808\xe0\xbfk1a\xfc\x80\xfc\xe4?\xe7\xb8H\x11\x81\xb9\xe6\xbf\xb2\x95\x11\xc3\x808\xe0\xbf\xe2[~\xfe\x80)\xe5?\xac#:\x10\x01\xa3\xe6\xbf\xd0D\x1f\xc6\x80y\xe0\xbf\xe2[~\xfe\x80)\xe5?\xac#:\x10\x01\xa3\xe6\xbf\x0b\xda-\xc7\x00\x90\xe0\xbfk1a\xfc\x80\xfc\xe4?\xac#:\x10\x01\xa3\xe6\xbf\x82\x04K\xc9\x00\xbd\xe0\xbf\xa6\xc6o\xfd\x00\x13\xe5?\xbe\xce\xff\x0b\x01I\xe6\xbf\x82\x04K\xc9\x00\xbd\xe0\xbf\xa6\xc6o\xfd\x00\x13\xe5?\xf9c\x0e\r\x81_\xe6\xbf\xd0D\x1f\xc6\x80y\xe0\xbfk1a\xfc\x80\xfc\xe4?\xbe\xce\xff\x0b\x01I\xe6\xbf\x94\xaf\x10\xc5\x00c\xe0\xbfk1a\xfc\x80\xfc\xe4?e\x8a\xe3\x07\x81\xf1\xe5\xbf\x94\xaf\x10\xc5\x00c\xe0\xbf\xa6\xc6o\xfd\x00\x13\xe5?\x829\xf1\n\x812\xe6\xbf\xb2\x95\x11\xc3\x808\xe0\xbf\xa6\xc6o\xfd\x00\x13\xe5?\xa0\x1f\xf2\x08\x01\x08\xe6\xbfY\x1a\x02\xc4\x80L\xe0\xbf\xa6\xc6o\xfd\x00\x13\xe5?\xed_\xc6\x05\x81\xc4\xe5\xbf\xb2\x95\x11\xc3\x808\xe0\xbf\xa6\xc6o\xfd\x00\x13\xe5?v5\xa9\x03\x81\x97\xe5\xbf\xb2\x95\x11\xc3\x808\xe0\xbf\xe2[~\xfe\x80)\xe5?;\xa0\x9a\x02\x01\x81\xe5\xbf\xd0D\x1f\xc6\x80y\xe0\xbfk1a\xfc\x80\xfc\xe4?\x1d\xf1\x8c\xff\x00@\xe5\xbf\xbe\x99Y\xca\x80\xd3\xe0\xbf/\x9cR\xfb\x00\xe6\xe4?\x1d\xf1\x8c\xff\x00@\xe5\xbf\x82\x04K\xc9\x00\xbd\xe0\xbf/\x9cR\xfb\x00\xe6\xe4?\xff\n\x8c\x01\x81j\xe5\xbf\xfa.h\xcb\x00\xea\xe0\xbf\xb8q5\xf9\x00\xb9\xe4?\xff\n\x8c\x01\x81j\xe5\xbf\x17\xdeu\xce\x00+\xe1\xbf\xb8q5\xf9\x00\xb9\xe4?\x1d\xf1\x8c\xff\x00@\xe5\xbfSs\x84\xcf\x80A\xe1\xbf\x9a\xc2\'\xf6\x00x\xe4?Y\x86\x9b\x00\x81V\xe5\xbf\x17\xdeu\xce\x00+\xe1\xbf\xd6W6\xf7\x80\x8e\xe4?\x1d\xf1\x8c\xff\x00@\xe5\xbf\x8e\x08\x93\xd0\x00X\xe1\xbf\xd6W6\xf7\x80\x8e\xe4?\xa6\xc6o\xfd\x00\x13\xe5\xbf\x8e\x08\x93\xd0\x00X\xe1\xbf\x9a\xc2\'\xf6\x00x\xe4?\x1d\xf1\x8c\xff\x00@\xe5\xbf\x053\xb0\xd2\x00\x85\xe1\xbf|\xdc&\xf8\x80\xa2\xe4?\x1d\xf1\x8c\xff\x00@\xe5\xbf\x8e\x08\x93\xd0\x00X\xe1\xbf\x9a\xc2\'\xf6\x00x\xe4?\x1d\xf1\x8c\xff\x00@\xe5\xbf\x8e\x08\x93\xd0\x00X\xe1\xbf\xd6W6\xf7\x80\x8e\xe4?\xf3\x06D\xfa\x80\xcf\xe4\xbf\x8e\x08\x93\xd0\x00X\xe1\xbf|\xdc&\xf8\x80\xa2\xe4?/\x9cR\xfb\x00\xe6\xe4\xbfSs\x84\xcf\x80A\xe1\xbf|\xdc&\xf8\x80\xa2\xe4?\xb8q5\xf9\x00\xb9\xe4\xbf\x053\xb0\xd2\x00\x85\xe1\xbf\xb8q5\xf9\x00\xb9\xe4?\x9a\xc2\'\xf6\x00x\xe4\xbf\xca\x9d\xa1\xd1\x80n\xe1\xbf|\xdc&\xf8\x80\xa2\xe4?#\x98\n\xf4\x00K\xe4\xbfSs\x84\xcf\x80A\xe1\xbf|\xdc&\xf8\x80\xa2\xe4?\xacm\xed\xf1\x00\x1e\xe4\xbf\xca\x9d\xa1\xd1\x80n\xe1\xbf\x9a\xc2\'\xf6\x00x\xe4?\xe8\x02\xfc\xf2\x804\xe4\xbf\xdcHg\xcd\x80\x14\xe1\xbf|\xdc&\xf8\x80\xa2\xe4?5C\xd0\xef\x00\xf1\xe3\xbf\xca\x9d\xa1\xd1\x80n\xe1\xbf|\xdc&\xf8\x80\xa2\xe4?q\xd8\xde\xf0\x80\x07\xe4\xbf\x8e\x08\x93\xd0\x00X\xe1\xbf|\xdc&\xf8\x80\xa2\xe4?5C\xd0\xef\x00\xf1\xe3\xbf\x053\xb0\xd2\x00\x85\xe1\xbf\xd6W6\xf7\x80\x8e\xe4?\x17\x94\xc2\xec\x00\xb0\xe3\xbf\x053\xb0\xd2\x00\x85\xe1\xbf|\xdc&\xf8\x80\xa2\xe4?5C\xd0\xef\x00\xf1\xe3\xbfA\xc8\xbe\xd3\x80\x9b\xe1\xbf\xd6W6\xf7\x80\x8e\xe4?5C\xd0\xef\x00\xf1\xe3\xbfA\xc8\xbe\xd3\x80\x9b\xe1\xbf|\xdc&\xf8\x80\xa2\xe4?S)\xd1\xed\x80\xc6\xe3\xbf|]\xcd\xd4\x00\xb2\xe1\xbf|\xdc&\xf8\x80\xa2\xe4?\xdc\xfe\xb3\xeb\x80\x99\xe3\xbf|]\xcd\xd4\x00\xb2\xe1\xbf\xd6W6\xf7\x80\x8e\xe4?e\xd4\x96\xe9\x80l\xe3\xbf_w\xcc\xd6\x80\xdc\xe1\xbf\xd6W6\xf7\x80\x8e\xe4?\xee\xa9y\xe7\x80?\xe3\xbf_w\xcc\xd6\x80\xdc\xe1\xbf_-\x19\xf5\x80a\xe4?G%\x89\xe6\x80+\xe3\xbf_w\xcc\xd6\x80\xdc\xe1\xbf\x9a\xc2\'\xf6\x00x\xe4?Y\xd0N\xe2\x80\xd1\xe2\xbf\x117\xf8\xd9\x00 \xe2\xbf\xd6W6\xf7\x80\x8e\xe4?\x1d;@\xe1\x00\xbb\xe2\xbf\x9a\x0c\xdb\xd7\x00\xf3\xe1\xbf\x9a\xc2\'\xf6\x00x\xe4?\x94e]\xe3\x00\xe8\xe2\xbf\x9a\x0c\xdb\xd7\x00\xf3\xe1\xbf\x9a\xc2\'\xf6\x00x\xe4?\xe2\xa51\xe0\x80\xa4\xe2\xbf\x117\xf8\xd9\x00 \xe2\xbf\x9a\xc2\'\xf6\x00x\xe4?\xc4\xf6#\xdd\x80c\xe2\xbf\x117\xf8\xd9\x00 \xe2\xbf_-\x19\xf5\x80a\xe4?\xc4\xf6#\xdd\x80c\xe2\xbf\x117\xf8\xd9\x00 \xe2\xbf\xd6W6\xf7\x80\x8e\xe4?k{\x14\xde\x80w\xe2\xbf\x117\xf8\xd9\x00 \xe2\xbf\x9a\xc2\'\xf6\x00x\xe4?k{\x14\xde\x80w\xe2\xbf\xd6\xa1\xe9\xd8\x80\t\xe2\xbf\xd6W6\xf7\x80\x8e\xe4?\xe2\xa51\xe0\x80\xa4\xe2\xbfM\xcc\x06\xdb\x806\xe2\xbf\x9a\xc2\'\xf6\x00x\xe4?\x1d;@\xe1\x00\xbb\xe2\xbf\x117\xf8\xd9\x00 \xe2\xbf\xd6W6\xf7\x80\x8e\xe4?k{\x14\xde\x80w\xe2\xbf\x117\xf8\xd9\x00 \xe2\xbf_-\x19\xf5\x80a\xe4?\x88a\x15\xdc\x00M\xe2\xbf\x117\xf8\xd9\x00 \xe2\xbf\xd6W6\xf7\x80\x8e\xe4?\x88a\x15\xdc\x00M\xe2\xbf\xd6\xa1\xe9\xd8\x80\t\xe2\xbf\xd6W6\xf7\x80\x8e\xe4?\x117\xf8\xd9\x00 \xe2\xbf\x117\xf8\xd9\x00 \xe2\xbf\xd6W6\xf7\x80\x8e\xe4?\x117\xf8\xd9\x00 \xe2\xbf\x9a\x0c\xdb\xd7\x00\xf3\xe1\xbf|\xdc&\xf8\x80\xa2\xe4?\x9a\x0c\xdb\xd7\x00\xf3\xe1\xbf\x9a\x0c\xdb\xd7\x00\xf3\xe1\xbf\xf3\x06D\xfa\x80\xcf\xe4?_w\xcc\xd6\x80\xdc\xe1\xbf|]\xcd\xd4\x00\xb2\xe1\xbfk1a\xfc\x80\xfc\xe4?|]\xcd\xd4\x00\xb2\xe1\xbf\xca\x9d\xa1\xd1\x80n\xe1\xbf/\x9cR\xfb\x00\xe6\xe4?_w\xcc\xd6\x80\xdc\xe1\xbf\xca\x9d\xa1\xd1\x80n\xe1\xbf\xf3\x06D\xfa\x80\xcf\xe4?A\xc8\xbe\xd3\x80\x9b\xe1\xbfSs\x84\xcf\x80A\xe1\xbf\xa6\xc6o\xfd\x00\x13\xe5?\x053\xb0\xd2\x00\x85\xe1\xbfSs\x84\xcf\x80A\xe1\xbf\xa6\xc6o\xfd\x00\x13\xe5?A\xc8\xbe\xd3\x80\x9b\xe1\xbf\x053\xb0\xd2\x00\x85\xe1\xbf/\x9cR\xfb\x00\xe6\xe4?\x053\xb0\xd2\x00\x85\xe1\xbf\x053\xb0\xd2\x00\x85\xe1\xbf/\x9cR\xfb\x00\xe6\xe4?\x053\xb0\xd2\x00\x85\xe1\xbf#\xe2\xbd\xd5\x00\xc6\xe1\xbf\xf3\x06D\xfa\x80\xcf\xe4?\xca\x9d\xa1\xd1\x80n\xe1\xbf#\xe2\xbd\xd5\x00\xc6\xe1\xbf\xb8q5\xf9\x00\xb9\xe4?\x17\xdeu\xce\x00+\xe1\xbf\x117\xf8\xd9\x00 \xe2\xbf|\xdc&\xf8\x80\xa2\xe4?5\xc4v\xcc\x80\x00\xe1\xbf\x88a\x15\xdc\x00M\xe2\xbf\x9a\xc2\'\xf6\x00x\xe4?\xfa.h\xcb\x00\xea\xe0\xbf\xd6\xa1\xe9\xd8\x80\t\xe2\xbf_-\x19\xf5\x80a\xe4?\x82\x04K\xc9\x00\xbd\xe0\xbfM\xcc\x06\xdb\x806\xe2\xbf|\xdc&\xf8\x80\xa2\xe4?\x82\x04K\xc9\x00\xbd\xe0\xbfM\xcc\x06\xdb\x806\xe2\xbf|\xdc&\xf8\x80\xa2\xe4?\x0b\xda-\xc7\x00\x90\xe0\xbf\x9a\x0c\xdb\xd7\x00\xf3\xe1\xbf\xb8q5\xf9\x00\xb9\xe4?Y\x1a\x02\xc4\x80L\xe0\xbf|]\xcd\xd4\x00\xb2\xe1\xbf/\x9cR\xfb\x00\xe6\xe4?\xb2\x95\x11\xc3\x808\xe0\xbf\xca\x9d\xa1\xd1\x80n\xe1\xbfk1a\xfc\x80\xfc\xe4?w\x00\x03\xc2\x00"\xe0\xbf\x17\xdeu\xce\x00+\xe1\xbfk1a\xfc\x80\xfc\xe4?\x88\x81\xae}\x01\xbd\xdf\xbf\xdcHg\xcd\x80\x14\xe1\xbf\xe2[~\xfe\x80)\xe5?#\x02Ww\x016\xdf\xbf5\xc4v\xcc\x80\x00\xe1\xbf\xe2[~\xfe\x80)\xe5?\xd5\xf8uu\x01\x0e\xdf\xbf\x82\x04K\xc9\x00\xbd\xe0\xbf\xa6\xc6o\xfd\x00\x13\xe5?^\xceXs\x01\xe1\xde\xbf\x82\x04K\xc9\x00\xbd\xe0\xbfY\x86\x9b\x00\x81V\xe5?\xd5\xf8uu\x01\x0e\xdf\xbf\x82\x04K\xc9\x00\xbd\xe0\xbf\x1d\xf1\x8c\xff\x00@\xe5?\xe7\xa3;q\x01\xb4\xde\xbf\xbe\x99Y\xca\x80\xd3\xe0\xbf\x1d\xf1\x8c\xff\x00@\xe5?\xe7\xa3;q\x01\xb4\xde\xbf\xdcHg\xcd\x80\x14\xe1\xbf\xa6\xc6o\xfd\x00\x13\xe5?py\x1eo\x01\x87\xde\xbf\x17\xdeu\xce\x00+\xe1\xbf\xe2[~\xfe\x80)\xe5?py\x1eo\x01\x87\xde\xbfSs\x84\xcf\x80A\xe1\xbf/\x9cR\xfb\x00\xe6\xe4?\x82$\xe4j\x01-\xde\xbfA\xc8\xbe\xd3\x80\x9b\xe1\xbf/\x9cR\xfb\x00\xe6\xe4?G\xc6\xc8d\x01\xab\xdd\xbf\x053\xb0\xd2\x00\x85\xe1\xbfk1a\xfc\x80\xfc\xe4?\x82$\xe4j\x01-\xde\xbf\x053\xb0\xd2\x00\x85\xe1\xbf/\x9cR\xfb\x00\xe6\xe4?\x0b\xfa\xc6h\x01\x00\xde\xbf\x053\xb0\xd2\x00\x85\xe1\xbf\xf3\x06D\xfa\x80\xcf\xe4?Xq\x8e`\x01Q\xdd\xbfSs\x84\xcf\x80A\xe1\xbf\xa6\xc6o\xfd\x00\x13\xe5?\xe1Fq^\x01$\xdd\xbf\xdcHg\xcd\x80\x14\xe1\xbfY\x86\x9b\x00\x81V\xe5?j\x1cT\\\x01\xf7\xdc\xbf\x17\xdeu\xce\x00+\xe1\xbf\x1d\xf1\x8c\xff\x00@\xe5?\x05\x9d\xfcU\x01p\xdc\xbfGo<\xc8\x80\xa6\xe0\xbfY\x86\x9b\x00\x81V\xe5?|\xc7\x19X\x01\x9d\xdc\xbf\x0b\xda-\xc7\x00\x90\xe0\xbfY\x86\x9b\x00\x81V\xe5?\x05\x9d\xfcU\x01p\xdc\xbf\x94\xaf\x10\xc5\x00c\xe0\xbf\xb2\xca\xb7\x04\x01\xae\xe5?\x05\x9d\xfcU\x01p\xdc\xbf\x94\xaf\x10\xc5\x00c\xe0\xbf\xff\n\x8c\x01\x81j\xe5?\x8er\xdfS\x01C\xdc\xbfY\x1a\x02\xc4\x80L\xe0\xbf;\xa0\x9a\x02\x01\x81\xe5?\x05\x9d\xfcU\x01p\xdc\xbf\xd0D\x1f\xc6\x80y\xe0\xbfY\x86\x9b\x00\x81V\xe5?\x05\x9d\xfcU\x01p\xdc\xbf\x0b\xda-\xc7\x00\x90\xe0\xbfY\x86\x9b\x00\x81V\xe5?\x8er\xdfS\x01C\xdc\xbf\xfa.h\xcb\x00\xea\xe0\xbfY\x86\x9b\x00\x81V\xe5?Ai\xfeQ\x01\x1b\xdc\xbf5\xc4v\xcc\x80\x00\xe1\xbf\xa6\xc6o\xfd\x00\x13\xe5?S\x14\xc4M\x01\xc1\xdb\xbfSs\x84\xcf\x80A\xe1\xbf\xa6\xc6o\xfd\x00\x13\xe5?\x8er\xdfS\x01C\xdc\xbfSs\x84\xcf\x80A\xe1\xbfk1a\xfc\x80\xfc\xe4?\xca>\xe1O\x01\xee\xdb\xbf\x17\xdeu\xce\x00+\xe1\xbfY\x86\x9b\x00\x81V\xe5?S\x14\xc4M\x01\xc1\xdb\xbf\x17\xdeu\xce\x00+\xe1\xbf\xa6\xc6o\xfd\x00\x13\xe5?S\x14\xc4M\x01\xc1\xdb\xbf5\xc4v\xcc\x80\x00\xe1\xbf\xe2[~\xfe\x80)\xe5?d\xbf\x89I\x01g\xdb\xbf\x0b\xda-\xc7\x00\x90\xe0\xbf\xff\n\x8c\x01\x81j\xe5?\xed\x94lG\x01:\xdb\xbf\xd0D\x1f\xc6\x80y\xe0\xbf;\xa0\x9a\x02\x01\x81\xe5?\xff?2C\x01\xe0\xda\xbfw\x00\x03\xc2\x00"\xe0\xbfv5\xa9\x03\x81\x97\xe5?vjOE\x01\r\xdb\xbf;k\xf4\xc0\x80\x0b\xe0\xbf\xb2\xca\xb7\x04\x01\xae\xe5?\xff?2C\x01\xe0\xda\xbf\xff\xab\xcb\x7f\x01\xea\xdf\xbf\xb2\xca\xb7\x04\x01\xae\xe5?\xc4\xe1\x16=\x01^\xda\xbf\x11W\x91{\x01\x90\xdf\xbf;\xa0\x9a\x02\x01\x81\xe5?M\xb7\xf9:\x011\xda\xbf\x9a,ty\x01c\xdf\xbf\xed_\xc6\x05\x81\xc4\xe5?\xd6\x8c\xdc8\x01\x04\xda\xbf\x88\x81\xae}\x01\xbd\xdf\xbf)\xf5\xd4\x06\x01\xdb\xe5?\xe77\xa24\x01\xaa\xd9\xbf\x88\x81\xae}\x01\xbd\xdf\xbf)\xf5\xd4\x06\x01\xdb\xe5?M\xb7\xf9:\x011\xda\xbf\x88\x81\xae}\x01\xbd\xdf\xbf\xb2\xca\xb7\x04\x01\xae\xe5?\xc4\xe1\x16=\x01^\xda\xbf;k\xf4\xc0\x80\x0b\xe0\xbf\xb2\xca\xb7\x04\x01\xae\xe5?M\xb7\xf9:\x011\xda\xbf\xff\xab\xcb\x7f\x01\xea\xdf\xbf\xb2\xca\xb7\x04\x01\xae\xe5?\xe77\xa24\x01\xaa\xd9\xbf;k\xf4\xc0\x80\x0b\xe0\xbfv5\xa9\x03\x81\x97\xe5?\xe77\xa24\x01\xaa\xd9\xbf;k\xf4\xc0\x80\x0b\xe0\xbf\xed_\xc6\x05\x81\xc4\xe5?\xe77\xa24\x01\xaa\xd9\xbfw\x00\x03\xc2\x00"\xe0\xbf\xb2\xca\xb7\x04\x01\xae\xe5?\xe77\xa24\x01\xaa\xd9\xbfw\x00\x03\xc2\x00"\xe0\xbfv5\xa9\x03\x81\x97\xe5?\xe77\xa24\x01\xaa\xd9\xbfw\x00\x03\xc2\x00"\xe0\xbfv5\xa9\x03\x81\x97\xe5?p\r\x852\x01}\xd9\xbf\xff\xab\xcb\x7f\x01\xea\xdf\xbf;\xa0\x9a\x02\x01\x81\xe5?\xf9\xe2g0\x01P\xd9\xbf;k\xf4\xc0\x80\x0b\xe0\xbfv5\xa9\x03\x81\x97\xe5?\xf9\xe2g0\x01P\xd9\xbf\x11W\x91{\x01\x90\xdf\xbf\xb2\xca\xb7\x04\x01\xae\xe5?GZ/(\x01\xa1\xd8\xbf\xff\xab\xcb\x7f\x01\xea\xdf\xbf\xed_\xc6\x05\x81\xc4\xe5?GZ/(\x01\xa1\xd8\xbf\xd5\xf8uu\x01\x0e\xdf\xbf\xb2\xca\xb7\x04\x01\xae\xe5?\xbe\x84L*\x01\xce\xd8\xbf^\xceXs\x01\xe1\xde\xbf\xed_\xc6\x05\x81\xc4\xe5?\xbe\x84L*\x01\xce\xd8\xbf^\xceXs\x01\xe1\xde\xbf\xed_\xc6\x05\x81\xc4\xe5?Y\x05\xf5#\x01G\xd8\xbf\xf9N\x01m\x01Z\xde\xbf\xed_\xc6\x05\x81\xc4\xe5?GZ/(\x01\xa1\xd8\xbf\xe7\xa3;q\x01\xb4\xde\xbf)\xf5\xd4\x06\x01\xdb\xe5?Y\x05\xf5#\x01G\xd8\xbf\x94\xcf\xa9f\x01\xd3\xdd\xbfe\x8a\xe3\x07\x81\xf1\xe5?\xe2\xda\xd7!\x01\x1a\xd8\xbf\x0b\xfa\xc6h\x01\x00\xde\xbf\xa0\x1f\xf2\x08\x01\x08\xe6?\xe2\xda\xd7!\x01\x1a\xd8\xbf\xf9N\x01m\x01Z\xde\xbfe\x8a\xe3\x07\x81\xf1\xe5?\x1d\xa7\xd9\x1d\x01\xc5\xd7\xbf\xf9N\x01m\x01Z\xde\xbfe\x8a\xe3\x07\x81\xf1\xe5?Y\x05\xf5#\x01G\xd8\xbfpy\x1eo\x01\x87\xde\xbfe\x8a\xe3\x07\x81\xf1\xe5?\xe2\xda\xd7!\x01\x1a\xd8\xbf\xe7\xa3;q\x01\xb4\xde\xbfe\x8a\xe3\x07\x81\xf1\xe5?\x1d\xa7\xd9\x1d\x01\xc5\xd7\xbf^\xceXs\x01\xe1\xde\xbfe\x8a\xe3\x07\x81\xf1\xe5?\xe2\xda\xd7!\x01\x1a\xd8\xbf#\x02Ww\x016\xdf\xbfe\x8a\xe3\x07\x81\xf1\xe5?\x1d\xa7\xd9\x1d\x01\xc5\xd7\xbf\x9a,ty\x01c\xdf\xbf\xb2\xca\xb7\x04\x01\xae\xe5?j\xb0\xba\x1f\x01\xed\xd7\xbf\x88\x81\xae}\x01\xbd\xdf\xbf\xed_\xc6\x05\x81\xc4\xe5?\xb8\'\x82\x17\x01>\xd7\xbf\xff\xab\xcb\x7f\x01\xea\xdf\xbf\xed_\xc6\x05\x81\xc4\xe5?A\xfdd\x15\x01\x11\xd7\xbf\xff\xab\xcb\x7f\x01\xea\xdf\xbf\xed_\xc6\x05\x81\xc4\xe5?\x17J\x0f\x0b\x015\xd6\xbf\xd5\xf8uu\x01\x0e\xdf\xbf\xb2\xca\xb7\x04\x01\xae\xe5?\x8et,\r\x01b\xd6\xbf^\xceXs\x01\xe1\xde\xbfe\x8a\xe3\x07\x81\xf1\xe5?)\xf5\xd4\x06\x01\xdb\xd5\xbf\x82$\xe4j\x01-\xde\xbfe\x8a\xe3\x07\x81\xf1\xe5?;\xa0\x9a\x02\x01\x81\xd5\xbfG\xc6\xc8d\x01\xab\xdd\xbf\xa0\x1f\xf2\x08\x01\x08\xe6?\xd6 C\xfc\x00\xfa\xd4\xbf\xe1Fq^\x01$\xdd\xbf\xbe\xce\xff\x0b\x01I\xe6?\xc4u}\x00\x01T\xd5\xbf|\xc7\x19X\x01\x9d\xdc\xbfG\xa4\xe2\t\x01\x1c\xe6?MK`\xfe\x00\'\xd5\xbf\x8er\xdfS\x01C\xdc\xbf\x829\xf1\n\x812\xe6?MK`\xfe\x00\'\xd5\xbfAi\xfeQ\x01\x1b\xdc\xbf\x829\xf1\n\x812\xe6?\xc4u}\x00\x01T\xd5\xbfAi\xfeQ\x01\x1b\xdc\xbf\xf9c\x0e\r\x81_\xe6?\xb2\xca\xb7\x04\x01\xae\xd5\xbf\x8er\xdfS\x01C\xdc\xbfG\xa4\xe2\t\x01\x1c\xe6?;\xa0\x9a\x02\x01\x81\xd5\xbf\x8er\xdfS\x01C\xdc\xbf\xf9c\x0e\r\x81_\xe6?;\xa0\x9a\x02\x01\x81\xd5\xbf\xf3\xf16Z\x01\xca\xdc\xbf5\xf9\x1c\x0e\x01v\xe6?\xb2\xca\xb7\x04\x01\xae\xd5\xbf|\xc7\x19X\x01\x9d\xdc\xbf\xf9c\x0e\r\x81_\xe6?\xa0\x1f\xf2\x08\x01\x08\xd6\xbf\xe1Fq^\x01$\xdd\xbf\x829\xf1\n\x812\xe6?;\xa0\x9a\x02\x01\x81\xd5\xbf\xe1Fq^\x01$\xdd\xbf\x829\xf1\n\x812\xe6?\xb2\xca\xb7\x04\x01\xae\xd5\xbfG\xc6\xc8d\x01\xab\xdd\xbfG\xa4\xe2\t\x01\x1c\xe6?MK`\xfe\x00\'\xd5\xbf\x82$\xe4j\x01-\xde\xbf\xa0\x1f\xf2\x08\x01\x08\xe6?\xd6 C\xfc\x00\xfa\xd4\xbf\x0b\xfa\xc6h\x01\x00\xde\xbf)\xf5\xd4\x06\x01\xdb\xe5?MK`\xfe\x00\'\xd5\xbf\x0b\xfa\xc6h\x01\x00\xde\xbf\xed_\xc6\x05\x81\xc4\xe5?\x88\x17b\xfa\x00\xd2\xd4\xbf\x0b\xfa\xc6h\x01\x00\xde\xbfe\x8a\xe3\x07\x81\xf1\xe5?\xd6 C\xfc\x00\xfa\xd4\xbf\x0b\xfa\xc6h\x01\x00\xde\xbfe\x8a\xe3\x07\x81\xf1\xe5?\x11\xedD\xf8\x00\xa5\xd4\xbfG\xc6\xc8d\x01\xab\xdd\xbfe\x8a\xe3\x07\x81\xf1\xe5?\xd6 C\xfc\x00\xfa\xd4\xbfG\xc6\xc8d\x01\xab\xdd\xbfG\xa4\xe2\t\x01\x1c\xe6?\x88\x17b\xfa\x00\xd2\xd4\xbf\xe1Fq^\x01$\xdd\xbf\xa0\x1f\xf2\x08\x01\x08\xe6?MK`\xfe\x00\'\xd5\xbf\xf3\xf16Z\x01\xca\xdc\xbfe\x8a\xe3\x07\x81\xf1\xe5?MK`\xfe\x00\'\xd5\xbf\xe1Fq^\x01$\xdd\xbfe\x8a\xe3\x07\x81\xf1\xe5?\x88\x17b\xfa\x00\xd2\xd4\xbfj\x1cT\\\x01\xf7\xdc\xbf\xa0\x1f\xf2\x08\x01\x08\xe6?\x88\x17b\xfa\x00\xd2\xd4\xbfj\x1cT\\\x01\xf7\xdc\xbfG\xa4\xe2\t\x01\x1c\xe6?\xd6 C\xfc\x00\xfa\xd4\xbfj\x1cT\\\x01\xf7\xdc\xbf\xa0\x1f\xf2\x08\x01\x08\xe6?MK`\xfe\x00\'\xd5\xbfj\x1cT\\\x01\xf7\xdc\xbf\xa0\x1f\xf2\x08\x01\x08\xe6?MK`\xfe\x00\'\xd5\xbfj\x1cT\\\x01\xf7\xdc\xbfG\xa4\xe2\t\x01\x1c\xe6?MK`\xfe\x00\'\xd5\xbf\xe1Fq^\x01$\xdd\xbfe\x8a\xe3\x07\x81\xf1\xe5?;\xa0\x9a\x02\x01\x81\xd5\xbfG\xc6\xc8d\x01\xab\xdd\xbfe\x8a\xe3\x07\x81\xf1\xe5?\xc4u}\x00\x01T\xd5\xbfG\xc6\xc8d\x01\xab\xdd\xbfe\x8a\xe3\x07\x81\xf1\xe5?\xb2\xca\xb7\x04\x01\xae\xd5\xbf\x94\xcf\xa9f\x01\xd3\xdd\xbf\xa0\x1f\xf2\x08\x01\x08\xe6?)\xf5\xd4\x06\x01\xdb\xd5\xbf\x94\xcf\xa9f\x01\xd3\xdd\xbfe\x8a\xe3\x07\x81\xf1\xe5?\xb2\xca\xb7\x04\x01\xae\xd5\xbf\x0b\xfa\xc6h\x01\x00\xde\xbf\xa0\x1f\xf2\x08\x01\x08\xe6?\x17J\x0f\x0b\x015\xd6\xbf\x82$\xe4j\x01-\xde\xbf)\xf5\xd4\x06\x01\xdb\xe5?)\xf5\xd4\x06\x01\xdb\xd5\xbf\x82$\xe4j\x01-\xde\xbfe\x8a\xe3\x07\x81\xf1\xe5?)\xf5\xd4\x06\x01\xdb\xd5\xbf^\xceXs\x01\xe1\xde\xbf)\xf5\xd4\x06\x01\xdb\xe5?)\xf5\xd4\x06\x01\xdb\xd5\xbf\xe7\xa3;q\x01\xb4\xde\xbfe\x8a\xe3\x07\x81\xf1\xe5?\xa0\x1f\xf2\x08\x01\x08\xd6\xbf^\xceXs\x01\xe1\xde\xbf)\xf5\xd4\x06\x01\xdb\xe5?\xa0\x1f\xf2\x08\x01\x08\xd6\xbf\xd5\xf8uu\x01\x0e\xdf\xbf\xa0\x1f\xf2\x08\x01\x08\xe6?\xb2\xca\xb7\x04\x01\xae\xd5\xbf^\xceXs\x01\xe1\xde\xbfe\x8a\xe3\x07\x81\xf1\xe5?\xa0\x1f\xf2\x08\x01\x08\xd6\xbf\x82$\xe4j\x01-\xde\xbfe\x8a\xe3\x07\x81\xf1\xe5?\xa0\x1f\xf2\x08\x01\x08\xd6\xbf\xe7\xa3;q\x01\xb4\xde\xbfe\x8a\xe3\x07\x81\xf1\xe5?\x17J\x0f\x0b\x015\xd6\xbf^\xceXs\x01\xe1\xde\xbfG\xa4\xe2\t\x01\x1c\xe6?\xa0\x1f\xf2\x08\x01\x08\xd6\xbf\xd5\xf8uu\x01\x0e\xdf\xbfe\x8a\xe3\x07\x81\xf1\xe5?\x8et,\r\x01b\xd6\xbf\xd5\xf8uu\x01\x0e\xdf\xbf)\xf5\xd4\x06\x01\xdb\xe5?\x17J\x0f\x0b\x015\xd6\xbf^\xceXs\x01\xe1\xde\xbf\xed_\xc6\x05\x81\xc4\xe5?\x17J\x0f\x0b\x015\xd6\xbf^\xceXs\x01\xe1\xde\xbf)\xf5\xd4\x06\x01\xdb\xe5?\x17J\x0f\x0b\x015\xd6\xbf\xf9N\x01m\x01Z\xde\xbf)\xf5\xd4\x06\x01\xdb\xe5?\xa0\x1f\xf2\x08\x01\x08\xd6\xbf^\xceXs\x01\xe1\xde\xbfe\x8a\xe3\x07\x81\xf1\xe5?\x17J\x0f\x0b\x015\xd6\xbf#\x02Ww\x016\xdf\xbf\xa0\x1f\xf2\x08\x01\x08\xe6?\xdc}\r\x0f\x01\x8a\xd6\xbf\xd5\xf8uu\x01\x0e\xdf\xbfe\x8a\xe3\x07\x81\xf1\xe5?\x8et,\r\x01b\xd6\xbf\xd5\xf8uu\x01\x0e\xdf\xbf\xb2\xca\xb7\x04\x01\xae\xe5?\x17J\x0f\x0b\x015\xd6\xbf#\x02Ww\x016\xdf\xbf)\xf5\xd4\x06\x01\xdb\xe5?\x17J\x0f\x0b\x015\xd6\xbf\xd5\xf8uu\x01\x0e\xdf\xbf)\xf5\xd4\x06\x01\xdb\xe5?\xdc}\r\x0f\x01\x8a\xd6\xbf#\x02Ww\x016\xdf\xbf)\xf5\xd4\x06\x01\xdb\xe5?\x8et,\r\x01b\xd6\xbf\xd5\xf8uu\x01\x0e\xdf\xbf)\xf5\xd4\x06\x01\xdb\xe5?\xdc}\r\x0f\x01\x8a\xd6\xbf\x9a,ty\x01c\xdf\xbf)\xf5\xd4\x06\x01\xdb\xe5?\xca\xd2G\x13\x01\xe4\xd6\xbf\x11W\x91{\x01\x90\xdf\xbf\xb2\xca\xb7\x04\x01\xae\xe5?A\xfdd\x15\x01\x11\xd7\xbf\x88\x81\xae}\x01\xbd\xdf\xbf)\xf5\xd4\x06\x01\xdb\xe5?A\xfdd\x15\x01\x11\xd7\xbf\xff\xab\xcb\x7f\x01\xea\xdf\xbf\xb2\xca\xb7\x04\x01\xae\xe5?\xb8\'\x82\x17\x01>\xd7\xbf\x88\x81\xae}\x01\xbd\xdf\xbf\xed_\xc6\x05\x81\xc4\xe5?A\xfdd\x15\x01\x11\xd7\xbf\xff\xab\xcb\x7f\x01\xea\xdf\xbf\xb2\xca\xb7\x04\x01\xae\xe5?\xb8\'\x82\x17\x01>\xd7\xbf\xb2\x95\x11\xc3\x808\xe0\xbfv5\xa9\x03\x81\x97\xe5?\xb8\'\x82\x17\x01>\xd7\xbfw\x00\x03\xc2\x00"\xe0\xbf\xb2\xca\xb7\x04\x01\xae\xe5?A\xfdd\x15\x01\x11\xd7\xbfw\x00\x03\xc2\x00"\xe0\xbfv5\xa9\x03\x81\x97\xe5?'
107 | p13
108 | tp14
109 | b.
--------------------------------------------------------------------------------
/launch/calibrator.launch:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/nodes/calibrate_imu.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python2
2 | import rospy
3 | from std_msgs.msg import Header
4 | from sensor_msgs.msg import Imu
5 | from geometry_msgs.msg import Vector3Stamped
6 | from std_srvs.srv import Empty, EmptyResponse
7 | import math
8 | import pickle
9 | from time import localtime,strftime
10 | import os
11 | from numpy import linalg,array,amax,amin,add,divide,multiply,subtract,power,Inf,matrix,tile,bmat,random,arange,ones,zeros,eye,squeeze
12 |
13 |
14 | class calibrate_imu:
15 | def __init__(self):
16 | self.mag_samples = []
17 | self.imu_samples = []
18 | self.mag_matrix = eye(3)
19 | self.mag_offset = zeros(3)
20 | self.sampling = False
21 |
22 | mag_topic = rospy.get_param('~mag_topic', '/imu/mag')
23 | imu_topic = rospy.get_param('~imu_topic', '/imu/data')
24 | self.publish_calibrated = rospy.get_param("~publish_calibrated", False)
25 | self.max_samples = rospy.get_param("~max_samples", 5000)
26 | self.__location__ = rospy.get_param("~calibrations_dir", "/data/mag_calibration")
27 | self.calibrated_mag_pub = rospy.Publisher('/imu/mag_calibrated',Vector3Stamped, queue_size='1')
28 | self.load_calibration()
29 |
30 | rospy.Subscriber(mag_topic,Vector3Stamped,self.mag_cb)
31 | rospy.Subscriber(imu_topic,Imu, self.imu_cb)
32 | rospy.Service('start_sampling',Empty,self.start_sampling)
33 | rospy.Service('stop_sampling',Empty,self.stop_sampling)
34 | rospy.Service('calibrate_mag',Empty,self.calibrate_mag)
35 |
36 | def load_calibration(self):
37 | file_path = os.path.join(self.__location__,"last_mag_calibration")
38 | try:
39 | f = open(file_path)
40 | self.mag_offset = squeeze(array(pickle.load(f)))
41 | self.mag_matrix = pickle.load(f)
42 | self.mag_samples = pickle.load(f)
43 | f.close()
44 | except:
45 | rospy.log_error("Could not open file %s"%(file_path))
46 |
47 | rospy.loginfo("Magnetometer offset:\n %s",self.mag_offset)
48 | rospy.loginfo("Magnetometer Calibration Matrix:\n %s",self.mag_matrix)
49 |
50 | # callback for magnetometer readings
51 | def mag_cb(self,data):
52 | if self.sampling == True:
53 | #collect measurements
54 | self.mag_samples.append([data.vector.x,data.vector.y,data.vector.z])
55 | if len(self.mag_samples)%50==0:
56 | rospy.loginfo("Got %d magnetometer readings"%(len(self.mag_samples)))
57 | if len(self.mag_samples) > self.max_samples:
58 | # drop the 50 oldest samples
59 | self.mag_samples = self.mag_samples[50:]
60 |
61 | if self.publish_calibrated == True:
62 | mag_raw = array([data.vector.x,data.vector.y,data.vector.z])
63 | mag_cal = ((self.mag_matrix.dot((mag_raw-self.mag_offset.T).T)).T)
64 | calibrated_mag_msg = Vector3Stamped()
65 | calibrated_mag_msg.header.stamp = data.header.stamp
66 | calibrated_mag_msg.vector.x = mag_cal[0]
67 | calibrated_mag_msg.vector.y = mag_cal[1]
68 | calibrated_mag_msg.vector.z = mag_cal[2]
69 |
70 | self.calibrated_mag_pub.publish(calibrated_mag_msg)
71 |
72 | def imu_cb(self,data):
73 | pass
74 |
75 | def start_sampling(self,req):
76 | rospy.loginfo('Started collecting magnetometer readings')
77 | self.sampling = True
78 | self.mag_samples = []
79 | self.imu_samples = []
80 | return EmptyResponse()
81 |
82 | def stop_sampling(self,req):
83 | rospy.loginfo('Stopped collecting magnetometer readings')
84 | self.sampling = False
85 | return EmptyResponse()
86 |
87 | def calibrate_mag(self,req):
88 | if len(self.mag_samples)>=10:
89 | self.sampling = False
90 | xyz = matrix(self.mag_samples)
91 | rospy.loginfo('Starting magnetometer calibration with %d samples'%(len(self.mag_samples)))
92 |
93 | #compute the vectors [ x^2 y^2 z^2 2*x*y 2*y*z 2*x*z x y z 1] for every sample
94 | # the result for the x*y y*z and x*z components should be divided by 2
95 | xyz2 = power(xyz,2)
96 | xy = multiply(xyz[:,0],xyz[:,1])
97 | xz = multiply(xyz[:,0],xyz[:,2])
98 | yz = multiply(xyz[:,1],xyz[:,2])
99 |
100 | # build the data matrix
101 | A = bmat('xyz2 xy xz yz xyz')
102 |
103 | b = 1.0*ones((xyz.shape[0],1))
104 |
105 | # solve the system Ax = b
106 | q,res,rank,sing = linalg.lstsq(A,b)
107 |
108 | # build scaled ellipsoid quadric matrix (in homogeneous coordinates)
109 | A = matrix([[q[0][0],0.5*q[3][0],0.5*q[4][0],0.5*q[6][0]],
110 | [0.5*q[3][0],q[1][0],0.5*q[5][0],0.5*q[7][0]],
111 | [0.5*q[4][0],0.5*q[5][0],q[2][0],0.5*q[8][0]],
112 | [0.5*q[6][0],0.5*q[7][0],0.5*q[8][0],-1]])
113 |
114 | # build scaled ellipsoid quadric matrix (in regular coordinates)
115 | Q = matrix([[q[0][0],0.5*q[3][0],0.5*q[4][0]],
116 | [0.5*q[3][0],q[1][0],0.5*q[5][0]],
117 | [0.5*q[4][0],0.5*q[5][0],q[2][0]]])
118 |
119 | # obtain the centroid of the ellipsoid
120 | x0 = linalg.inv(-1.0*Q)*matrix([0.5*q[6][0],0.5*q[7][0],0.5*q[8][0]]).T
121 |
122 | # translate the ellipsoid in homogeneous coordinates to the center
123 | T_x0 = matrix(eye(4))
124 | T_x0[0,3] = x0[0]; T_x0[1,3] = x0[1]; T_x0[2,3] = x0[2];
125 | A = T_x0.T*A*T_x0
126 |
127 | # rescale the ellipsoid quadric matrix (in regular coordinates)
128 | Q = Q*(-1.0/A[3,3])
129 |
130 | # take the cholesky decomposition of Q. this will be the matrix to transform
131 | # points from the ellipsoid to a sphere, after correcting for the offset x0
132 | L = eye(3)
133 | try:
134 | L = linalg.cholesky(Q).transpose()
135 | except Exception,e:
136 | rospy.loginfo(str(e))
137 | L = eye(3)
138 |
139 | rospy.loginfo("Magnetometer offset:\n %s",x0)
140 | rospy.loginfo("Magnetometer Calibration Matrix:\n %s",L)
141 |
142 | file_path = os.path.join(self.__location__,"last_mag_calibration")
143 | f = open(file_path,"w+")
144 | pickle.dump(x0,f)
145 | pickle.dump(L,f)
146 | pickle.dump(matrix(self.mag_samples),f)
147 | f.close()
148 | # back up calibration
149 | calib_name = strftime("mag_calibration_%d_%m_%y_%H_%M_%S",localtime())
150 | calib_path = os.path.join(self.__location__,calib_name)
151 | os.system("cp %s %s"%(file_path,calib_path))
152 |
153 | self.mag_matrix = L
154 | self.mag_offset = squeeze(array(x0))
155 | else:
156 | rospy.loginfo("Not enough samples to calibrate the magnetometer")
157 | return EmptyResponse()
158 |
159 |
160 |
161 | if __name__=='__main__':
162 | rospy.init_node('calibrate_imu')
163 | cbimu = calibrate_imu()
164 | rospy.spin()
165 |
166 |
167 |
168 |
--------------------------------------------------------------------------------
/nodes/plot_calibration_data.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python2
2 |
3 | import numpy as np
4 | from mpl_toolkits.mplot3d import Axes3D
5 | import matplotlib.pyplot as plt
6 | import pickle
7 | import argparse
8 |
9 | parser = argparse.ArgumentParser("Plot the results from calibrating the magnetometer")
10 | parser.add_argument('filename', metavar='filename', type=str, nargs='+',help='path to the file obtained from the calibrate_imu node')
11 |
12 | args = parser.parse_args()
13 | f = open(args.filename[0])
14 | x0 = pickle.load(f)
15 | L = pickle.load(f)
16 | data = pickle.load(f)
17 | normalized_data = (L*(data.T-x0)).T
18 |
19 | fig = plt.figure()
20 | ax = fig.add_subplot(111,projection='3d')
21 |
22 | print data.shape
23 | print normalized_data.shape
24 |
25 | ax.scatter(np.array(data[:,0]),np.array(data[:,1]),np.array(data[:,2]),c='b',marker='^')
26 |
27 | fig = plt.figure()
28 | ax = fig.add_subplot(111,projection='3d')
29 | ax.scatter(np.array(normalized_data[:,0]),np.array(normalized_data[:,1]),np.array(normalized_data[:,2]),c='r',marker='o')
30 |
31 | plt.show()
32 |
--------------------------------------------------------------------------------
/package.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | calibrate_imu
4 | 0.0.0
5 | The calibrate_imu package
6 |
7 | juancamilog
8 | TODO
9 |
10 | catkin
11 |
12 | roscpp
13 | rospy
14 | std_msgs
15 | geometry_msgs
16 |
17 | roscpp
18 | std_msgs
19 | std_srvs
20 | message_runtime
21 | message_filters
22 |
23 |
24 |
--------------------------------------------------------------------------------