-
Notifications
You must be signed in to change notification settings - Fork 81
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
2 changed files
with
89 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,89 @@ | ||
MARSHAL | ||
message: | ||
map_string_string: { | ||
key: "a" | ||
value: "value" | ||
} | ||
map_string_string: { | ||
key: "b" | ||
value: "value" | ||
} | ||
map_string_string: { | ||
key: "c" | ||
value: "value" | ||
} | ||
|
||
|
||
expected: | ||
00000000 aa 04 0a 0a 01 61 12 05 76 61 6c 75 65 aa 04 0a |.....a..value...| | ||
00000010 0a 01 62 12 05 76 61 6c 75 65 aa 04 0a 0a 01 63 |..b..value.....c| | ||
00000020 12 05 76 61 6c 75 65 |..value| | ||
|
||
|
||
got: | ||
00000000 aa 04 0a 0a 01 63 12 05 76 61 6c 75 65 aa 04 0a |.....c..value...| | ||
00000010 0a 01 62 12 05 76 61 6c 75 65 aa 04 0a 0a 01 61 |..b..value.....a| | ||
00000020 12 05 76 61 6c 75 65 |..value| | ||
|
||
|
||
golang: | ||
&conformance.TestAllTypesProto3{state:impl.MessageState{NoUnkeyedLiterals:pragma.NoUnkeyedLiterals{}, DoNotCompare:pragma.DoNotCompare{}, DoNotCopy:pragma.DoNotCopy{}, atomicMessageInfo:(*impl.MessageInfo)(0x14000116008)}, sizeCache:39, unknownFields:[]uint8(nil), OptionalInt32:0, OptionalInt64:0, OptionalUint32:0x0, OptionalUint64:0x0, OptionalSint32:0, OptionalSint64:0, OptionalFixed32:0x0, OptionalFixed64:0x0, OptionalSfixed32:0, OptionalSfixed64:0, OptionalFloat:0, OptionalDouble:0, OptionalBool:false, OptionalString:"", OptionalBytes:[]uint8(nil), OptionalNestedMessage:(*conformance.TestAllTypesProto3_NestedMessage)(nil), OptionalForeignMessage:(*conformance.ForeignMessage)(nil), OptionalNestedEnum:0, OptionalForeignEnum:0, OptionalAliasedEnum:0, OptionalStringPiece:"", OptionalCord:"", RecursiveMessage:(*conformance.TestAllTypesProto3)(nil), RepeatedInt32:[]int32(nil), RepeatedInt64:[]int64(nil), RepeatedUint32:[]uint32(nil), RepeatedUint64:[]uint64(nil), RepeatedSint32:[]int32(nil), RepeatedSint64:[]int64(nil), RepeatedFixed32:[]uint32(nil), RepeatedFixed64:[]uint64(nil), RepeatedSfixed32:[]int32(nil), RepeatedSfixed64:[]int64(nil), RepeatedFloat:[]float32(nil), RepeatedDouble:[]float64(nil), RepeatedBool:[]bool(nil), RepeatedString:[]string(nil), RepeatedBytes:[][]uint8(nil), RepeatedNestedMessage:[]*conformance.TestAllTypesProto3_NestedMessage(nil), RepeatedForeignMessage:[]*conformance.ForeignMessage(nil), RepeatedNestedEnum:[]conformance.TestAllTypesProto3_NestedEnum(nil), RepeatedForeignEnum:[]conformance.ForeignEnum(nil), RepeatedStringPiece:[]string(nil), RepeatedCord:[]string(nil), PackedInt32:[]int32(nil), PackedInt64:[]int64(nil), PackedUint32:[]uint32(nil), PackedUint64:[]uint64(nil), PackedSint32:[]int32(nil), PackedSint64:[]int64(nil), PackedFixed32:[]uint32(nil), PackedFixed64:[]uint64(nil), PackedSfixed32:[]int32(nil), PackedSfixed64:[]int64(nil), PackedFloat:[]float32(nil), PackedDouble:[]float64(nil), PackedBool:[]bool(nil), PackedNestedEnum:[]conformance.TestAllTypesProto3_NestedEnum(nil), UnpackedInt32:[]int32(nil), UnpackedInt64:[]int64(nil), UnpackedUint32:[]uint32(nil), UnpackedUint64:[]uint64(nil), UnpackedSint32:[]int32(nil), UnpackedSint64:[]int64(nil), UnpackedFixed32:[]uint32(nil), UnpackedFixed64:[]uint64(nil), UnpackedSfixed32:[]int32(nil), UnpackedSfixed64:[]int64(nil), UnpackedFloat:[]float32(nil), UnpackedDouble:[]float64(nil), UnpackedBool:[]bool(nil), UnpackedNestedEnum:[]conformance.TestAllTypesProto3_NestedEnum(nil), MapInt32Int32:map[int32]int32(nil), MapInt64Int64:map[int64]int64(nil), MapUint32Uint32:map[uint32]uint32(nil), MapUint64Uint64:map[uint64]uint64(nil), MapSint32Sint32:map[int32]int32(nil), MapSint64Sint64:map[int64]int64(nil), MapFixed32Fixed32:map[uint32]uint32(nil), MapFixed64Fixed64:map[uint64]uint64(nil), MapSfixed32Sfixed32:map[int32]int32(nil), MapSfixed64Sfixed64:map[int64]int64(nil), MapInt32Float:map[int32]float32(nil), MapInt32Double:map[int32]float64(nil), MapBoolBool:map[bool]bool(nil), MapStringString:map[string]string{"a":"value", "b":"value", "c":"value"}, MapStringBytes:map[string][]uint8(nil), MapStringNestedMessage:map[string]*conformance.TestAllTypesProto3_NestedMessage(nil), MapStringForeignMessage:map[string]*conformance.ForeignMessage(nil), MapStringNestedEnum:map[string]conformance.TestAllTypesProto3_NestedEnum(nil), MapStringForeignEnum:map[string]conformance.ForeignEnum(nil), OneofField:conformance.isTestAllTypesProto3_OneofField(nil), OptionalBoolWrapper:(*wrapperspb.BoolValue)(nil), OptionalInt32Wrapper:(*wrapperspb.Int32Value)(nil), OptionalInt64Wrapper:(*wrapperspb.Int64Value)(nil), OptionalUint32Wrapper:(*wrapperspb.UInt32Value)(nil), OptionalUint64Wrapper:(*wrapperspb.UInt64Value)(nil), OptionalFloatWrapper:(*wrapperspb.FloatValue)(nil), OptionalDoubleWrapper:(*wrapperspb.DoubleValue)(nil), OptionalStringWrapper:(*wrapperspb.StringValue)(nil), OptionalBytesWrapper:(*wrapperspb.BytesValue)(nil), RepeatedBoolWrapper:[]*wrapperspb.BoolValue(nil), RepeatedInt32Wrapper:[]*wrapperspb.Int32Value(nil), RepeatedInt64Wrapper:[]*wrapperspb.Int64Value(nil), RepeatedUint32Wrapper:[]*wrapperspb.UInt32Value(nil), RepeatedUint64Wrapper:[]*wrapperspb.UInt64Value(nil), RepeatedFloatWrapper:[]*wrapperspb.FloatValue(nil), RepeatedDoubleWrapper:[]*wrapperspb.DoubleValue(nil), RepeatedStringWrapper:[]*wrapperspb.StringValue(nil), RepeatedBytesWrapper:[]*wrapperspb.BytesValue(nil), OptionalDuration:(*durationpb.Duration)(nil), OptionalTimestamp:(*timestamppb.Timestamp)(nil), OptionalFieldMask:(*fieldmaskpb.FieldMask)(nil), OptionalStruct:(*structpb.Struct)(nil), OptionalAny:(*anypb.Any)(nil), OptionalValue:(*structpb.Value)(nil), OptionalNullValue:0, RepeatedDuration:[]*durationpb.Duration(nil), RepeatedTimestamp:[]*timestamppb.Timestamp(nil), RepeatedFieldmask:[]*fieldmaskpb.FieldMask(nil), RepeatedStruct:[]*structpb.Struct(nil), RepeatedAny:[]*anypb.Any(nil), RepeatedValue:[]*structpb.Value(nil), RepeatedListValue:[]*structpb.ListValue(nil), Fieldname1:0, FieldName2:0, XFieldName3:0, Field_Name4_:0, Field0Name5:0, Field_0Name6:0, FieldName7:0, FieldName8:0, Field_Name9:0, Field_Name10:0, FIELD_NAME11:0, FIELDName12:0, XFieldName13:0, X_FieldName14:0, Field_Name15:0, Field__Name16:0, FieldName17__:0, FieldName18__:0} | ||
|
||
============== | ||
|
||
MARSHAL | ||
message: | ||
map_int32_int32: { | ||
key: 1 | ||
value: 0 | ||
} | ||
map_int32_int32: { | ||
key: 2 | ||
value: 0 | ||
} | ||
map_int32_int32: { | ||
key: 3 | ||
value: 0 | ||
} | ||
|
||
|
||
expected: | ||
00000000 c2 03 04 08 01 10 00 c2 03 04 08 02 10 00 c2 03 |................| | ||
00000010 04 08 03 10 00 |.....| | ||
|
||
|
||
got: | ||
00000000 c2 03 04 08 01 10 00 c2 03 04 08 03 10 00 c2 03 |................| | ||
00000010 04 08 02 10 00 |.....| | ||
|
||
|
||
golang: | ||
&conformance.TestAllTypesProto3{state:impl.MessageState{NoUnkeyedLiterals:pragma.NoUnkeyedLiterals{}, DoNotCompare:pragma.DoNotCompare{}, DoNotCopy:pragma.DoNotCopy{}, atomicMessageInfo:(*impl.MessageInfo)(0x14000116008)}, sizeCache:21, unknownFields:[]uint8(nil), OptionalInt32:0, OptionalInt64:0, OptionalUint32:0x0, OptionalUint64:0x0, OptionalSint32:0, OptionalSint64:0, OptionalFixed32:0x0, OptionalFixed64:0x0, OptionalSfixed32:0, OptionalSfixed64:0, OptionalFloat:0, OptionalDouble:0, OptionalBool:false, OptionalString:"", OptionalBytes:[]uint8(nil), OptionalNestedMessage:(*conformance.TestAllTypesProto3_NestedMessage)(nil), OptionalForeignMessage:(*conformance.ForeignMessage)(nil), OptionalNestedEnum:0, OptionalForeignEnum:0, OptionalAliasedEnum:0, OptionalStringPiece:"", OptionalCord:"", RecursiveMessage:(*conformance.TestAllTypesProto3)(nil), RepeatedInt32:[]int32(nil), RepeatedInt64:[]int64(nil), RepeatedUint32:[]uint32(nil), RepeatedUint64:[]uint64(nil), RepeatedSint32:[]int32(nil), RepeatedSint64:[]int64(nil), RepeatedFixed32:[]uint32(nil), RepeatedFixed64:[]uint64(nil), RepeatedSfixed32:[]int32(nil), RepeatedSfixed64:[]int64(nil), RepeatedFloat:[]float32(nil), RepeatedDouble:[]float64(nil), RepeatedBool:[]bool(nil), RepeatedString:[]string(nil), RepeatedBytes:[][]uint8(nil), RepeatedNestedMessage:[]*conformance.TestAllTypesProto3_NestedMessage(nil), RepeatedForeignMessage:[]*conformance.ForeignMessage(nil), RepeatedNestedEnum:[]conformance.TestAllTypesProto3_NestedEnum(nil), RepeatedForeignEnum:[]conformance.ForeignEnum(nil), RepeatedStringPiece:[]string(nil), RepeatedCord:[]string(nil), PackedInt32:[]int32(nil), PackedInt64:[]int64(nil), PackedUint32:[]uint32(nil), PackedUint64:[]uint64(nil), PackedSint32:[]int32(nil), PackedSint64:[]int64(nil), PackedFixed32:[]uint32(nil), PackedFixed64:[]uint64(nil), PackedSfixed32:[]int32(nil), PackedSfixed64:[]int64(nil), PackedFloat:[]float32(nil), PackedDouble:[]float64(nil), PackedBool:[]bool(nil), PackedNestedEnum:[]conformance.TestAllTypesProto3_NestedEnum(nil), UnpackedInt32:[]int32(nil), UnpackedInt64:[]int64(nil), UnpackedUint32:[]uint32(nil), UnpackedUint64:[]uint64(nil), UnpackedSint32:[]int32(nil), UnpackedSint64:[]int64(nil), UnpackedFixed32:[]uint32(nil), UnpackedFixed64:[]uint64(nil), UnpackedSfixed32:[]int32(nil), UnpackedSfixed64:[]int64(nil), UnpackedFloat:[]float32(nil), UnpackedDouble:[]float64(nil), UnpackedBool:[]bool(nil), UnpackedNestedEnum:[]conformance.TestAllTypesProto3_NestedEnum(nil), MapInt32Int32:map[int32]int32{1:0, 2:0, 3:0}, MapInt64Int64:map[int64]int64(nil), MapUint32Uint32:map[uint32]uint32(nil), MapUint64Uint64:map[uint64]uint64(nil), MapSint32Sint32:map[int32]int32(nil), MapSint64Sint64:map[int64]int64(nil), MapFixed32Fixed32:map[uint32]uint32(nil), MapFixed64Fixed64:map[uint64]uint64(nil), MapSfixed32Sfixed32:map[int32]int32(nil), MapSfixed64Sfixed64:map[int64]int64(nil), MapInt32Float:map[int32]float32(nil), MapInt32Double:map[int32]float64(nil), MapBoolBool:map[bool]bool(nil), MapStringString:map[string]string(nil), MapStringBytes:map[string][]uint8(nil), MapStringNestedMessage:map[string]*conformance.TestAllTypesProto3_NestedMessage(nil), MapStringForeignMessage:map[string]*conformance.ForeignMessage(nil), MapStringNestedEnum:map[string]conformance.TestAllTypesProto3_NestedEnum(nil), MapStringForeignEnum:map[string]conformance.ForeignEnum(nil), OneofField:conformance.isTestAllTypesProto3_OneofField(nil), OptionalBoolWrapper:(*wrapperspb.BoolValue)(nil), OptionalInt32Wrapper:(*wrapperspb.Int32Value)(nil), OptionalInt64Wrapper:(*wrapperspb.Int64Value)(nil), OptionalUint32Wrapper:(*wrapperspb.UInt32Value)(nil), OptionalUint64Wrapper:(*wrapperspb.UInt64Value)(nil), OptionalFloatWrapper:(*wrapperspb.FloatValue)(nil), OptionalDoubleWrapper:(*wrapperspb.DoubleValue)(nil), OptionalStringWrapper:(*wrapperspb.StringValue)(nil), OptionalBytesWrapper:(*wrapperspb.BytesValue)(nil), RepeatedBoolWrapper:[]*wrapperspb.BoolValue(nil), RepeatedInt32Wrapper:[]*wrapperspb.Int32Value(nil), RepeatedInt64Wrapper:[]*wrapperspb.Int64Value(nil), RepeatedUint32Wrapper:[]*wrapperspb.UInt32Value(nil), RepeatedUint64Wrapper:[]*wrapperspb.UInt64Value(nil), RepeatedFloatWrapper:[]*wrapperspb.FloatValue(nil), RepeatedDoubleWrapper:[]*wrapperspb.DoubleValue(nil), RepeatedStringWrapper:[]*wrapperspb.StringValue(nil), RepeatedBytesWrapper:[]*wrapperspb.BytesValue(nil), OptionalDuration:(*durationpb.Duration)(nil), OptionalTimestamp:(*timestamppb.Timestamp)(nil), OptionalFieldMask:(*fieldmaskpb.FieldMask)(nil), OptionalStruct:(*structpb.Struct)(nil), OptionalAny:(*anypb.Any)(nil), OptionalValue:(*structpb.Value)(nil), OptionalNullValue:0, RepeatedDuration:[]*durationpb.Duration(nil), RepeatedTimestamp:[]*timestamppb.Timestamp(nil), RepeatedFieldmask:[]*fieldmaskpb.FieldMask(nil), RepeatedStruct:[]*structpb.Struct(nil), RepeatedAny:[]*anypb.Any(nil), RepeatedValue:[]*structpb.Value(nil), RepeatedListValue:[]*structpb.ListValue(nil), Fieldname1:0, FieldName2:0, XFieldName3:0, Field_Name4_:0, Field0Name5:0, Field_0Name6:0, FieldName7:0, FieldName8:0, Field_Name9:0, Field_Name10:0, FIELD_NAME11:0, FIELDName12:0, XFieldName13:0, X_FieldName14:0, Field_Name15:0, Field__Name16:0, FieldName17__:0, FieldName18__:0} | ||
|
||
============== | ||
|
||
MARSHAL | ||
message: | ||
map_bool_bool: { | ||
key: false | ||
value: false | ||
} | ||
map_bool_bool: { | ||
key: true | ||
value: false | ||
} | ||
|
||
|
||
expected: | ||
00000000 a2 04 04 08 00 10 00 a2 04 04 08 01 10 00 |..............| | ||
|
||
|
||
got: | ||
00000000 a2 04 04 08 01 10 00 a2 04 04 08 00 10 00 |..............| | ||
|
||
|
||
golang: | ||
&conformance.TestAllTypesProto3{state:impl.MessageState{NoUnkeyedLiterals:pragma.NoUnkeyedLiterals{}, DoNotCompare:pragma.DoNotCompare{}, DoNotCopy:pragma.DoNotCopy{}, atomicMessageInfo:(*impl.MessageInfo)(0x14000116008)}, sizeCache:14, unknownFields:[]uint8(nil), OptionalInt32:0, OptionalInt64:0, OptionalUint32:0x0, OptionalUint64:0x0, OptionalSint32:0, OptionalSint64:0, OptionalFixed32:0x0, OptionalFixed64:0x0, OptionalSfixed32:0, OptionalSfixed64:0, OptionalFloat:0, OptionalDouble:0, OptionalBool:false, OptionalString:"", OptionalBytes:[]uint8(nil), OptionalNestedMessage:(*conformance.TestAllTypesProto3_NestedMessage)(nil), OptionalForeignMessage:(*conformance.ForeignMessage)(nil), OptionalNestedEnum:0, OptionalForeignEnum:0, OptionalAliasedEnum:0, OptionalStringPiece:"", OptionalCord:"", RecursiveMessage:(*conformance.TestAllTypesProto3)(nil), RepeatedInt32:[]int32(nil), RepeatedInt64:[]int64(nil), RepeatedUint32:[]uint32(nil), RepeatedUint64:[]uint64(nil), RepeatedSint32:[]int32(nil), RepeatedSint64:[]int64(nil), RepeatedFixed32:[]uint32(nil), RepeatedFixed64:[]uint64(nil), RepeatedSfixed32:[]int32(nil), RepeatedSfixed64:[]int64(nil), RepeatedFloat:[]float32(nil), RepeatedDouble:[]float64(nil), RepeatedBool:[]bool(nil), RepeatedString:[]string(nil), RepeatedBytes:[][]uint8(nil), RepeatedNestedMessage:[]*conformance.TestAllTypesProto3_NestedMessage(nil), RepeatedForeignMessage:[]*conformance.ForeignMessage(nil), RepeatedNestedEnum:[]conformance.TestAllTypesProto3_NestedEnum(nil), RepeatedForeignEnum:[]conformance.ForeignEnum(nil), RepeatedStringPiece:[]string(nil), RepeatedCord:[]string(nil), PackedInt32:[]int32(nil), PackedInt64:[]int64(nil), PackedUint32:[]uint32(nil), PackedUint64:[]uint64(nil), PackedSint32:[]int32(nil), PackedSint64:[]int64(nil), PackedFixed32:[]uint32(nil), PackedFixed64:[]uint64(nil), PackedSfixed32:[]int32(nil), PackedSfixed64:[]int64(nil), PackedFloat:[]float32(nil), PackedDouble:[]float64(nil), PackedBool:[]bool(nil), PackedNestedEnum:[]conformance.TestAllTypesProto3_NestedEnum(nil), UnpackedInt32:[]int32(nil), UnpackedInt64:[]int64(nil), UnpackedUint32:[]uint32(nil), UnpackedUint64:[]uint64(nil), UnpackedSint32:[]int32(nil), UnpackedSint64:[]int64(nil), UnpackedFixed32:[]uint32(nil), UnpackedFixed64:[]uint64(nil), UnpackedSfixed32:[]int32(nil), UnpackedSfixed64:[]int64(nil), UnpackedFloat:[]float32(nil), UnpackedDouble:[]float64(nil), UnpackedBool:[]bool(nil), UnpackedNestedEnum:[]conformance.TestAllTypesProto3_NestedEnum(nil), MapInt32Int32:map[int32]int32(nil), MapInt64Int64:map[int64]int64(nil), MapUint32Uint32:map[uint32]uint32(nil), MapUint64Uint64:map[uint64]uint64(nil), MapSint32Sint32:map[int32]int32(nil), MapSint64Sint64:map[int64]int64(nil), MapFixed32Fixed32:map[uint32]uint32(nil), MapFixed64Fixed64:map[uint64]uint64(nil), MapSfixed32Sfixed32:map[int32]int32(nil), MapSfixed64Sfixed64:map[int64]int64(nil), MapInt32Float:map[int32]float32(nil), MapInt32Double:map[int32]float64(nil), MapBoolBool:map[bool]bool{false:false, true:false}, MapStringString:map[string]string(nil), MapStringBytes:map[string][]uint8(nil), MapStringNestedMessage:map[string]*conformance.TestAllTypesProto3_NestedMessage(nil), MapStringForeignMessage:map[string]*conformance.ForeignMessage(nil), MapStringNestedEnum:map[string]conformance.TestAllTypesProto3_NestedEnum(nil), MapStringForeignEnum:map[string]conformance.ForeignEnum(nil), OneofField:conformance.isTestAllTypesProto3_OneofField(nil), OptionalBoolWrapper:(*wrapperspb.BoolValue)(nil), OptionalInt32Wrapper:(*wrapperspb.Int32Value)(nil), OptionalInt64Wrapper:(*wrapperspb.Int64Value)(nil), OptionalUint32Wrapper:(*wrapperspb.UInt32Value)(nil), OptionalUint64Wrapper:(*wrapperspb.UInt64Value)(nil), OptionalFloatWrapper:(*wrapperspb.FloatValue)(nil), OptionalDoubleWrapper:(*wrapperspb.DoubleValue)(nil), OptionalStringWrapper:(*wrapperspb.StringValue)(nil), OptionalBytesWrapper:(*wrapperspb.BytesValue)(nil), RepeatedBoolWrapper:[]*wrapperspb.BoolValue(nil), RepeatedInt32Wrapper:[]*wrapperspb.Int32Value(nil), RepeatedInt64Wrapper:[]*wrapperspb.Int64Value(nil), RepeatedUint32Wrapper:[]*wrapperspb.UInt32Value(nil), RepeatedUint64Wrapper:[]*wrapperspb.UInt64Value(nil), RepeatedFloatWrapper:[]*wrapperspb.FloatValue(nil), RepeatedDoubleWrapper:[]*wrapperspb.DoubleValue(nil), RepeatedStringWrapper:[]*wrapperspb.StringValue(nil), RepeatedBytesWrapper:[]*wrapperspb.BytesValue(nil), OptionalDuration:(*durationpb.Duration)(nil), OptionalTimestamp:(*timestamppb.Timestamp)(nil), OptionalFieldMask:(*fieldmaskpb.FieldMask)(nil), OptionalStruct:(*structpb.Struct)(nil), OptionalAny:(*anypb.Any)(nil), OptionalValue:(*structpb.Value)(nil), OptionalNullValue:0, RepeatedDuration:[]*durationpb.Duration(nil), RepeatedTimestamp:[]*timestamppb.Timestamp(nil), RepeatedFieldmask:[]*fieldmaskpb.FieldMask(nil), RepeatedStruct:[]*structpb.Struct(nil), RepeatedAny:[]*anypb.Any(nil), RepeatedValue:[]*structpb.Value(nil), RepeatedListValue:[]*structpb.ListValue(nil), Fieldname1:0, FieldName2:0, XFieldName3:0, Field_Name4_:0, Field0Name5:0, Field_0Name6:0, FieldName7:0, FieldName8:0, Field_Name9:0, Field_Name10:0, FIELD_NAME11:0, FIELDName12:0, XFieldName13:0, X_FieldName14:0, Field_Name15:0, Field__Name16:0, FieldName17__:0, FieldName18__:0} | ||
|
||
============== | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters