bweng commited on
Commit
2f7d5b4
·
verified ·
1 Parent(s): 40c18c2

RNNTJoin with masking

Browse files
RNNTJoint.mlmodelc/analytics/coremldata.bin CHANGED
@@ -1,3 +1,3 @@
1
  version https://git-lfs.github.com/spec/v1
2
- oid sha256:6123e6464c990b52c62d86bd580a11c746cfcb5a01ae51b9ecbe92cfcef68852
3
  size 243
 
1
  version https://git-lfs.github.com/spec/v1
2
+ oid sha256:8e2e71a7aa301d6b972a3a7a4e158f9f6f55161ec0444cb9f55dc633149de40a
3
  size 243
RNNTJoint.mlmodelc/coremldata.bin CHANGED
@@ -1,3 +1,3 @@
1
  version https://git-lfs.github.com/spec/v1
2
- oid sha256:8f1dc6e96c2f63c8636f5a09968abd2bff0ded029e5a205886c10228421a029b
3
- size 394
 
1
  version https://git-lfs.github.com/spec/v1
2
+ oid sha256:77d35499e836cd5226a494eae0fd69d4dd92df161dd50f3c486d6947f5301a5d
3
+ size 436
RNNTJoint.mlmodelc/metadata.json ADDED
@@ -0,0 +1,100 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "metadataOutputVersion" : "3.0",
4
+ "storagePrecision" : "Float16",
5
+ "outputSchema" : [
6
+ {
7
+ "hasShapeFlexibility" : "0",
8
+ "isOptional" : "0",
9
+ "dataType" : "Float32",
10
+ "formattedType" : "MultiArray (Float32)",
11
+ "shortDescription" : "",
12
+ "shape" : "[]",
13
+ "name" : "logits",
14
+ "type" : "MultiArray"
15
+ }
16
+ ],
17
+ "modelParameters" : [
18
+
19
+ ],
20
+ "specificationVersion" : 6,
21
+ "mlProgramOperationTypeHistogram" : {
22
+ "Log" : 1,
23
+ "Concat" : 1,
24
+ "Linear" : 3,
25
+ "Range1d" : 1,
26
+ "Shape" : 2,
27
+ "RealDiv" : 1,
28
+ "Relu" : 1,
29
+ "Mul" : 1,
30
+ "Cast" : 4,
31
+ "Tile" : 1,
32
+ "Add" : 1,
33
+ "ExpandDims" : 5,
34
+ "Softmax" : 1,
35
+ "Gather" : 2,
36
+ "Less" : 1
37
+ },
38
+ "computePrecision" : "Mixed (Float16, Float32, Int32)",
39
+ "isUpdatable" : "0",
40
+ "stateSchema" : [
41
+
42
+ ],
43
+ "availability" : {
44
+ "macOS" : "12.0",
45
+ "tvOS" : "15.0",
46
+ "visionOS" : "1.0",
47
+ "watchOS" : "8.0",
48
+ "iOS" : "15.0",
49
+ "macCatalyst" : "15.0"
50
+ },
51
+ "modelType" : {
52
+ "name" : "MLModelType_mlProgram"
53
+ },
54
+ "userDefinedMetadata" : {
55
+ "com.github.apple.coremltools.source_dialect" : "TorchScript",
56
+ "com.github.apple.coremltools.source" : "torch==2.5.0",
57
+ "com.github.apple.coremltools.version" : "8.3.0"
58
+ },
59
+ "inputSchema" : [
60
+ {
61
+ "dataType" : "Float32",
62
+ "hasShapeFlexibility" : "1",
63
+ "isOptional" : "0",
64
+ "shapeFlexibility" : "1...100 × 1...1025 × 1024",
65
+ "shapeRange" : "[[1, 100], [1, 1025], [1024, 1024]]",
66
+ "formattedType" : "MultiArray (Float32 1 × 1 × 1024)",
67
+ "type" : "MultiArray",
68
+ "shape" : "[1, 1, 1024]",
69
+ "name" : "encoder_outputs",
70
+ "shortDescription" : ""
71
+ },
72
+ {
73
+ "dataType" : "Float32",
74
+ "hasShapeFlexibility" : "1",
75
+ "isOptional" : "0",
76
+ "shapeFlexibility" : "1...100 × 1...1025 × 640",
77
+ "shapeRange" : "[[1, 100], [1, 1025], [640, 640]]",
78
+ "formattedType" : "MultiArray (Float32 1 × 1 × 640)",
79
+ "type" : "MultiArray",
80
+ "shape" : "[1, 1, 640]",
81
+ "name" : "decoder_outputs",
82
+ "shortDescription" : ""
83
+ },
84
+ {
85
+ "dataType" : "Int32",
86
+ "hasShapeFlexibility" : "1",
87
+ "isOptional" : "0",
88
+ "shapeFlexibility" : "1...100",
89
+ "shapeRange" : "[[1, 100]]",
90
+ "formattedType" : "MultiArray (Int32 1)",
91
+ "type" : "MultiArray",
92
+ "shape" : "[1]",
93
+ "name" : "encoder_length",
94
+ "shortDescription" : ""
95
+ }
96
+ ],
97
+ "generatedClassName" : "RNNTJointWithMask",
98
+ "method" : "predict"
99
+ }
100
+ ]
RNNTJoint.mlmodelc/model.mil CHANGED
@@ -1,31 +1,57 @@
1
  program(1.0)
