991 lines
16 KiB
Dart
991 lines
16 KiB
Dart
import 'dart:typed_data';
|
|
|
|
import 'package:flat_buffers/flex_buffers.dart' show Reference, Builder;
|
|
import 'package:test/test.dart';
|
|
|
|
void main() {
|
|
test('is null', () {
|
|
expect(Reference.fromBuffer(b([0, 0, 1])).isNull, isTrue);
|
|
});
|
|
|
|
test('bool value', () {
|
|
expect(Reference.fromBuffer(b([1, 104, 1])).boolValue, isTrue);
|
|
expect(Reference.fromBuffer(b([0, 104, 1])).boolValue, isFalse);
|
|
});
|
|
test('int value', () {
|
|
expect(Reference.fromBuffer(b([25, 4, 1])).intValue, 25);
|
|
expect(Reference.fromBuffer(b([231, 4, 1])).intValue, -25);
|
|
expect(Reference.fromBuffer(b([230, 8, 1])).intValue, 230);
|
|
expect(Reference.fromBuffer(b([230, 0, 5, 2])).intValue, 230);
|
|
expect(Reference.fromBuffer(b([1, 4, 5, 2])).intValue, 1025);
|
|
expect(Reference.fromBuffer(b([255, 251, 5, 2])).intValue, -1025);
|
|
expect(Reference.fromBuffer(b([1, 4, 9, 2])).intValue, 1025);
|
|
expect(Reference.fromBuffer(b([255, 255, 255, 127, 6, 4])).intValue,
|
|
2147483647);
|
|
expect(Reference.fromBuffer(b([0, 0, 0, 128, 6, 4])).intValue, -2147483648);
|
|
expect(
|
|
Reference.fromBuffer(b([255, 255, 255, 255, 0, 0, 0, 0, 7, 8]))
|
|
.intValue,
|
|
4294967295);
|
|
expect(
|
|
Reference.fromBuffer(b([255, 255, 255, 255, 255, 255, 255, 127, 7, 8]))
|
|
.intValue,
|
|
9223372036854775807);
|
|
expect(Reference.fromBuffer(b([0, 0, 0, 0, 0, 0, 0, 128, 7, 8])).intValue,
|
|
-9223372036854775808);
|
|
// Dart does not really support UInt64
|
|
// expect(FlxValue.fromBuffer(b([255, 255, 255, 255, 255, 255, 255, 255, 11, 8])).intValue, 18446744073709551615);
|
|
});
|
|
test('double value', () {
|
|
expect(Reference.fromBuffer(b([0, 0, 144, 64, 14, 4])).doubleValue, 4.5);
|
|
expect(Reference.fromBuffer(b([205, 204, 204, 61, 14, 4])).doubleValue,
|
|
closeTo(.1, .001));
|
|
expect(
|
|
Reference.fromBuffer(b([154, 153, 153, 153, 153, 153, 185, 63, 15, 8]))
|
|
.doubleValue,
|
|
.1);
|
|
});
|
|
test('num value', () {
|
|
expect(Reference.fromBuffer(b([0, 0, 144, 64, 14, 4])).numValue, 4.5);
|
|
expect(Reference.fromBuffer(b([205, 204, 204, 61, 14, 4])).numValue,
|
|
closeTo(.1, .001));
|
|
expect(
|
|
Reference.fromBuffer(b([154, 153, 153, 153, 153, 153, 185, 63, 15, 8]))
|
|
.numValue,
|
|
.1);
|
|
expect(Reference.fromBuffer(b([255, 251, 5, 2])).numValue, -1025);
|
|
});
|
|
test('string value', () {
|
|
expect(
|
|
Reference.fromBuffer(b([5, 77, 97, 120, 105, 109, 0, 6, 20, 1]))
|
|
.stringValue,
|
|
'Maxim');
|
|
expect(
|
|
Reference.fromBuffer(b([
|
|
10,
|
|
104,
|
|
101,
|
|
108,
|
|
108,
|
|
111,
|
|
32,
|
|
240,
|
|
159,
|
|
152,
|
|
177,
|
|
0,
|
|
11,
|
|
20,
|
|
1
|
|
])).stringValue,
|
|
'hello 😱');
|
|
});
|
|
test('blob value', () {
|
|
expect(
|
|
Reference.fromBuffer(b([3, 1, 2, 3, 3, 100, 1])).blobValue, [1, 2, 3]);
|
|
});
|
|
test('bool vector', () {
|
|
var flx = Reference.fromBuffer(b([3, 1, 0, 1, 3, 144, 1]));
|
|
expect(flx[0].boolValue, true);
|
|
expect(flx[1].boolValue, false);
|
|
expect(flx[2].boolValue, true);
|
|
});
|
|
test('number vector', () {
|
|
testNumbers([3, 1, 2, 3, 3, 44, 1], [1, 2, 3]);
|
|
testNumbers([3, 255, 2, 3, 3, 44, 1], [-1, 2, 3]);
|
|
testNumbers([3, 0, 1, 0, 43, 2, 3, 0, 6, 45, 1], [1, 555, 3]);
|
|
testNumbers([3, 0, 0, 0, 1, 0, 0, 0, 204, 216, 0, 0, 3, 0, 0, 0, 12, 46, 1],
|
|
[1, 55500, 3]);
|
|
testNumbers([
|
|
3,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
1,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
172,
|
|
128,
|
|
94,
|
|
239,
|
|
12,
|
|
0,
|
|
0,
|
|
0,
|
|
3,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
24,
|
|
47,
|
|
1
|
|
], [
|
|
1,
|
|
55555555500,
|
|
3
|
|
]);
|
|
testNumbers(
|
|
[3, 0, 0, 0, 0, 0, 192, 63, 0, 0, 32, 64, 0, 0, 96, 64, 12, 54, 1],
|
|
[1.5, 2.5, 3.5]);
|
|
testNumbers([
|
|
3,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
154,
|
|
153,
|
|
153,
|
|
153,
|
|
153,
|
|
153,
|
|
241,
|
|
63,
|
|
154,
|
|
153,
|
|
153,
|
|
153,
|
|
153,
|
|
153,
|
|
1,
|
|
64,
|
|
102,
|
|
102,
|
|
102,
|
|
102,
|
|
102,
|
|
102,
|
|
10,
|
|
64,
|
|
24,
|
|
55,
|
|
1
|
|
], [
|
|
1.1,
|
|
2.2,
|
|
3.3
|
|
]);
|
|
});
|
|
test('number vector, fixed type', () {
|
|
testNumbers([1, 2, 2, 64, 1], [1, 2]);
|
|
testNumbers([255, 255, 0, 1, 4, 65, 1], [-1, 256]);
|
|
testNumbers([211, 255, 255, 255, 0, 232, 3, 0, 8, 66, 1], [-45, 256000]);
|
|
testNumbers([
|
|
211,
|
|
255,
|
|
255,
|
|
255,
|
|
255,
|
|
255,
|
|
255,
|
|
255,
|
|
255,
|
|
255,
|
|
255,
|
|
255,
|
|
255,
|
|
255,
|
|
255,
|
|
127,
|
|
16,
|
|
67,
|
|
1
|
|
], [
|
|
-45,
|
|
9223372036854775807
|
|
]);
|
|
|
|
testNumbers([1, 2, 2, 68, 1], [1, 2]);
|
|
testNumbers([1, 0, 0, 1, 4, 69, 1], [1, 256]);
|
|
testNumbers([45, 0, 0, 0, 0, 232, 3, 0, 8, 70, 1], [45, 256000]);
|
|
|
|
testNumbers([205, 204, 140, 63, 0, 0, 0, 192, 8, 74, 1], [1.1, -2]);
|
|
testNumbers([
|
|
154,
|
|
153,
|
|
153,
|
|
153,
|
|
153,
|
|
153,
|
|
241,
|
|
63,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
112,
|
|
192,
|
|
16,
|
|
75,
|
|
1
|
|
], [
|
|
1.1,
|
|
-256
|
|
]);
|
|
|
|
testNumbers([211, 255, 255, 255, 0, 232, 3, 0, 4, 0, 0, 0, 12, 78, 1],
|
|
[-45, 256000, 4]);
|
|
|
|
testNumbers([
|
|
211,
|
|
255,
|
|
255,
|
|
255,
|
|
255,
|
|
255,
|
|
255,
|
|
255,
|
|
255,
|
|
255,
|
|
255,
|
|
255,
|
|
255,
|
|
255,
|
|
255,
|
|
127,
|
|
4,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
9,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
32,
|
|
91,
|
|
1
|
|
], [
|
|
-45,
|
|
9223372036854775807,
|
|
4,
|
|
9
|
|
]);
|
|
|
|
testNumbers([
|
|
45,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
255,
|
|
255,
|
|
255,
|
|
255,
|
|
255,
|
|
255,
|
|
255,
|
|
127,
|
|
4,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
9,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
32,
|
|
95,
|
|
1
|
|
], [
|
|
45,
|
|
9223372036854775807,
|
|
4,
|
|
9
|
|
]);
|
|
|
|
testNumbers([
|
|
154,
|
|
153,
|
|
153,
|
|
153,
|
|
153,
|
|
153,
|
|
241,
|
|
63,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
112,
|
|
64,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
16,
|
|
64,
|
|
24,
|
|
87,
|
|
1
|
|
], [
|
|
1.1,
|
|
256,
|
|
4
|
|
]);
|
|
|
|
testNumbers([
|
|
154,
|
|
153,
|
|
153,
|
|
153,
|
|
153,
|
|
153,
|
|
241,
|
|
63,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
112,
|
|
64,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
16,
|
|
64,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
34,
|
|
64,
|
|
32,
|
|
99,
|
|
1
|
|
], [
|
|
1.1,
|
|
256,
|
|
4,
|
|
9
|
|
]);
|
|
});
|
|
test('string vector', () {
|
|
testStrings([
|
|
3,
|
|
102,
|
|
111,
|
|
111,
|
|
0,
|
|
3,
|
|
98,
|
|
97,
|
|
114,
|
|
0,
|
|
3,
|
|
98,
|
|
97,
|
|
122,
|
|
0,
|
|
3,
|
|
15,
|
|
11,
|
|
7,
|
|
3,
|
|
60,
|
|
1
|
|
], [
|
|
'foo',
|
|
'bar',
|
|
'baz'
|
|
]);
|
|
testStrings([
|
|
3,
|
|
102,
|
|
111,
|
|
111,
|
|
0,
|
|
3,
|
|
98,
|
|
97,
|
|
114,
|
|
0,
|
|
3,
|
|
98,
|
|
97,
|
|
122,
|
|
0,
|
|
6,
|
|
15,
|
|
11,
|
|
7,
|
|
18,
|
|
14,
|
|
10,
|
|
6,
|
|
60,
|
|
1
|
|
], [
|
|
'foo',
|
|
'bar',
|
|
'baz',
|
|
'foo',
|
|
'bar',
|
|
'baz'
|
|
]);
|
|
});
|
|
test('mixed vector', () {
|
|
var flx = Reference.fromBuffer(b([
|
|
3,
|
|
102,
|
|
111,
|
|
111,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
5,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
15,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
1,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
251,
|
|
255,
|
|
255,
|
|
255,
|
|
255,
|
|
255,
|
|
255,
|
|
255,
|
|
205,
|
|
204,
|
|
204,
|
|
204,
|
|
204,
|
|
204,
|
|
244,
|
|
63,
|
|
1,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
20,
|
|
4,
|
|
4,
|
|
15,
|
|
104,
|
|
45,
|
|
43,
|
|
1
|
|
]));
|
|
expect(flx.length, 5);
|
|
expect(flx[0].stringValue, 'foo');
|
|
expect(flx[1].numValue, 1);
|
|
expect(flx[2].numValue, -5);
|
|
expect(flx[3].numValue, 1.3);
|
|
expect(flx[4].boolValue, true);
|
|
});
|
|
|
|
test('single value map', () {
|
|
var flx = Reference.fromBuffer(b([97, 0, 1, 3, 1, 1, 1, 12, 4, 2, 36, 1]));
|
|
expect(flx.length, 1);
|
|
expect(flx['a'].numValue, 12);
|
|
});
|
|
test('two value map', () {
|
|
var flx = Reference.fromBuffer(
|
|
b([0, 97, 0, 2, 4, 4, 2, 1, 2, 45, 12, 4, 4, 4, 36, 1]));
|
|
expect(flx.length, 2);
|
|
expect(flx['a'].numValue, 12);
|
|
expect(flx[''].numValue, 45);
|
|
});
|
|
test('complex map', () {
|
|
var flx = complexMap();
|
|
expect(flx.length, 5);
|
|
expect(flx['age'].numValue, 35);
|
|
expect(flx['weight'].numValue, 72.5);
|
|
expect(flx['name'].stringValue, 'Maxim');
|
|
|
|
expect(flx['flags'].length, 4);
|
|
expect(flx['flags'][0].boolValue, true);
|
|
expect(flx['flags'][1].boolValue, false);
|
|
expect(flx['flags'][2].boolValue, true);
|
|
expect(flx['flags'][3].boolValue, true);
|
|
|
|
expect(flx['address'].length, 3);
|
|
expect(flx['address']['city'].stringValue, 'Bla');
|
|
expect(flx['address']['zip'].stringValue, '12345');
|
|
expect(flx['address']['countryCode'].stringValue, 'XX');
|
|
|
|
expect(
|
|
() => flx['address']['country'].stringValue,
|
|
throwsA(predicate((dynamic e) =>
|
|
e is ArgumentError &&
|
|
e.message ==
|
|
'Key: [country] is not applicable on: //address of: ValueType.Map')));
|
|
expect(
|
|
() => flx['address']['countryCode'][0],
|
|
throwsA(predicate((dynamic e) =>
|
|
e is ArgumentError &&
|
|
e.message ==
|
|
'Key: [0] is not applicable on: //address/countryCode of: ValueType.String')));
|
|
expect(
|
|
() => flx[1],
|
|
throwsA(predicate((dynamic e) =>
|
|
e is ArgumentError &&
|
|
e.message ==
|
|
'Key: [1] is not applicable on: / of: ValueType.Map')));
|
|
expect(
|
|
() => flx['flags'][4],
|
|
throwsA(predicate((dynamic e) =>
|
|
e is ArgumentError &&
|
|
e.message ==
|
|
'Key: [4] is not applicable on: //flags of: ValueType.VectorBool length: 4')));
|
|
expect(
|
|
() => flx['flags'][-1],
|
|
throwsA(predicate((dynamic e) =>
|
|
e is ArgumentError &&
|
|
e.message ==
|
|
'Key: [-1] is not applicable on: //flags of: ValueType.VectorBool length: 4')));
|
|
});
|
|
test('complex map to json', () {
|
|
var flx = complexMap();
|
|
expect(flx.json,
|
|
'{"address":{"city":"Bla","countryCode":"XX","zip":"12345"},"age":35,"flags":[true,false,true,true],"name":"Maxim","weight":72.5}');
|
|
});
|
|
|
|
test('complex map iterators', () {
|
|
var flx = complexMap();
|
|
expect(flx.mapKeyIterable.map((e) => e).toList(),
|
|
['address', 'age', 'flags', 'name', 'weight']);
|
|
expect(flx.mapValueIterable.map((e) => e.json).toList(), [
|
|
flx['address'].json,
|
|
flx['age'].json,
|
|
flx['flags'].json,
|
|
flx['name'].json,
|
|
flx['weight'].json
|
|
]);
|
|
expect(flx['flags'].vectorIterable.map((e) => e.boolValue).toList(),
|
|
[true, false, true, true]);
|
|
});
|
|
|
|
test('bug where offest were stored as int instead of uint', () {
|
|
const data = [
|
|
99,
|
|
104,
|
|
97,
|
|
110,
|
|
110,
|
|
101,
|
|
108,
|
|
115,
|
|
95,
|
|
105,
|
|
110,
|
|
0,
|
|
100,
|
|
105,
|
|
108,
|
|
97,
|
|
116,
|
|
105,
|
|
111,
|
|
110,
|
|
95,
|
|
104,
|
|
101,
|
|
105,
|
|
103,
|
|
104,
|
|
116,
|
|
95,
|
|
102,
|
|
97,
|
|
99,
|
|
116,
|
|
111,
|
|
114,
|
|
0,
|
|
100,
|
|
105,
|
|
108,
|
|
97,
|
|
116,
|
|
105,
|
|
111,
|
|
110,
|
|
95,
|
|
119,
|
|
105,
|
|
100,
|
|
116,
|
|
104,
|
|
95,
|
|
102,
|
|
97,
|
|
99,
|
|
116,
|
|
111,
|
|
114,
|
|
0,
|
|
102,
|
|
117,
|
|
115,
|
|
101,
|
|
100,
|
|
95,
|
|
97,
|
|
99,
|
|
116,
|
|
105,
|
|
118,
|
|
97,
|
|
116,
|
|
105,
|
|
111,
|
|
110,
|
|
95,
|
|
102,
|
|
117,
|
|
110,
|
|
99,
|
|
116,
|
|
105,
|
|
111,
|
|
110,
|
|
0,
|
|
112,
|
|
97,
|
|
100,
|
|
95,
|
|
118,
|
|
97,
|
|
108,
|
|
117,
|
|
101,
|
|
115,
|
|
0,
|
|
112,
|
|
97,
|
|
100,
|
|
100,
|
|
105,
|
|
110,
|
|
103,
|
|
0,
|
|
115,
|
|
116,
|
|
114,
|
|
105,
|
|
100,
|
|
101,
|
|
95,
|
|
104,
|
|
101,
|
|
105,
|
|
103,
|
|
104,
|
|
116,
|
|
0,
|
|
115,
|
|
116,
|
|
114,
|
|
105,
|
|
100,
|
|
101,
|
|
95,
|
|
119,
|
|
105,
|
|
100,
|
|
116,
|
|
104,
|
|
0,
|
|
8,
|
|
130,
|
|
119,
|
|
97,
|
|
76,
|
|
51,
|
|
41,
|
|
34,
|
|
21,
|
|
8,
|
|
1,
|
|
8,
|
|
64,
|
|
1,
|
|
1,
|
|
1,
|
|
1,
|
|
0,
|
|
1,
|
|
1,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
4,
|
|
16,
|
|
36,
|
|
1
|
|
];
|
|
var flx = Reference.fromBuffer(b(data));
|
|
expect(flx.json,
|
|
'{"channels_in":64,"dilation_height_factor":1,"dilation_width_factor":1,"fused_activation_function":1,"pad_values":1,"padding":0,"stride_height":1,"stride_width":1}');
|
|
const object = {
|
|
"channels_in": 64,
|
|
"dilation_height_factor": 1,
|
|
"dilation_width_factor": 1,
|
|
"fused_activation_function": 1,
|
|
"pad_values": 1,
|
|
"padding": 0,
|
|
"stride_height": 1,
|
|
"stride_width": 1
|
|
};
|
|
var data1 = Builder.buildFromObject(object).asUint8List();
|
|
expect(data1.length, data.length);
|
|
var flx1 = Reference.fromBuffer(b(data1));
|
|
expect(flx1.json,
|
|
'{"channels_in":64,"dilation_height_factor":1,"dilation_width_factor":1,"fused_activation_function":1,"pad_values":1,"padding":0,"stride_height":1,"stride_width":1}');
|
|
});
|
|
}
|
|
|
|
ByteBuffer b(List<int> values) {
|
|
var data = Uint8List.fromList(values);
|
|
return data.buffer;
|
|
}
|
|
|
|
void testNumbers(List<int> buffer, List<num> numbers) {
|
|
var flx = Reference.fromBuffer(b(buffer));
|
|
expect(flx.length, numbers.length);
|
|
for (var i = 0; i < flx.length; i++) {
|
|
expect(flx[i].numValue, closeTo(numbers[i], 0.001));
|
|
}
|
|
}
|
|
|
|
void testStrings(List<int> buffer, List<String> numbers) {
|
|
var flx = Reference.fromBuffer(b(buffer));
|
|
expect(flx.length, numbers.length);
|
|
for (var i = 0; i < flx.length; i++) {
|
|
expect(flx[i].stringValue, numbers[i]);
|
|
}
|
|
}
|
|
|
|
Reference complexMap() {
|
|
// {
|
|
// "age": 35,
|
|
// "flags": [True, False, True, True],
|
|
// "weight": 72.5,
|
|
// "name": "Maxim",
|
|
// "address": {
|
|
// "city": "Bla",
|
|
// "zip": "12345",
|
|
// "countryCode": "XX",
|
|
// }
|
|
// }
|
|
return Reference.fromBuffer(b([
|
|
97,
|
|
100,
|
|
100,
|
|
114,
|
|
101,
|
|
115,
|
|
115,
|
|
0,
|
|
99,
|
|
105,
|
|
116,
|
|
121,
|
|
0,
|
|
3,
|
|
66,
|
|
108,
|
|
97,
|
|
0,
|
|
99,
|
|
111,
|
|
117,
|
|
110,
|
|
116,
|
|
114,
|
|
121,
|
|
67,
|
|
111,
|
|
100,
|
|
101,
|
|
0,
|
|
2,
|
|
88,
|
|
88,
|
|
0,
|
|
122,
|
|
105,
|
|
112,
|
|
0,
|
|
5,
|
|
49,
|
|
50,
|
|
51,
|
|
52,
|
|
53,
|
|
0,
|
|
3,
|
|
38,
|
|
29,
|
|
14,
|
|
3,
|
|
1,
|
|
3,
|
|
38,
|
|
22,
|
|
15,
|
|
20,
|
|
20,
|
|
20,
|
|
97,
|
|
103,
|
|
101,
|
|
0,
|
|
102,
|
|
108,
|
|
97,
|
|
103,
|
|
115,
|
|
0,
|
|
4,
|
|
1,
|
|
0,
|
|
1,
|
|
1,
|
|
110,
|
|
97,
|
|
109,
|
|
101,
|
|
0,
|
|
5,
|
|
77,
|
|
97,
|
|
120,
|
|
105,
|
|
109,
|
|
0,
|
|
119,
|
|
101,
|
|
105,
|
|
103,
|
|
104,
|
|
116,
|
|
0,
|
|
5,
|
|
93,
|
|
36,
|
|
33,
|
|
23,
|
|
12,
|
|
0,
|
|
0,
|
|
7,
|
|
0,
|
|
0,
|
|
0,
|
|
1,
|
|
0,
|
|
0,
|
|
0,
|
|
5,
|
|
0,
|
|
0,
|
|
0,
|
|
60,
|
|
0,
|
|
0,
|
|
0,
|
|
35,
|
|
0,
|
|
0,
|
|
0,
|
|
51,
|
|
0,
|
|
0,
|
|
0,
|
|
45,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
145,
|
|
66,
|
|
36,
|
|
4,
|
|
144,
|
|
20,
|
|
14,
|
|
25,
|
|
38,
|
|
1
|
|
]));
|
|
}
|