2
- [buildInfo = dict<tensor<string, []>, tensor<string, []>>({{"coremlc-component-MIL", "3405.2.1"}, {"coremlc-version", "3405.2.1"}, {"coremltools-component-torch", "2.5.0"}, {"coremltools-source-dialect", "TorchScript"}, {"coremltools-version", "8.3.0"}})]
3
  {
4
- func main<ios15>(tensor<fp32, [?, ?, ?]> decoder_outputs, tensor<fp32, [?, ?, ?]> encoder_outputs) [FlexibleShapeInformation = tuple<tuple<tensor<string, []>, dict<tensor<string, []>, tensor<int32, [?]>>>, tuple<tensor<string, []>, dict<tensor<string, []>, list<tensor<int32, [2]>, ?>>>>((("DefaultShapes", {{"decoder_outputs", [1, 1, 1]}, {"encoder_outputs", [1, 1, 1]}}), ("RangeDims", {{"decoder_outputs", [[1, 100], [1, 1025], [1, 640]]}, {"encoder_outputs", [[1, 100], [1, 1025], [1, 1024]]}})))] {
5
  tensor<string, []> encoder_outputs_to_fp16_dtype_0 = const()[name = tensor<string, []>("encoder_outputs_to_fp16_dtype_0"), val = tensor<string, []>("fp16")];
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6
  tensor<fp16, [640, 1024]> joint_enc_weight_to_fp16 = const()[name = tensor<string, []>("joint_enc_weight_to_fp16"), val = tensor<fp16, [640, 1024]>(BLOBFILE(path = tensor<string, []>("@model_path/weights/weight.bin"), offset = tensor<uint64, []>(64)))];
7
  tensor<fp16, [640]> joint_enc_bias_to_fp16 = const()[name = tensor<string, []>("joint_enc_bias_to_fp16"), val = tensor<fp16, [640]>(BLOBFILE(path = tensor<string, []>("@model_path/weights/weight.bin"), offset = tensor<uint64, []>(1310848)))];
8
- tensor<fp16, [?, ?, ?]> encoder_outputs_to_fp16 = cast(dtype = encoder_outputs_to_fp16_dtype_0, x = encoder_outputs)[name = tensor<string, []>("cast_2")];
9
- tensor<fp16, [?, ?, 640]> linear_0_cast_fp16 = linear(bias = joint_enc_bias_to_fp16, weight = joint_enc_weight_to_fp16, x = encoder_outputs_to_fp16)[name = tensor<string, []>("linear_0_cast_fp16")];
10
  tensor<string, []> decoder_outputs_to_fp16_dtype_0 = const()[name = tensor<string, []>("decoder_outputs_to_fp16_dtype_0"), val = tensor<string, []>("fp16")];
11
  tensor<fp16, [640, 640]> joint_pred_weight_to_fp16 = const()[name = tensor<string, []>("joint_pred_weight_to_fp16"), val = tensor<fp16, [640, 640]>(BLOBFILE(path = tensor<string, []>("@model_path/weights/weight.bin"), offset = tensor<uint64, []>(1312192)))];
12
  tensor<fp16, [640]> joint_pred_bias_to_fp16 = const()[name = tensor<string, []>("joint_pred_bias_to_fp16"), val = tensor<fp16, [640]>(BLOBFILE(path = tensor<string, []>("@model_path/weights/weight.bin"), offset = tensor<uint64, []>(2131456)))];
13
- tensor<fp16, [?, ?, ?]> decoder_outputs_to_fp16 = cast(dtype = decoder_outputs_to_fp16_dtype_0, x = decoder_outputs)[name = tensor<string, []>("cast_1")];
14
  tensor<fp16, [?, ?, 640]> linear_1_cast_fp16 = linear(bias = joint_pred_bias_to_fp16, weight = joint_pred_weight_to_fp16, x = decoder_outputs_to_fp16)[name = tensor<string, []>("linear_1_cast_fp16")];
15
  tensor<int32, [1]> f_axes_0 = const()[name = tensor<string, []>("f_axes_0"), val = tensor<int32, [1]>([2])];
16
  tensor<fp16, [?, ?, 1, 640]> f_cast_fp16 = expand_dims(axes = f_axes_0, x = linear_0_cast_fp16)[name = tensor<string, []>("f_cast_fp16")];
17
  tensor<int32, [1]> g_axes_0 = const()[name = tensor<string, []>("g_axes_0"), val = tensor<int32, [1]>([1])];
18
  tensor<fp16, [?, 1, ?, 640]> g_cast_fp16 = expand_dims(axes = g_axes_0, x = linear_1_cast_fp16)[name = tensor<string, []>("g_cast_fp16")];
19
- tensor<fp16, [?, ?, ?, 640]> input_1_cast_fp16 = add(x = f_cast_fp16, y = g_cast_fp16)[name = tensor<string, []>("input_1_cast_fp16")];
20
- tensor<fp16, [?, ?, ?, 640]> input_3_cast_fp16 = relu(x = input_1_cast_fp16)[name = tensor<string, []>("input_3_cast_fp16")];
21
  tensor<fp16, [8198, 640]> joint_joint_net_2_weight_to_fp16 = const()[name = tensor<string, []>("joint_joint_net_2_weight_to_fp16"), val = tensor<fp16, [8198, 640]>(BLOBFILE(path = tensor<string, []>("@model_path/weights/weight.bin"), offset = tensor<uint64, []>(2132800)))];
22
  tensor<fp16, [8198]> joint_joint_net_2_bias_to_fp16 = const()[name = tensor<string, []>("joint_joint_net_2_bias_to_fp16"), val = tensor<fp16, [8198]>(BLOBFILE(path = tensor<string, []>("@model_path/weights/weight.bin"), offset = tensor<uint64, []>(12626304)))];
23
- tensor<fp16, [?, ?, ?, 8198]> linear_2_cast_fp16 = linear(bias = joint_joint_net_2_bias_to_fp16, weight = joint_joint_net_2_weight_to_fp16, x = input_3_cast_fp16)[name = tensor<string, []>("linear_2_cast_fp16")];
24
- tensor<int32, []> var_29 = const()[name = tensor<string, []>("op_29"), val = tensor<int32, []>(-1)];
25
- tensor<fp16, [?, ?, ?, 8198]> var_31_softmax_cast_fp16 = softmax(axis = var_29, x = linear_2_cast_fp16)[name = tensor<string, []>("op_31_softmax_cast_fp16")];
26
- tensor<fp16, []> var_31_epsilon_0_to_fp16 = const()[name = tensor<string, []>("op_31_epsilon_0_to_fp16"), val = tensor<fp16, []>(0x0p+0)];
27
- tensor<fp16, [?, ?, ?, 8198]> var_31_cast_fp16 = log(epsilon = var_31_epsilon_0_to_fp16, x = var_31_softmax_cast_fp16)[name = tensor<string, []>("op_31_cast_fp16")];
28
- tensor<string, []> var_31_cast_fp16_to_fp32_dtype_0 = const()[name = tensor<string, []>("op_31_cast_fp16_to_fp32_dtype_0"), val = tensor<string, []>("fp32")];
29
- tensor<fp32, [?, ?, ?, 8198]> logits = cast(dtype = var_31_cast_fp16_to_fp32_dtype_0, x = var_31_cast_fp16)[name = tensor<string, []>("cast_0")];
30
  } -> (logits);
31
  }
 
1
  program(1.0)
2
+ [buildInfo = dict<tensor<string, []>, tensor<string, []>>({{"coremlc-component-MIL", "3405.2.1"}, {"coremlc-version", "3404.23.1"}, {"coremltools-component-torch", "2.5.0"}, {"coremltools-source-dialect", "TorchScript"}, {"coremltools-version", "8.3.0"}})]
3
  {
4
+ func main<ios15>(tensor<fp32, [?, ?, 640]> decoder_outputs, tensor<int32, [?]> encoder_length, tensor<fp32, [?, ?, 1024]> encoder_outputs) [FlexibleShapeInformation = tuple<tuple<tensor<string, []>, dict<tensor<string, []>, tensor<int32, [?]>>>, tuple<tensor<string, []>, dict<tensor<string, []>, list<tensor<int32, [2]>, ?>>>>((("DefaultShapes", {{"decoder_outputs", [1, 1, 640]}, {"encoder_length", [1]}, {"encoder_outputs", [1, 1, 1024]}}), ("RangeDims", {{"decoder_outputs", [[1, 100], [1, 1025], [640, 640]]}, {"encoder_length", [[1, 100]]}, {"encoder_outputs", [[1, 100], [1, 1025], [1024, 1024]]}})))] {
5
  tensor<string, []> encoder_outputs_to_fp16_dtype_0 = const()[name = tensor<string, []>("encoder_outputs_to_fp16_dtype_0"), val = tensor<string, []>("fp16")];
6
+ tensor<fp16, [?, ?, 1024]> encoder_outputs_to_fp16 = cast(dtype = encoder_outputs_to_fp16_dtype_0, x = encoder_outputs)[name = tensor<string, []>("cast_5")];
7
+ tensor<int32, [3]> var_11_shape_cast_fp16 = shape(x = encoder_outputs_to_fp16)[name = tensor<string, []>("op_11_shape_cast_fp16")];
8
+ tensor<int32, []> gather_0_indices_0 = const()[name = tensor<string, []>("gather_0_indices_0"), val = tensor<int32, []>(0)];
9
+ tensor<int32, []> gather_0_axis_0 = const()[name = tensor<string, []>("gather_0_axis_0"), val = tensor<int32, []>(0)];
10
+ tensor<int32, []> gather_0 = gather(axis = gather_0_axis_0, indices = gather_0_indices_0, x = var_11_shape_cast_fp16)[name = tensor<string, []>("gather_0")];
11
+ tensor<int32, []> gather_1_indices_0 = const()[name = tensor<string, []>("gather_1_indices_0"), val = tensor<int32, []>(1)];
12
+ tensor<int32, []> gather_1_axis_0 = const()[name = tensor<string, []>("gather_1_axis_0"), val = tensor<int32, []>(0)];
13
+ tensor<int32, []> gather_1 = gather(axis = gather_1_axis_0, indices = gather_1_indices_0, x = var_11_shape_cast_fp16)[name = tensor<string, []>("gather_1")];
14
+ tensor<int32, []> const_0 = const()[name = tensor<string, []>("const_0"), val = tensor<int32, []>(0)];
15
+ tensor<int32, []> const_1 = const()[name = tensor<string, []>("const_1"), val = tensor<int32, []>(1)];
16
+ tensor<int32, [?]> time_indices_1 = range_1d(end = gather_1, start = const_0, step = const_1)[name = tensor<string, []>("time_indices_1")];
17
+ tensor<int32, [1]> var_25_axes_0 = const()[name = tensor<string, []>("op_25_axes_0"), val = tensor<int32, [1]>([0])];
18
+ tensor<int32, [1, ?]> var_25 = expand_dims(axes = var_25_axes_0, x = time_indices_1)[name = tensor<string, []>("op_25")];
19
+ tensor<int32, []> concat_0_axis_0 = const()[name = tensor<string, []>("concat_0_axis_0"), val = tensor<int32, []>(0)];
20
+ tensor<bool, []> concat_0_interleave_0 = const()[name = tensor<string, []>("concat_0_interleave_0"), val = tensor<bool, []>(false)];
21
+ tensor<int32, [2]> concat_0 = concat(axis = concat_0_axis_0, interleave = concat_0_interleave_0, values = (gather_0, gather_1))[name = tensor<string, []>("concat_0")];
22
+ tensor<int32, [2]> shape_0 = shape(x = var_25)[name = tensor<string, []>("shape_0")];
23
+ tensor<int32, [2]> real_div_0 = real_div(x = concat_0, y = shape_0)[name = tensor<string, []>("real_div_0")];
24
+ tensor<int32, [?, ?]> time_indices = tile(reps = real_div_0, x = var_25)[name = tensor<string, []>("time_indices")];
25
+ tensor<int32, [1]> encoder_length_expanded_axes_0 = const()[name = tensor<string, []>("encoder_length_expanded_axes_0"), val = tensor<int32, [1]>([1])];
26
+ tensor<int32, [?, 1]> encoder_length_expanded = expand_dims(axes = encoder_length_expanded_axes_0, x = encoder_length)[name = tensor<string, []>("encoder_length_expanded")];
27
+ tensor<bool, [?, ?]> encoder_mask = less(x = time_indices, y = encoder_length_expanded)[name = tensor<string, []>("encoder_mask")];
28
+ tensor<int32, [1]> var_33_axes_0 = const()[name = tensor<string, []>("op_33_axes_0"), val = tensor<int32, [1]>([-1])];
29
+ tensor<bool, [?, ?, 1]> var_33 = expand_dims(axes = var_33_axes_0, x = encoder_mask)[name = tensor<string, []>("op_33")];
30
+ tensor<string, []> cast_1_to_fp16_dtype_0 = const()[name = tensor<string, []>("cast_1_to_fp16_dtype_0"), val = tensor<string, []>("fp16")];
31
+ tensor<fp16, [?, ?, 1]> var_33_to_fp16 = cast(dtype = cast_1_to_fp16_dtype_0, x = var_33)[name = tensor<string, []>("cast_4")];
32
+ tensor<fp16, [?, ?, 1024]> input_1_cast_fp16 = mul(x = encoder_outputs_to_fp16, y = var_33_to_fp16)[name = tensor<string, []>("input_1_cast_fp16")];
33
  tensor<fp16, [640, 1024]> joint_enc_weight_to_fp16 = const()[name = tensor<string, []>("joint_enc_weight_to_fp16"), val = tensor<fp16, [640, 1024]>(BLOBFILE(path = tensor<string, []>("@model_path/weights/weight.bin"), offset = tensor<uint64, []>(64)))];
34
  tensor<fp16, [640]> joint_enc_bias_to_fp16 = const()[name = tensor<string, []>("joint_enc_bias_to_fp16"), val = tensor<fp16, [640]>(BLOBFILE(path = tensor<string, []>("@model_path/weights/weight.bin"), offset = tensor<uint64, []>(1310848)))];
35
+ tensor<fp16, [?, ?, 640]> linear_0_cast_fp16 = linear(bias = joint_enc_bias_to_fp16, weight = joint_enc_weight_to_fp16, x = input_1_cast_fp16)[name = tensor<string, []>("linear_0_cast_fp16")];
 
36
  tensor<string, []> decoder_outputs_to_fp16_dtype_0 = const()[name = tensor<string, []>("decoder_outputs_to_fp16_dtype_0"), val = tensor<string, []>("fp16")];
37
  tensor<fp16, [640, 640]> joint_pred_weight_to_fp16 = const()[name = tensor<string, []>("joint_pred_weight_to_fp16"), val = tensor<fp16, [640, 640]>(BLOBFILE(path = tensor<string, []>("@model_path/weights/weight.bin"), offset = tensor<uint64, []>(1312192)))];
38
  tensor<fp16, [640]> joint_pred_bias_to_fp16 = const()[name = tensor<string, []>("joint_pred_bias_to_fp16"), val = tensor<fp16, [640]>(BLOBFILE(path = tensor<string, []>("@model_path/weights/weight.bin"), offset = tensor<uint64, []>(2131456)))];
39
+ tensor<fp16, [?, ?, 640]> decoder_outputs_to_fp16 = cast(dtype = decoder_outputs_to_fp16_dtype_0, x = decoder_outputs)[name = tensor<string, []>("cast_3")];
40
  tensor<fp16, [?, ?, 640]> linear_1_cast_fp16 = linear(bias = joint_pred_bias_to_fp16, weight = joint_pred_weight_to_fp16, x = decoder_outputs_to_fp16)[name = tensor<string, []>("linear_1_cast_fp16")];
41
  tensor<int32, [1]> f_axes_0 = const()[name = tensor<string, []>("f_axes_0"), val = tensor<int32, [1]>([2])];
42
  tensor<fp16, [?, ?, 1, 640]> f_cast_fp16 = expand_dims(axes = f_axes_0, x = linear_0_cast_fp16)[name = tensor<string, []>("f_cast_fp16")];
43
  tensor<int32, [1]> g_axes_0 = const()[name = tensor<string, []>("g_axes_0"), val = tensor<int32, [1]>([1])];
44
  tensor<fp16, [?, 1, ?, 640]> g_cast_fp16 = expand_dims(axes = g_axes_0, x = linear_1_cast_fp16)[name = tensor<string, []>("g_cast_fp16")];
45
+ tensor<fp16, [?, ?, ?, 640]> input_3_cast_fp16 = add(x = f_cast_fp16, y = g_cast_fp16)[name = tensor<string, []>("input_3_cast_fp16")];
46
+ tensor<fp16, [?, ?, ?, 640]> input_5_cast_fp16 = relu(x = input_3_cast_fp16)[name = tensor<string, []>("input_5_cast_fp16")];
47
  tensor<fp16, [8198, 640]> joint_joint_net_2_weight_to_fp16 = const()[name = tensor<string, []>("joint_joint_net_2_weight_to_fp16"), val = tensor<fp16, [8198, 640]>(BLOBFILE(path = tensor<string, []>("@model_path/weights/weight.bin"), offset = tensor<uint64, []>(2132800)))];
48
  tensor<fp16, [8198]> joint_joint_net_2_bias_to_fp16 = const()[name = tensor<string, []>("joint_joint_net_2_bias_to_fp16"), val = tensor<fp16, [8198]>(BLOBFILE(path = tensor<string, []>("@model_path/weights/weight.bin"), offset = tensor<uint64, []>(12626304)))];
49
+ tensor<fp16, [?, ?, ?, 8198]> linear_2_cast_fp16 = linear(bias = joint_joint_net_2_bias_to_fp16, weight = joint_joint_net_2_weight_to_fp16, x = input_5_cast_fp16)[name = tensor<string, []>("linear_2_cast_fp16")];
50
+ tensor<int32, []> var_60 = const()[name = tensor<string, []>("op_60"), val = tensor<int32, []>(-1)];
51
+ tensor<fp16, [?, ?, ?, 8198]> var_62_softmax_cast_fp16 = softmax(axis = var_60, x = linear_2_cast_fp16)[name = tensor<string, []>("op_62_softmax_cast_fp16")];
52
+ tensor<fp16, []> var_62_epsilon_0_to_fp16 = const()[name = tensor<string, []>("op_62_epsilon_0_to_fp16"), val = tensor<fp16, []>(0x0p+0)];
53
+ tensor<fp16, [?, ?, ?, 8198]> var_62_cast_fp16 = log(epsilon = var_62_epsilon_0_to_fp16, x = var_62_softmax_cast_fp16)[name = tensor<string, []>("op_62_cast_fp16")];
54
+ tensor<string, []> var_62_cast_fp16_to_fp32_dtype_0 = const()[name = tensor<string, []>("op_62_cast_fp16_to_fp32_dtype_0"), val = tensor<string, []>("fp32")];
55
+ tensor<fp32, [?, ?, ?, 8198]> logits = cast(dtype = var_62_cast_fp16_to_fp32_dtype_0, x = var_62_cast_fp16)[name = tensor<string, []>("cast_2")];
56
  } -> (logits);
57
  }